chore: automatic commit 2025-04-30 12:48

This commit is contained in:
2025-04-30 12:48:06 +02:00
parent f69356473b
commit e4ab1e1bb5
5284 changed files with 868438 additions and 0 deletions

View File

@@ -0,0 +1,79 @@
from wtforms import validators
from wtforms import widgets
from wtforms.fields.choices import RadioField
from wtforms.fields.choices import SelectField
from wtforms.fields.choices import SelectFieldBase
from wtforms.fields.choices import SelectMultipleField
from wtforms.fields.core import Field
from wtforms.fields.core import Flags
from wtforms.fields.core import Label
from wtforms.fields.datetime import DateField
from wtforms.fields.datetime import DateTimeField
from wtforms.fields.datetime import DateTimeLocalField
from wtforms.fields.datetime import MonthField
from wtforms.fields.datetime import TimeField
from wtforms.fields.datetime import WeekField
from wtforms.fields.form import FormField
from wtforms.fields.list import FieldList
from wtforms.fields.numeric import DecimalField
from wtforms.fields.numeric import DecimalRangeField
from wtforms.fields.numeric import FloatField
from wtforms.fields.numeric import IntegerField
from wtforms.fields.numeric import IntegerRangeField
from wtforms.fields.simple import BooleanField
from wtforms.fields.simple import ColorField
from wtforms.fields.simple import EmailField
from wtforms.fields.simple import FileField
from wtforms.fields.simple import HiddenField
from wtforms.fields.simple import MultipleFileField
from wtforms.fields.simple import PasswordField
from wtforms.fields.simple import SearchField
from wtforms.fields.simple import StringField
from wtforms.fields.simple import SubmitField
from wtforms.fields.simple import TelField
from wtforms.fields.simple import TextAreaField
from wtforms.fields.simple import URLField
from wtforms.form import Form
from wtforms.validators import ValidationError
__version__ = "3.2.1"
__all__ = [
"validators",
"widgets",
"Form",
"ValidationError",
"SelectField",
"SelectMultipleField",
"SelectFieldBase",
"RadioField",
"Field",
"Flags",
"Label",
"DateTimeField",
"DateField",
"TimeField",
"MonthField",
"DateTimeLocalField",
"WeekField",
"FormField",
"FieldList",
"IntegerField",
"DecimalField",
"FloatField",
"IntegerRangeField",
"DecimalRangeField",
"BooleanField",
"TextAreaField",
"PasswordField",
"FileField",
"MultipleFileField",
"HiddenField",
"SearchField",
"SubmitField",
"StringField",
"TelField",
"URLField",
"EmailField",
"ColorField",
]

View File

@@ -0,0 +1,96 @@
from wtforms.fields import HiddenField
from wtforms.validators import ValidationError
__all__ = ("CSRFTokenField", "CSRF")
class CSRFTokenField(HiddenField):
"""
A subclass of HiddenField designed for sending the CSRF token that is used
for most CSRF protection schemes.
Notably different from a normal field, this field always renders the
current token regardless of the submitted value, and also will not be
populated over to object data via populate_obj
"""
current_token = None
def __init__(self, *args, **kw):
self.csrf_impl = kw.pop("csrf_impl")
super().__init__(*args, **kw)
def _value(self):
"""
We want to always return the current token on render, regardless of
whether a good or bad token was passed.
"""
return self.current_token
def populate_obj(self, *args):
"""
Don't populate objects with the CSRF token
"""
pass
def pre_validate(self, form):
"""
Handle validation of this token field.
"""
self.csrf_impl.validate_csrf_token(form, self)
def process(self, *args, **kwargs):
super().process(*args, **kwargs)
self.current_token = self.csrf_impl.generate_csrf_token(self)
class CSRF:
field_class = CSRFTokenField
def setup_form(self, form):
"""
Receive the form we're attached to and set up fields.
The default implementation creates a single field of
type :attr:`field_class` with name taken from the
``csrf_field_name`` of the class meta.
:param form:
The form instance we're attaching to.
:return:
A sequence of `(field_name, unbound_field)` 2-tuples which
are unbound fields to be added to the form.
"""
meta = form.meta
field_name = meta.csrf_field_name
unbound_field = self.field_class(label="CSRF Token", csrf_impl=self)
return [(field_name, unbound_field)]
def generate_csrf_token(self, csrf_token_field):
"""
Implementations must override this to provide a method with which one
can get a CSRF token for this form.
A CSRF token is usually a string that is generated deterministically
based on some sort of user data, though it can be anything which you
can validate on a subsequent request.
:param csrf_token_field:
The field which is being used for CSRF.
:return:
A generated CSRF string.
"""
raise NotImplementedError()
def validate_csrf_token(self, form, field):
"""
Override this method to provide custom CSRF validation logic.
The default CSRF validation logic simply checks if the recently
generated token equals the one we received as formdata.
:param form: The form which has this CSRF token.
:param field: The CSRF token field.
"""
if field.current_token != field.data:
raise ValidationError(field.gettext("Invalid CSRF Token."))

View File

@@ -0,0 +1,93 @@
"""
A provided CSRF implementation which puts CSRF data in a session.
This can be used fairly comfortably with many `request.session` type
objects, including the Werkzeug/Flask session store, Django sessions, and
potentially other similar objects which use a dict-like API for storing
session keys.
The basic concept is a randomly generated value is stored in the user's
session, and an hmac-sha1 of it (along with an optional expiration time,
for extra security) is used as the value of the csrf_token. If this token
validates with the hmac of the random value + expiration time, and the
expiration time is not passed, the CSRF validation will pass.
"""
import hmac
import os
from datetime import datetime
from datetime import timedelta
from hashlib import sha1
from ..validators import ValidationError
from .core import CSRF
__all__ = ("SessionCSRF",)
class SessionCSRF(CSRF):
TIME_FORMAT = "%Y%m%d%H%M%S"
def setup_form(self, form):
self.form_meta = form.meta
return super().setup_form(form)
def generate_csrf_token(self, csrf_token_field):
meta = self.form_meta
if meta.csrf_secret is None:
raise Exception(
"must set `csrf_secret` on class Meta for SessionCSRF to work"
)
if meta.csrf_context is None:
raise TypeError("Must provide a session-like object as csrf context")
session = self.session
if "csrf" not in session:
session["csrf"] = sha1(os.urandom(64)).hexdigest()
if self.time_limit:
expires = (self.now() + self.time_limit).strftime(self.TIME_FORMAT)
csrf_build = "{}{}".format(session["csrf"], expires)
else:
expires = ""
csrf_build = session["csrf"]
hmac_csrf = hmac.new(
meta.csrf_secret, csrf_build.encode("utf8"), digestmod=sha1
)
return f"{expires}##{hmac_csrf.hexdigest()}"
def validate_csrf_token(self, form, field):
meta = self.form_meta
if not field.data or "##" not in field.data:
raise ValidationError(field.gettext("CSRF token missing."))
expires, hmac_csrf = field.data.split("##", 1)
check_val = (self.session["csrf"] + expires).encode("utf8")
hmac_compare = hmac.new(meta.csrf_secret, check_val, digestmod=sha1)
if hmac_compare.hexdigest() != hmac_csrf:
raise ValidationError(field.gettext("CSRF failed."))
if self.time_limit:
now_formatted = self.now().strftime(self.TIME_FORMAT)
if now_formatted > expires:
raise ValidationError(field.gettext("CSRF token expired."))
def now(self):
"""
Get the current time. Used for test mocking/overriding mainly.
"""
return datetime.now()
@property
def time_limit(self):
return getattr(self.form_meta, "csrf_time_limit", timedelta(minutes=30))
@property
def session(self):
return getattr(
self.form_meta.csrf_context, "session", self.form_meta.csrf_context
)

View File

@@ -0,0 +1,71 @@
from wtforms.fields.choices import RadioField
from wtforms.fields.choices import SelectField
from wtforms.fields.choices import SelectFieldBase
from wtforms.fields.choices import SelectMultipleField
from wtforms.fields.core import Field
from wtforms.fields.core import Flags
from wtforms.fields.core import Label
from wtforms.fields.datetime import DateField
from wtforms.fields.datetime import DateTimeField
from wtforms.fields.datetime import DateTimeLocalField
from wtforms.fields.datetime import MonthField
from wtforms.fields.datetime import TimeField
from wtforms.fields.datetime import WeekField
from wtforms.fields.form import FormField
from wtforms.fields.list import FieldList
from wtforms.fields.numeric import DecimalField
from wtforms.fields.numeric import DecimalRangeField
from wtforms.fields.numeric import FloatField
from wtforms.fields.numeric import IntegerField
from wtforms.fields.numeric import IntegerRangeField
from wtforms.fields.simple import BooleanField
from wtforms.fields.simple import ColorField
from wtforms.fields.simple import EmailField
from wtforms.fields.simple import FileField
from wtforms.fields.simple import HiddenField
from wtforms.fields.simple import MultipleFileField
from wtforms.fields.simple import PasswordField
from wtforms.fields.simple import SearchField
from wtforms.fields.simple import StringField
from wtforms.fields.simple import SubmitField
from wtforms.fields.simple import TelField
from wtforms.fields.simple import TextAreaField
from wtforms.fields.simple import URLField
from wtforms.utils import unset_value as _unset_value
__all__ = [
"Field",
"Flags",
"Label",
"SelectField",
"SelectMultipleField",
"SelectFieldBase",
"RadioField",
"DateTimeField",
"DateField",
"TimeField",
"MonthField",
"DateTimeLocalField",
"WeekField",
"FormField",
"IntegerField",
"DecimalField",
"FloatField",
"IntegerRangeField",
"DecimalRangeField",
"BooleanField",
"TextAreaField",
"PasswordField",
"FileField",
"MultipleFileField",
"HiddenField",
"SearchField",
"SubmitField",
"StringField",
"TelField",
"URLField",
"EmailField",
"ColorField",
"FieldList",
"_unset_value",
]

View File

@@ -0,0 +1,229 @@
import itertools
from wtforms import widgets
from wtforms.fields.core import Field
from wtforms.validators import ValidationError
__all__ = (
"SelectField",
"SelectMultipleField",
"RadioField",
)
class SelectFieldBase(Field):
option_widget = widgets.Option()
"""
Base class for fields which can be iterated to produce options.
This isn't a field, but an abstract base class for fields which want to
provide this functionality.
"""
def __init__(self, label=None, validators=None, option_widget=None, **kwargs):
super().__init__(label, validators, **kwargs)
if option_widget is not None:
self.option_widget = option_widget
def iter_choices(self):
"""
Provides data for choice widget rendering. Must return a sequence or
iterable of (value, label, selected, render_kw) tuples.
"""
raise NotImplementedError()
def has_groups(self):
return False
def iter_groups(self):
raise NotImplementedError()
def __iter__(self):
opts = dict(
widget=self.option_widget,
validators=self.validators,
name=self.name,
render_kw=self.render_kw,
_form=None,
_meta=self.meta,
)
for i, choice in enumerate(self.iter_choices()):
if len(choice) == 4:
value, label, checked, render_kw = choice
else:
value, label, checked = choice
render_kw = {}
opt = self._Option(
label=label, id="%s-%d" % (self.id, i), **opts, **render_kw
)
opt.process(None, value)
opt.checked = checked
yield opt
class _Option(Field):
checked = False
def _value(self):
return str(self.data)
class SelectField(SelectFieldBase):
widget = widgets.Select()
def __init__(
self,
label=None,
validators=None,
coerce=str,
choices=None,
validate_choice=True,
**kwargs,
):
super().__init__(label, validators, **kwargs)
self.coerce = coerce
if callable(choices):
choices = choices()
if choices is not None:
self.choices = choices if isinstance(choices, dict) else list(choices)
else:
self.choices = None
self.validate_choice = validate_choice
def iter_choices(self):
if not self.choices:
choices = []
elif isinstance(self.choices, dict):
choices = list(itertools.chain.from_iterable(self.choices.values()))
else:
choices = self.choices
return self._choices_generator(choices)
def has_groups(self):
return isinstance(self.choices, dict)
def iter_groups(self):
if isinstance(self.choices, dict):
for label, choices in self.choices.items():
yield (label, self._choices_generator(choices))
def _choices_generator(self, choices):
if not choices:
_choices = []
elif isinstance(choices[0], (list, tuple)):
_choices = choices
else:
_choices = zip(choices, choices)
for value, label, *other_args in _choices:
selected = self.coerce(value) == self.data
render_kw = other_args[0] if len(other_args) else {}
yield (value, label, selected, render_kw)
def process_data(self, value):
try:
# If value is None, don't coerce to a value
self.data = self.coerce(value) if value is not None else None
except (ValueError, TypeError):
self.data = None
def process_formdata(self, valuelist):
if not valuelist:
return
try:
self.data = self.coerce(valuelist[0])
except ValueError as exc:
raise ValueError(self.gettext("Invalid Choice: could not coerce.")) from exc
def pre_validate(self, form):
if not self.validate_choice:
return
if self.choices is None:
raise TypeError(self.gettext("Choices cannot be None."))
for _, _, match, *_ in self.iter_choices():
if match:
break
else:
raise ValidationError(self.gettext("Not a valid choice."))
class SelectMultipleField(SelectField):
"""
No different from a normal select field, except this one can take (and
validate) multiple choices. You'll need to specify the HTML `size`
attribute to the select field when rendering.
"""
widget = widgets.Select(multiple=True)
def _choices_generator(self, choices):
if not choices:
_choices = []
elif isinstance(choices[0], (list, tuple)):
_choices = choices
else:
_choices = zip(choices, choices)
for value, label, *other_args in _choices:
selected = self.data is not None and self.coerce(value) in self.data
render_kw = other_args[0] if len(other_args) else {}
yield (value, label, selected, render_kw)
def process_data(self, value):
try:
self.data = list(self.coerce(v) for v in value)
except (ValueError, TypeError):
self.data = None
def process_formdata(self, valuelist):
try:
self.data = list(self.coerce(x) for x in valuelist)
except ValueError as exc:
raise ValueError(
self.gettext(
"Invalid choice(s): one or more data inputs could not be coerced."
)
) from exc
def pre_validate(self, form):
if not self.validate_choice or not self.data:
return
if self.choices is None:
raise TypeError(self.gettext("Choices cannot be None."))
acceptable = [self.coerce(choice[0]) for choice in self.iter_choices()]
if any(data not in acceptable for data in self.data):
unacceptable = [
str(data) for data in set(self.data) if data not in acceptable
]
raise ValidationError(
self.ngettext(
"'%(value)s' is not a valid choice for this field.",
"'%(value)s' are not valid choices for this field.",
len(unacceptable),
)
% dict(value="', '".join(unacceptable))
)
class RadioField(SelectField):
"""
Like a SelectField, except displays a list of radio buttons.
Iterating the field will produce subfields (each containing a label as
well) in order to allow custom rendering of the individual radio fields.
"""
widget = widgets.ListWidget(prefix_label=False)
option_widget = widgets.RadioInput()

View File

@@ -0,0 +1,448 @@
import inspect
import itertools
from markupsafe import escape
from markupsafe import Markup
from wtforms import widgets
from wtforms.i18n import DummyTranslations
from wtforms.utils import unset_value
from wtforms.validators import StopValidation
from wtforms.validators import ValidationError
class Field:
"""
Field base class
"""
errors = tuple()
process_errors = tuple()
raw_data = None
validators = tuple()
widget = None
_formfield = True
_translations = DummyTranslations()
do_not_call_in_templates = True # Allow Django 1.4 traversal
def __new__(cls, *args, **kwargs):
if "_form" in kwargs:
return super().__new__(cls)
else:
return UnboundField(cls, *args, **kwargs)
def __init__(
self,
label=None,
validators=None,
filters=(),
description="",
id=None,
default=None,
widget=None,
render_kw=None,
name=None,
_form=None,
_prefix="",
_translations=None,
_meta=None,
):
"""
Construct a new field.
:param label:
The label of the field.
:param validators:
A sequence of validators to call when `validate` is called.
:param filters:
A sequence of callable which are run by :meth:`~Field.process`
to filter or transform the input data. For example
``StringForm(filters=[str.strip, str.upper])``.
Note that filters are applied after processing the default and
incoming data, but before validation.
:param description:
A description for the field, typically used for help text.
:param id:
An id to use for the field. A reasonable default is set by the form,
and you shouldn't need to set this manually.
:param default:
The default value to assign to the field, if no form or object
input is provided. May be a callable.
:param widget:
If provided, overrides the widget used to render the field.
:param dict render_kw:
If provided, a dictionary which provides default keywords that
will be given to the widget at render time.
:param name:
The HTML name of this field. The default value is the Python
attribute name.
:param _form:
The form holding this field. It is passed by the form itself during
construction. You should never pass this value yourself.
:param _prefix:
The prefix to prepend to the form name of this field, passed by
the enclosing form during construction.
:param _translations:
A translations object providing message translations. Usually
passed by the enclosing form during construction. See
:doc:`I18n docs <i18n>` for information on message translations.
:param _meta:
If provided, this is the 'meta' instance from the form. You usually
don't pass this yourself.
If `_form` isn't provided, an :class:`UnboundField` will be
returned instead. Call its :func:`bind` method with a form instance and
a name to construct the field.
"""
if _translations is not None:
self._translations = _translations
if _meta is not None:
self.meta = _meta
elif _form is not None:
self.meta = _form.meta
else:
raise TypeError("Must provide one of _form or _meta")
self.default = default
self.description = description
self.render_kw = render_kw
self.filters = filters
self.flags = Flags()
self.name = _prefix + name
self.short_name = name
self.type = type(self).__name__
self.check_validators(validators)
self.validators = validators or self.validators
self.id = id or self.name
self.label = Label(
self.id,
label
if label is not None
else self.gettext(name.replace("_", " ").title()),
)
if widget is not None:
self.widget = widget
for v in itertools.chain(self.validators, [self.widget]):
flags = getattr(v, "field_flags", {})
for k, v in flags.items():
setattr(self.flags, k, v)
def __str__(self):
"""
Returns a HTML representation of the field. For more powerful rendering,
see the `__call__` method.
"""
return self()
def __html__(self):
"""
Returns a HTML representation of the field. For more powerful rendering,
see the :meth:`__call__` method.
"""
return self()
def __call__(self, **kwargs):
"""
Render this field as HTML, using keyword args as additional attributes.
This delegates rendering to
:meth:`meta.render_field <wtforms.meta.DefaultMeta.render_field>`
whose default behavior is to call the field's widget, passing any
keyword arguments from this call along to the widget.
In all of the WTForms HTML widgets, keyword arguments are turned to
HTML attributes, though in theory a widget is free to do anything it
wants with the supplied keyword arguments, and widgets don't have to
even do anything related to HTML.
"""
return self.meta.render_field(self, kwargs)
@classmethod
def check_validators(cls, validators):
if validators is not None:
for validator in validators:
if not callable(validator):
raise TypeError(
f"{validator} is not a valid validator because it is not "
"callable"
)
if inspect.isclass(validator):
raise TypeError(
f"{validator} is not a valid validator because it is a class, "
"it should be an instance"
)
def gettext(self, string):
"""
Get a translation for the given message.
This proxies for the internal translations object.
:param string: A string to be translated.
:return: A string which is the translated output.
"""
return self._translations.gettext(string)
def ngettext(self, singular, plural, n):
"""
Get a translation for a message which can be pluralized.
:param str singular: The singular form of the message.
:param str plural: The plural form of the message.
:param int n: The number of elements this message is referring to
"""
return self._translations.ngettext(singular, plural, n)
def validate(self, form, extra_validators=()):
"""
Validates the field and returns True or False. `self.errors` will
contain any errors raised during validation. This is usually only
called by `Form.validate`.
Subfields shouldn't override this, but rather override either
`pre_validate`, `post_validate` or both, depending on needs.
:param form: The form the field belongs to.
:param extra_validators: A sequence of extra validators to run.
"""
self.errors = list(self.process_errors)
stop_validation = False
# Check the type of extra_validators
self.check_validators(extra_validators)
# Call pre_validate
try:
self.pre_validate(form)
except StopValidation as e:
if e.args and e.args[0]:
self.errors.append(e.args[0])
stop_validation = True
except ValidationError as e:
self.errors.append(e.args[0])
# Run validators
if not stop_validation:
chain = itertools.chain(self.validators, extra_validators)
stop_validation = self._run_validation_chain(form, chain)
# Call post_validate
try:
self.post_validate(form, stop_validation)
except ValidationError as e:
self.errors.append(e.args[0])
return len(self.errors) == 0
def _run_validation_chain(self, form, validators):
"""
Run a validation chain, stopping if any validator raises StopValidation.
:param form: The Form instance this field belongs to.
:param validators: a sequence or iterable of validator callables.
:return: True if validation was stopped, False otherwise.
"""
for validator in validators:
try:
validator(form, self)
except StopValidation as e:
if e.args and e.args[0]:
self.errors.append(e.args[0])
return True
except ValidationError as e:
self.errors.append(e.args[0])
return False
def pre_validate(self, form):
"""
Override if you need field-level validation. Runs before any other
validators.
:param form: The form the field belongs to.
"""
pass
def post_validate(self, form, validation_stopped):
"""
Override if you need to run any field-level validation tasks after
normal validation. This shouldn't be needed in most cases.
:param form: The form the field belongs to.
:param validation_stopped:
`True` if any validator raised StopValidation.
"""
pass
def process(self, formdata, data=unset_value, extra_filters=None):
"""
Process incoming data, calling process_data, process_formdata as needed,
and run filters.
If `data` is not provided, process_data will be called on the field's
default.
Field subclasses usually won't override this, instead overriding the
process_formdata and process_data methods. Only override this for
special advanced processing, such as when a field encapsulates many
inputs.
:param extra_filters: A sequence of extra filters to run.
"""
self.process_errors = []
if data is unset_value:
try:
data = self.default()
except TypeError:
data = self.default
self.object_data = data
try:
self.process_data(data)
except ValueError as e:
self.process_errors.append(e.args[0])
if formdata is not None:
if self.name in formdata:
self.raw_data = formdata.getlist(self.name)
else:
self.raw_data = []
try:
self.process_formdata(self.raw_data)
except ValueError as e:
self.process_errors.append(e.args[0])
try:
for filter in itertools.chain(self.filters, extra_filters or []):
self.data = filter(self.data)
except ValueError as e:
self.process_errors.append(e.args[0])
def process_data(self, value):
"""
Process the Python data applied to this field and store the result.
This will be called during form construction by the form's `kwargs` or
`obj` argument.
:param value: The python object containing the value to process.
"""
self.data = value
def process_formdata(self, valuelist):
"""
Process data received over the wire from a form.
This will be called during form construction with data supplied
through the `formdata` argument.
:param valuelist: A list of strings to process.
"""
if valuelist:
self.data = valuelist[0]
def populate_obj(self, obj, name):
"""
Populates `obj.<name>` with the field's data.
:note: This is a destructive operation. If `obj.<name>` already exists,
it will be overridden. Use with caution.
"""
setattr(obj, name, self.data)
class UnboundField:
_formfield = True
creation_counter = 0
def __init__(self, field_class, *args, name=None, **kwargs):
UnboundField.creation_counter += 1
self.field_class = field_class
self.args = args
self.name = name
self.kwargs = kwargs
self.creation_counter = UnboundField.creation_counter
validators = kwargs.get("validators")
if validators:
self.field_class.check_validators(validators)
def bind(self, form, name, prefix="", translations=None, **kwargs):
kw = dict(
self.kwargs,
name=name,
_form=form,
_prefix=prefix,
_translations=translations,
**kwargs,
)
return self.field_class(*self.args, **kw)
def __repr__(self):
return (
"<UnboundField("
f"{self.field_class.__name__}, {self.args!r}, {self.kwargs!r}"
")>"
)
class Flags:
"""
Holds a set of flags as attributes.
Accessing a non-existing attribute returns None for its value.
"""
def __getattr__(self, name):
if name.startswith("_"):
return super().__getattr__(name)
return None
def __contains__(self, name):
return getattr(self, name)
def __repr__(self):
flags = (
f"{name}={getattr(self, name)}"
for name in dir(self)
if not name.startswith("_")
)
flags = ", ".join(flags)
return f"<wtforms.fields.Flags: {{{flags}}}>"
class Label:
"""
An HTML form label.
"""
def __init__(self, field_id, text):
self.field_id = field_id
self.text = text
def __str__(self):
return self()
def __html__(self):
return self()
def __call__(self, text=None, **kwargs):
if "for_" in kwargs:
kwargs["for"] = kwargs.pop("for_")
else:
kwargs.setdefault("for", self.field_id)
attributes = widgets.html_params(**kwargs)
text = escape(text or self.text)
return Markup(f"<label {attributes}>{text}</label>")
def __repr__(self):
return f"Label({self.field_id!r}, {self.text!r})"

View File

@@ -0,0 +1,170 @@
import datetime
from wtforms import widgets
from wtforms.fields.core import Field
from wtforms.utils import clean_datetime_format_for_strptime
__all__ = (
"DateTimeField",
"DateField",
"TimeField",
"MonthField",
"DateTimeLocalField",
"WeekField",
)
class DateTimeField(Field):
"""
A text field which stores a :class:`datetime.datetime` matching one or
several formats. If ``format`` is a list, any input value matching any
format will be accepted, and the first format in the list will be used
to produce HTML values.
"""
widget = widgets.DateTimeInput()
def __init__(
self, label=None, validators=None, format="%Y-%m-%d %H:%M:%S", **kwargs
):
super().__init__(label, validators, **kwargs)
self.format = format if isinstance(format, list) else [format]
self.strptime_format = clean_datetime_format_for_strptime(self.format)
def _value(self):
if self.raw_data:
return " ".join(self.raw_data)
format = self.format[0]
return self.data and self.data.strftime(format) or ""
def process_formdata(self, valuelist):
if not valuelist:
return
date_str = " ".join(valuelist)
for format in self.strptime_format:
try:
self.data = datetime.datetime.strptime(date_str, format)
return
except ValueError:
self.data = None
raise ValueError(self.gettext("Not a valid datetime value."))
class DateField(DateTimeField):
"""
Same as :class:`~wtforms.fields.DateTimeField`, except stores a
:class:`datetime.date`.
"""
widget = widgets.DateInput()
def __init__(self, label=None, validators=None, format="%Y-%m-%d", **kwargs):
super().__init__(label, validators, format, **kwargs)
def process_formdata(self, valuelist):
if not valuelist:
return
date_str = " ".join(valuelist)
for format in self.strptime_format:
try:
self.data = datetime.datetime.strptime(date_str, format).date()
return
except ValueError:
self.data = None
raise ValueError(self.gettext("Not a valid date value."))
class TimeField(DateTimeField):
"""
Same as :class:`~wtforms.fields.DateTimeField`, except stores a
:class:`datetime.time`.
"""
widget = widgets.TimeInput()
def __init__(self, label=None, validators=None, format="%H:%M", **kwargs):
super().__init__(label, validators, format, **kwargs)
def process_formdata(self, valuelist):
if not valuelist:
return
time_str = " ".join(valuelist)
for format in self.strptime_format:
try:
self.data = datetime.datetime.strptime(time_str, format).time()
return
except ValueError:
self.data = None
raise ValueError(self.gettext("Not a valid time value."))
class MonthField(DateField):
"""
Same as :class:`~wtforms.fields.DateField`, except represents a month,
stores a :class:`datetime.date` with `day = 1`.
"""
widget = widgets.MonthInput()
def __init__(self, label=None, validators=None, format="%Y-%m", **kwargs):
super().__init__(label, validators, format, **kwargs)
class WeekField(DateField):
"""
Same as :class:`~wtforms.fields.DateField`, except represents a week,
stores a :class:`datetime.date` of the monday of the given week.
"""
widget = widgets.WeekInput()
def __init__(self, label=None, validators=None, format="%Y-W%W", **kwargs):
super().__init__(label, validators, format, **kwargs)
def process_formdata(self, valuelist):
if not valuelist:
return
time_str = " ".join(valuelist)
for format in self.strptime_format:
try:
if "%w" not in format:
# The '%w' week starting day is needed. This defaults it to monday
# like ISO 8601 indicates.
self.data = datetime.datetime.strptime(
f"{time_str}-1", f"{format}-%w"
).date()
else:
self.data = datetime.datetime.strptime(time_str, format).date()
return
except ValueError:
self.data = None
raise ValueError(self.gettext("Not a valid week value."))
class DateTimeLocalField(DateTimeField):
"""
Same as :class:`~wtforms.fields.DateTimeField`, but represents an
``<input type="datetime-local">``.
"""
widget = widgets.DateTimeLocalInput()
def __init__(self, *args, **kwargs):
kwargs.setdefault(
"format",
[
"%Y-%m-%d %H:%M:%S",
"%Y-%m-%dT%H:%M:%S",
"%Y-%m-%d %H:%M",
"%Y-%m-%dT%H:%M",
],
)
super().__init__(*args, **kwargs)

View File

@@ -0,0 +1,98 @@
from wtforms.utils import unset_value
from .. import widgets
from .core import Field
__all__ = ("FormField",)
class FormField(Field):
"""
Encapsulate a form as a field in another form.
:param form_class:
A subclass of Form that will be encapsulated.
:param separator:
A string which will be suffixed to this field's name to create the
prefix to enclosed fields. The default is fine for most uses.
"""
widget = widgets.TableWidget()
def __init__(
self, form_class, label=None, validators=None, separator="-", **kwargs
):
super().__init__(label, validators, **kwargs)
self.form_class = form_class
self.separator = separator
self._obj = None
if self.filters:
raise TypeError(
"FormField cannot take filters, as the encapsulated"
" data is not mutable."
)
if validators:
raise TypeError(
"FormField does not accept any validators. Instead,"
" define them on the enclosed form."
)
def process(self, formdata, data=unset_value, extra_filters=None):
if extra_filters:
raise TypeError(
"FormField cannot take filters, as the encapsulated"
"data is not mutable."
)
if data is unset_value:
try:
data = self.default()
except TypeError:
data = self.default
self._obj = data
self.object_data = data
prefix = self.name + self.separator
if isinstance(data, dict):
self.form = self.form_class(formdata=formdata, prefix=prefix, **data)
else:
self.form = self.form_class(formdata=formdata, obj=data, prefix=prefix)
def validate(self, form, extra_validators=()):
if extra_validators:
raise TypeError(
"FormField does not accept in-line validators, as it"
" gets errors from the enclosed form."
)
return self.form.validate()
def populate_obj(self, obj, name):
candidate = getattr(obj, name, None)
if candidate is None:
if self._obj is None:
raise TypeError(
"populate_obj: cannot find a value to populate from"
" the provided obj or input data/defaults"
)
candidate = self._obj
self.form.populate_obj(candidate)
setattr(obj, name, candidate)
def __iter__(self):
return iter(self.form)
def __getitem__(self, name):
return self.form[name]
def __getattr__(self, name):
return getattr(self.form, name)
@property
def data(self):
return self.form.data
@property
def errors(self):
return self.form.errors

View File

@@ -0,0 +1,202 @@
import itertools
from wtforms.utils import unset_value
from .. import widgets
from .core import Field
from .core import UnboundField
__all__ = ("FieldList",)
class FieldList(Field):
"""
Encapsulate an ordered list of multiple instances of the same field type,
keeping data as a list.
>>> authors = FieldList(StringField('Name', [validators.DataRequired()]))
:param unbound_field:
A partially-instantiated field definition, just like that would be
defined on a form directly.
:param min_entries:
if provided, always have at least this many entries on the field,
creating blank ones if the provided input does not specify a sufficient
amount.
:param max_entries:
accept no more than this many entries as input, even if more exist in
formdata.
:param separator:
A string which will be suffixed to this field's name to create the
prefix to enclosed list entries. The default is fine for most uses.
"""
widget = widgets.ListWidget()
def __init__(
self,
unbound_field,
label=None,
validators=None,
min_entries=0,
max_entries=None,
separator="-",
default=(),
**kwargs,
):
super().__init__(label, validators, default=default, **kwargs)
if self.filters:
raise TypeError(
"FieldList does not accept any filters. Instead, define"
" them on the enclosed field."
)
assert isinstance(
unbound_field, UnboundField
), "Field must be unbound, not a field class"
self.unbound_field = unbound_field
self.min_entries = min_entries
self.max_entries = max_entries
self.last_index = -1
self._prefix = kwargs.get("_prefix", "")
self._separator = separator
self._field_separator = unbound_field.kwargs.get("separator", "-")
def process(self, formdata, data=unset_value, extra_filters=None):
if extra_filters:
raise TypeError(
"FieldList does not accept any filters. Instead, define"
" them on the enclosed field."
)
self.entries = []
if data is unset_value or not data:
try:
data = self.default()
except TypeError:
data = self.default
self.object_data = data
if formdata:
indices = sorted(set(self._extract_indices(self.name, formdata)))
if self.max_entries:
indices = indices[: self.max_entries]
idata = iter(data)
for index in indices:
try:
obj_data = next(idata)
except StopIteration:
obj_data = unset_value
self._add_entry(formdata, obj_data, index=index)
else:
for obj_data in data:
self._add_entry(formdata, obj_data)
while len(self.entries) < self.min_entries:
self._add_entry(formdata)
def _extract_indices(self, prefix, formdata):
"""
Yield indices of any keys with given prefix.
formdata must be an object which will produce keys when iterated. For
example, if field 'foo' contains keys 'foo-0-bar', 'foo-1-baz', then
the numbers 0 and 1 will be yielded, but not necessarily in order.
"""
offset = len(prefix) + 1
for k in formdata:
if k.startswith(prefix):
k = k[offset:].split(self._field_separator, 1)[0]
if k.isdigit():
yield int(k)
def validate(self, form, extra_validators=()):
"""
Validate this FieldList.
Note that FieldList validation differs from normal field validation in
that FieldList validates all its enclosed fields first before running any
of its own validators.
"""
self.errors = []
# Run validators on all entries within
for subfield in self.entries:
subfield.validate(form)
self.errors.append(subfield.errors)
if not any(x for x in self.errors):
self.errors = []
chain = itertools.chain(self.validators, extra_validators)
self._run_validation_chain(form, chain)
return len(self.errors) == 0
def populate_obj(self, obj, name):
values = getattr(obj, name, None)
try:
ivalues = iter(values)
except TypeError:
ivalues = iter([])
candidates = itertools.chain(ivalues, itertools.repeat(None))
_fake = type("_fake", (object,), {})
output = []
for field, data in zip(self.entries, candidates):
fake_obj = _fake()
fake_obj.data = data
field.populate_obj(fake_obj, "data")
output.append(fake_obj.data)
setattr(obj, name, output)
def _add_entry(self, formdata=None, data=unset_value, index=None):
assert (
not self.max_entries or len(self.entries) < self.max_entries
), "You cannot have more than max_entries entries in this FieldList"
if index is None:
index = self.last_index + 1
self.last_index = index
name = f"{self.short_name}{self._separator}{index}"
id = f"{self.id}{self._separator}{index}"
field = self.unbound_field.bind(
form=None,
name=name,
prefix=self._prefix,
id=id,
_meta=self.meta,
translations=self._translations,
)
field.process(formdata, data)
self.entries.append(field)
return field
def append_entry(self, data=unset_value):
"""
Create a new entry with optional default data.
Entries added in this way will *not* receive formdata however, and can
only receive object data.
"""
return self._add_entry(data=data)
def pop_entry(self):
"""Removes the last entry from the list and returns it."""
entry = self.entries.pop()
self.last_index -= 1
return entry
def __iter__(self):
return iter(self.entries)
def __len__(self):
return len(self.entries)
def __getitem__(self, index):
return self.entries[index]
@property
def data(self):
return [f.data for f in self.entries]

View File

@@ -0,0 +1,213 @@
import decimal
from wtforms import widgets
from wtforms.fields.core import Field
from wtforms.utils import unset_value
__all__ = (
"IntegerField",
"DecimalField",
"FloatField",
"IntegerRangeField",
"DecimalRangeField",
)
class LocaleAwareNumberField(Field):
"""
Base class for implementing locale-aware number parsing.
Locale-aware numbers require the 'babel' package to be present.
"""
def __init__(
self,
label=None,
validators=None,
use_locale=False,
number_format=None,
**kwargs,
):
super().__init__(label, validators, **kwargs)
self.use_locale = use_locale
if use_locale:
self.number_format = number_format
self.locale = kwargs["_form"].meta.locales[0]
self._init_babel()
def _init_babel(self):
try:
from babel import numbers
self.babel_numbers = numbers
except ImportError as exc:
raise ImportError(
"Using locale-aware decimals requires the babel library."
) from exc
def _parse_decimal(self, value):
return self.babel_numbers.parse_decimal(value, self.locale)
def _format_decimal(self, value):
return self.babel_numbers.format_decimal(value, self.number_format, self.locale)
class IntegerField(Field):
"""
A text field, except all input is coerced to an integer. Erroneous input
is ignored and will not be accepted as a value.
"""
widget = widgets.NumberInput()
def __init__(self, label=None, validators=None, **kwargs):
super().__init__(label, validators, **kwargs)
def _value(self):
if self.raw_data:
return self.raw_data[0]
if self.data is not None:
return str(self.data)
return ""
def process_data(self, value):
if value is None or value is unset_value:
self.data = None
return
try:
self.data = int(value)
except (ValueError, TypeError) as exc:
self.data = None
raise ValueError(self.gettext("Not a valid integer value.")) from exc
def process_formdata(self, valuelist):
if not valuelist:
return
try:
self.data = int(valuelist[0])
except ValueError as exc:
self.data = None
raise ValueError(self.gettext("Not a valid integer value.")) from exc
class DecimalField(LocaleAwareNumberField):
"""
A text field which displays and coerces data of the `decimal.Decimal` type.
:param places:
How many decimal places to quantize the value to for display on form.
If unset, use 2 decimal places.
If explicitely set to `None`, does not quantize value.
:param rounding:
How to round the value during quantize, for example
`decimal.ROUND_UP`. If unset, uses the rounding value from the
current thread's context.
:param use_locale:
If True, use locale-based number formatting. Locale-based number
formatting requires the 'babel' package.
:param number_format:
Optional number format for locale. If omitted, use the default decimal
format for the locale.
"""
widget = widgets.NumberInput(step="any")
def __init__(
self, label=None, validators=None, places=unset_value, rounding=None, **kwargs
):
super().__init__(label, validators, **kwargs)
if self.use_locale and (places is not unset_value or rounding is not None):
raise TypeError(
"When using locale-aware numbers, 'places' and 'rounding' are ignored."
)
if places is unset_value:
places = 2
self.places = places
self.rounding = rounding
def _value(self):
if self.raw_data:
return self.raw_data[0]
if self.data is None:
return ""
if self.use_locale:
return str(self._format_decimal(self.data))
if self.places is None:
return str(self.data)
if not hasattr(self.data, "quantize"):
# If for some reason, data is a float or int, then format
# as we would for floats using string formatting.
format = "%%0.%df" % self.places
return format % self.data
exp = decimal.Decimal(".1") ** self.places
if self.rounding is None:
quantized = self.data.quantize(exp)
else:
quantized = self.data.quantize(exp, rounding=self.rounding)
return str(quantized)
def process_formdata(self, valuelist):
if not valuelist:
return
try:
if self.use_locale:
self.data = self._parse_decimal(valuelist[0])
else:
self.data = decimal.Decimal(valuelist[0])
except (decimal.InvalidOperation, ValueError) as exc:
self.data = None
raise ValueError(self.gettext("Not a valid decimal value.")) from exc
class FloatField(Field):
"""
A text field, except all input is coerced to an float. Erroneous input
is ignored and will not be accepted as a value.
"""
widget = widgets.TextInput()
def __init__(self, label=None, validators=None, **kwargs):
super().__init__(label, validators, **kwargs)
def _value(self):
if self.raw_data:
return self.raw_data[0]
if self.data is not None:
return str(self.data)
return ""
def process_formdata(self, valuelist):
if not valuelist:
return
try:
self.data = float(valuelist[0])
except ValueError as exc:
self.data = None
raise ValueError(self.gettext("Not a valid float value.")) from exc
class IntegerRangeField(IntegerField):
"""
Represents an ``<input type="range">``.
"""
widget = widgets.RangeInput()
class DecimalRangeField(DecimalField):
"""
Represents an ``<input type="range">``.
"""
widget = widgets.RangeInput(step="any")

View File

@@ -0,0 +1,173 @@
from .. import widgets
from .core import Field
__all__ = (
"BooleanField",
"TextAreaField",
"PasswordField",
"FileField",
"MultipleFileField",
"HiddenField",
"SearchField",
"SubmitField",
"StringField",
"TelField",
"URLField",
"EmailField",
"ColorField",
)
class BooleanField(Field):
"""
Represents an ``<input type="checkbox">``. Set the ``checked``-status by using the
``default``-option. Any value for ``default``, e.g. ``default="checked"`` puts
``checked`` into the html-element and sets the ``data`` to ``True``
:param false_values:
If provided, a sequence of strings each of which is an exact match
string of what is considered a "false" value. Defaults to the tuple
``(False, "false", "")``
"""
widget = widgets.CheckboxInput()
false_values = (False, "false", "")
def __init__(self, label=None, validators=None, false_values=None, **kwargs):
super().__init__(label, validators, **kwargs)
if false_values is not None:
self.false_values = false_values
def process_data(self, value):
self.data = bool(value)
def process_formdata(self, valuelist):
if not valuelist or valuelist[0] in self.false_values:
self.data = False
else:
self.data = True
def _value(self):
if self.raw_data:
return str(self.raw_data[0])
return "y"
class StringField(Field):
"""
This field is the base for most of the more complicated fields, and
represents an ``<input type="text">``.
"""
widget = widgets.TextInput()
def process_formdata(self, valuelist):
if valuelist:
self.data = valuelist[0]
def _value(self):
return str(self.data) if self.data is not None else ""
class TextAreaField(StringField):
"""
This field represents an HTML ``<textarea>`` and can be used to take
multi-line input.
"""
widget = widgets.TextArea()
class PasswordField(StringField):
"""
A StringField, except renders an ``<input type="password">``.
Also, whatever value is accepted by this field is not rendered back
to the browser like normal fields.
"""
widget = widgets.PasswordInput()
class FileField(Field):
"""Renders a file upload field.
By default, the value will be the filename sent in the form data.
WTForms **does not** deal with frameworks' file handling capabilities.
A WTForms extension for a framework may replace the filename value
with an object representing the uploaded data.
"""
widget = widgets.FileInput()
def _value(self):
# browser ignores value of file input for security
return False
class MultipleFileField(FileField):
"""A :class:`FileField` that allows choosing multiple files."""
widget = widgets.FileInput(multiple=True)
def process_formdata(self, valuelist):
self.data = valuelist
class HiddenField(StringField):
"""
HiddenField is a convenience for a StringField with a HiddenInput widget.
It will render as an ``<input type="hidden">`` but otherwise coerce to a string.
"""
widget = widgets.HiddenInput()
class SubmitField(BooleanField):
"""
Represents an ``<input type="submit">``. This allows checking if a given
submit button has been pressed.
"""
widget = widgets.SubmitInput()
class SearchField(StringField):
"""
Represents an ``<input type="search">``.
"""
widget = widgets.SearchInput()
class TelField(StringField):
"""
Represents an ``<input type="tel">``.
"""
widget = widgets.TelInput()
class URLField(StringField):
"""
Represents an ``<input type="url">``.
"""
widget = widgets.URLInput()
class EmailField(StringField):
"""
Represents an ``<input type="email">``.
"""
widget = widgets.EmailInput()
class ColorField(StringField):
"""
Represents an ``<input type="color">``.
"""
widget = widgets.ColorInput()

View File

@@ -0,0 +1,330 @@
import itertools
from collections import OrderedDict
from wtforms.meta import DefaultMeta
from wtforms.utils import unset_value
__all__ = ("BaseForm", "Form")
_default_meta = DefaultMeta()
class BaseForm:
"""
Base Form Class. Provides core behaviour like field construction,
validation, and data and error proxying.
"""
def __init__(self, fields, prefix="", meta=_default_meta):
"""
:param fields:
A dict or sequence of 2-tuples of partially-constructed fields.
:param prefix:
If provided, all fields will have their name prefixed with the
value.
:param meta:
A meta instance which is used for configuration and customization
of WTForms behaviors.
"""
if prefix and prefix[-1] not in "-_;:/.":
prefix += "-"
self.meta = meta
self._form_error_key = ""
self._prefix = prefix
self._fields = OrderedDict()
if hasattr(fields, "items"):
fields = fields.items()
translations = self.meta.get_translations(self)
extra_fields = []
if meta.csrf:
self._csrf = meta.build_csrf(self)
extra_fields.extend(self._csrf.setup_form(self))
for name, unbound_field in itertools.chain(fields, extra_fields):
field_name = unbound_field.name or name
options = dict(name=field_name, prefix=prefix, translations=translations)
field = meta.bind_field(self, unbound_field, options)
self._fields[name] = field
self.form_errors = []
def __iter__(self):
"""Iterate form fields in creation order."""
return iter(self._fields.values())
def __contains__(self, name):
"""Returns `True` if the named field is a member of this form."""
return name in self._fields
def __getitem__(self, name):
"""Dict-style access to this form's fields."""
return self._fields[name]
def __setitem__(self, name, value):
"""Bind a field to this form."""
self._fields[name] = value.bind(form=self, name=name, prefix=self._prefix)
def __delitem__(self, name):
"""Remove a field from this form."""
del self._fields[name]
def populate_obj(self, obj):
"""
Populates the attributes of the passed `obj` with data from the form's
fields.
:note: This is a destructive operation; Any attribute with the same name
as a field will be overridden. Use with caution.
"""
for name, field in self._fields.items():
field.populate_obj(obj, name)
def process(self, formdata=None, obj=None, data=None, extra_filters=None, **kwargs):
"""Process default and input data with each field.
:param formdata: Input data coming from the client, usually
``request.form`` or equivalent. Should provide a "multi
dict" interface to get a list of values for a given key,
such as what Werkzeug, Django, and WebOb provide.
:param obj: Take existing data from attributes on this object
matching form field attributes. Only used if ``formdata`` is
not passed.
:param data: Take existing data from keys in this dict matching
form field attributes. ``obj`` takes precedence if it also
has a matching attribute. Only used if ``formdata`` is not
passed.
:param extra_filters: A dict mapping field attribute names to
lists of extra filter functions to run. Extra filters run
after filters passed when creating the field. If the form
has ``filter_<fieldname>``, it is the last extra filter.
:param kwargs: Merged with ``data`` to allow passing existing
data as parameters. Overwrites any duplicate keys in
``data``. Only used if ``formdata`` is not passed.
"""
formdata = self.meta.wrap_formdata(self, formdata)
if data is not None:
kwargs = dict(data, **kwargs)
filters = extra_filters.copy() if extra_filters is not None else {}
for name, field in self._fields.items():
field_extra_filters = filters.get(name, [])
inline_filter = getattr(self, f"filter_{name}", None)
if inline_filter is not None:
field_extra_filters.append(inline_filter)
if obj is not None and hasattr(obj, name):
data = getattr(obj, name)
elif name in kwargs:
data = kwargs[name]
else:
data = unset_value
field.process(formdata, data, extra_filters=field_extra_filters)
def validate(self, extra_validators=None):
"""
Validates the form by calling `validate` on each field.
:param extra_validators:
If provided, is a dict mapping field names to a sequence of
callables which will be passed as extra validators to the field's
`validate` method.
Returns `True` if no errors occur.
"""
success = True
for name, field in self._fields.items():
if extra_validators is not None and name in extra_validators:
extra = extra_validators[name]
else:
extra = tuple()
if not field.validate(self, extra):
success = False
return success
@property
def data(self):
return {name: f.data for name, f in self._fields.items()}
@property
def errors(self):
errors = {name: f.errors for name, f in self._fields.items() if f.errors}
if self.form_errors:
errors[self._form_error_key] = self.form_errors
return errors
class FormMeta(type):
"""
The metaclass for `Form` and any subclasses of `Form`.
`FormMeta`'s responsibility is to create the `_unbound_fields` list, which
is a list of `UnboundField` instances sorted by their order of
instantiation. The list is created at the first instantiation of the form.
If any fields are added/removed from the form, the list is cleared to be
re-generated on the next instantiation.
Any properties which begin with an underscore or are not `UnboundField`
instances are ignored by the metaclass.
"""
def __init__(cls, name, bases, attrs):
type.__init__(cls, name, bases, attrs)
cls._unbound_fields = None
cls._wtforms_meta = None
def __call__(cls, *args, **kwargs):
"""
Construct a new `Form` instance.
Creates the `_unbound_fields` list and the internal `_wtforms_meta`
subclass of the class Meta in order to allow a proper inheritance
hierarchy.
"""
if cls._unbound_fields is None:
fields = []
for name in dir(cls):
if not name.startswith("_"):
unbound_field = getattr(cls, name)
if hasattr(unbound_field, "_formfield"):
fields.append((name, unbound_field))
# We keep the name as the second element of the sort
# to ensure a stable sort.
fields.sort(key=lambda x: (x[1].creation_counter, x[0]))
cls._unbound_fields = fields
# Create a subclass of the 'class Meta' using all the ancestors.
if cls._wtforms_meta is None:
bases = []
for mro_class in cls.__mro__:
if "Meta" in mro_class.__dict__:
bases.append(mro_class.Meta)
cls._wtforms_meta = type("Meta", tuple(bases), {})
return type.__call__(cls, *args, **kwargs)
def __setattr__(cls, name, value):
"""
Add an attribute to the class, clearing `_unbound_fields` if needed.
"""
if name == "Meta":
cls._wtforms_meta = None
elif not name.startswith("_") and hasattr(value, "_formfield"):
cls._unbound_fields = None
type.__setattr__(cls, name, value)
def __delattr__(cls, name):
"""
Remove an attribute from the class, clearing `_unbound_fields` if
needed.
"""
if not name.startswith("_"):
cls._unbound_fields = None
type.__delattr__(cls, name)
class Form(BaseForm, metaclass=FormMeta):
"""
Declarative Form base class. Extends BaseForm's core behaviour allowing
fields to be defined on Form subclasses as class attributes.
In addition, form and instance input data are taken at construction time
and passed to `process()`.
"""
Meta = DefaultMeta
def __init__(
self,
formdata=None,
obj=None,
prefix="",
data=None,
meta=None,
**kwargs,
):
"""
:param formdata: Input data coming from the client, usually
``request.form`` or equivalent. Should provide a "multi
dict" interface to get a list of values for a given key,
such as what Werkzeug, Django, and WebOb provide.
:param obj: Take existing data from attributes on this object
matching form field attributes. Only used if ``formdata`` is
not passed.
:param prefix: If provided, all fields will have their name
prefixed with the value. This is for distinguishing multiple
forms on a single page. This only affects the HTML name for
matching input data, not the Python name for matching
existing data.
:param data: Take existing data from keys in this dict matching
form field attributes. ``obj`` takes precedence if it also
has a matching attribute. Only used if ``formdata`` is not
passed.
:param meta: A dict of attributes to override on this form's
:attr:`meta` instance.
:param extra_filters: A dict mapping field attribute names to
lists of extra filter functions to run. Extra filters run
after filters passed when creating the field. If the form
has ``filter_<fieldname>``, it is the last extra filter.
:param kwargs: Merged with ``data`` to allow passing existing
data as parameters. Overwrites any duplicate keys in
``data``. Only used if ``formdata`` is not passed.
"""
meta_obj = self._wtforms_meta()
if meta is not None and isinstance(meta, dict):
meta_obj.update_values(meta)
super().__init__(self._unbound_fields, meta=meta_obj, prefix=prefix)
for name, field in self._fields.items():
# Set all the fields to attributes so that they obscure the class
# attributes with the same names.
setattr(self, name, field)
self.process(formdata, obj, data=data, **kwargs)
def __setitem__(self, name, value):
raise TypeError("Fields may not be added to Form instances, only classes.")
def __delitem__(self, name):
del self._fields[name]
setattr(self, name, None)
def __delattr__(self, name):
if name in self._fields:
self.__delitem__(name)
else:
# This is done for idempotency, if we have a name which is a field,
# we want to mask it by setting the value to None.
unbound_field = getattr(self.__class__, name, None)
if unbound_field is not None and hasattr(unbound_field, "_formfield"):
setattr(self, name, None)
else:
super().__delattr__(name)
def validate(self, extra_validators=None):
"""Validate the form by calling ``validate`` on each field.
Returns ``True`` if validation passes.
If the form defines a ``validate_<fieldname>`` method, it is
appended as an extra validator for the field's ``validate``.
:param extra_validators: A dict mapping field names to lists of
extra validator methods to run. Extra validators run after
validators passed when creating the field. If the form has
``validate_<fieldname>``, it is the last extra validator.
"""
if extra_validators is not None:
extra = extra_validators.copy()
else:
extra = {}
for name in self._fields:
inline = getattr(self.__class__, f"validate_{name}", None)
if inline is not None:
extra.setdefault(name, []).append(inline)
return super().validate(extra)

View File

@@ -0,0 +1,72 @@
import os
def messages_path():
"""
Determine the path to the 'messages' directory as best possible.
"""
module_path = os.path.abspath(__file__)
locale_path = os.path.join(os.path.dirname(module_path), "locale")
if not os.path.exists(locale_path): # pragma: no cover
locale_path = "/usr/share/locale"
return locale_path
def get_builtin_gnu_translations(languages=None):
"""
Get a gettext.GNUTranslations object pointing at the
included translation files.
:param languages:
A list of languages to try, in order. If omitted or None, then
gettext will try to use locale information from the environment.
"""
import gettext
return gettext.translation("wtforms", messages_path(), languages)
def get_translations(languages=None, getter=get_builtin_gnu_translations):
"""
Get a WTForms translation object which wraps a low-level translations object.
:param languages:
A sequence of languages to try, in order.
:param getter:
A single-argument callable which returns a low-level translations object.
"""
return getter(languages)
class DefaultTranslations:
"""
A WTForms translations object to wrap translations objects which use
ugettext/ungettext.
"""
def __init__(self, translations):
self.translations = translations
def gettext(self, string):
return self.translations.ugettext(string)
def ngettext(self, singular, plural, n):
return self.translations.ungettext(singular, plural, n)
class DummyTranslations:
"""
A translations object which simply returns unmodified strings.
This is typically used when translations are disabled or if no valid
translations provider can be found.
"""
def gettext(self, string):
return string
def ngettext(self, singular, plural, n):
if n == 1:
return singular
return plural

View File

@@ -0,0 +1,62 @@
Translations
============
WTForms uses gettext to provide translations. Translations for various
strings rendered by WTForms are created and updated by the community. If
you notice that your locale is missing, or find a translation error,
please submit a fix.
Create
------
To create a translation, initialize a catalog in the new locale:
```
$ pybabel init --input-file src/wtforms/locale/wtforms.pot --output-dir src/wtforms/locale --domain wtforms --locale <your locale>
```
This will create some folders under the locale name and copy the
template.
Update
------
To add new translatable string to the catalog:
```
pybabel extract --copyright-holder="WTForms Team" --project="WTForms" --version="$(python -c 'import wtforms; print(wtforms.__version__)')" --output-file src/wtforms/locale/wtforms.pot src/wtforms
```
Edit
----
After creating a translation, or to edit an existing translation, open
the ``.po`` file. While they can be edited by hand, there are also tools
that make working with gettext files easier.
Make sure the `.po` file:
- Is a valid UTF-8 text file.
- Has the header filled out appropriately.
- Translates all messages.
Verify
------
After working on the catalog, verify that it compiles and produces the
correct translations.
```
$ pybabel compile --directory src/wtforms/locale --domain wtforms --statistics
```
Try loading your translations into some sample code to verify they look
correct.
Submit
------
To submit your translation, create a pull request on GitHub.

View File

@@ -0,0 +1,205 @@
# Arabic translations for WTForms.
# Copyright (C) 2020 WTForms Team
# This file is distributed under the same license as the WTForms project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
#
msgid ""
msgstr ""
"Project-Id-Version: WTForms 2.0dev\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-01-11 08:20+0100\n"
"PO-Revision-Date: 2015-04-08 20:59+0100\n"
"Last-Translator: Jalal Maqdisi <jalal.maqdisi@gmail.com>\n"
"Language-Team: ar <LL@li.org>\n"
"Language: ar\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=6; plural=(n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n>=3 && "
"n<=10 ? 3 : n>=11 && n<=99 ? 4 : 5)\n"
"Generated-By: Babel 2.8.0\n"
#: src/wtforms/validators.py:86
#, python-format
msgid "Invalid field name '%s'."
msgstr "اسم الحقل '%s' غير صالح."
#: src/wtforms/validators.py:99
#, python-format
msgid "Field must be equal to %(other_name)s."
msgstr "يجب على الحقل ان يساوي %(other_name)s ."
#: src/wtforms/validators.py:145
#, python-format
msgid "Field must be at least %(min)d character long."
msgid_plural "Field must be at least %(min)d characters long."
msgstr[0] "لا يمكن للحقل ان يحتوي على اقل من %(min)d حرف."
msgstr[1] "لا يمكن للحقل ان يحتوي على اقل من %(min)d حروف."
msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
#: src/wtforms/validators.py:151
#, python-format
msgid "Field cannot be longer than %(max)d character."
msgid_plural "Field cannot be longer than %(max)d characters."
msgstr[0] "لا يمكن للحقل ان يحتوي على اكثر من %(max)d حرف."
msgstr[1] "لا يمكن للحقل ان يحتوي على اكثر من %(max)d حروف."
msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
#: src/wtforms/validators.py:157
#, python-format
msgid "Field must be exactly %(max)d character long."
msgid_plural "Field must be exactly %(max)d characters long."
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
#: src/wtforms/validators.py:163
#, python-format
msgid "Field must be between %(min)d and %(max)d characters long."
msgstr "يجب على طول الحقل ان يكون ما بين %(min)d و %(max)d حرف."
#: src/wtforms/validators.py:216
#, python-format
msgid "Number must be at least %(min)s."
msgstr "لا يجب على الرقم ان يقل عن %(min)s."
#: src/wtforms/validators.py:219
#, python-format
msgid "Number must be at most %(max)s."
msgstr "لا يجب على الرقم ان يزيد عن %(max)s. "
#: src/wtforms/validators.py:222
#, python-format
msgid "Number must be between %(min)s and %(max)s."
msgstr "يجب على الرقم ان يكون ما بين %(min)s و %(max)s."
#: src/wtforms/validators.py:293 src/wtforms/validators.py:323
msgid "This field is required."
msgstr "هذا الحقل مطلوب."
#: src/wtforms/validators.py:358
msgid "Invalid input."
msgstr "الاملاء غير صالح."
#: src/wtforms/validators.py:422
msgid "Invalid email address."
msgstr "البريد الالكتروني غير صالح."
#: src/wtforms/validators.py:460
msgid "Invalid IP address."
msgstr "پروتوكول الانترنت IP غير صالح."
#: src/wtforms/validators.py:503
msgid "Invalid Mac address."
msgstr "عنوان Mac غير صالح."
#: src/wtforms/validators.py:540
msgid "Invalid URL."
msgstr "عنوان الرابط غير صالح."
#: src/wtforms/validators.py:561
msgid "Invalid UUID."
msgstr "عنوان UUID غير صالح."
#: src/wtforms/validators.py:594
#, python-format
msgid "Invalid value, must be one of: %(values)s."
msgstr "قيمة غير صالحة، يجب أن تكون واحدة من: %(values)s."
#: src/wtforms/validators.py:629
#, python-format
msgid "Invalid value, can't be any of: %(values)s."
msgstr "قيمة غير صالحة، يجب أن تكون اي من: %(values)s."
#: src/wtforms/validators.py:698
#, fuzzy
#| msgid "This field is required."
msgid "This field cannot be edited."
msgstr "هذا الحقل مطلوب."
#: src/wtforms/validators.py:714
msgid "This field is disabled and cannot have a value."
msgstr ""
#: src/wtforms/csrf/core.py:96
msgid "Invalid CSRF Token."
msgstr "رمز CSRF غير صالح."
#: src/wtforms/csrf/session.py:63
msgid "CSRF token missing."
msgstr "رمز CSRF مفقود."
#: src/wtforms/csrf/session.py:71
msgid "CSRF failed."
msgstr "CSRF قد فشل."
#: src/wtforms/csrf/session.py:76
msgid "CSRF token expired."
msgstr "انتهت صلاحية رمز CSRF."
#: src/wtforms/fields/choices.py:142
msgid "Invalid Choice: could not coerce."
msgstr "اختيار غير صالح: لا يمكن الاجبار."
#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203
msgid "Choices cannot be None."
msgstr ""
#: src/wtforms/fields/choices.py:155
msgid "Not a valid choice."
msgstr "اختيار غير صحيح."
#: src/wtforms/fields/choices.py:193
msgid "Invalid choice(s): one or more data inputs could not be coerced."
msgstr "اختيارات غير صالحة: واحدة او اكثر من الادخالات لا يمكن اجبارها."
#: src/wtforms/fields/choices.py:214
#, fuzzy, python-format
#| msgid "'%(value)s' is not a valid choice for this field."
msgid "'%(value)s' is not a valid choice for this field."
msgid_plural "'%(value)s' are not valid choices for this field."
msgstr[0] "القيمة '%(value)s' ليست باختيار صحيح لهذا الحقل."
msgstr[1] "القيمة '%(value)s' ليست باختيار صحيح لهذا الحقل."
msgstr[2] "القيمة '%(value)s' ليست باختيار صحيح لهذا الحقل."
msgstr[3] "القيمة '%(value)s' ليست باختيار صحيح لهذا الحقل."
msgstr[4] "القيمة '%(value)s' ليست باختيار صحيح لهذا الحقل."
msgstr[5] "القيمة '%(value)s' ليست باختيار صحيح لهذا الحقل."
#: src/wtforms/fields/datetime.py:51
msgid "Not a valid datetime value."
msgstr "قيمة الوقت والتاريخ غير صالحة."
#: src/wtforms/fields/datetime.py:77
msgid "Not a valid date value."
msgstr "قيمة التاريخ غير صالحة."
#: src/wtforms/fields/datetime.py:103
msgid "Not a valid time value."
msgstr ""
#: src/wtforms/fields/datetime.py:148
#, fuzzy
#| msgid "Not a valid date value."
msgid "Not a valid week value."
msgstr "قيمة التاريخ غير صالحة."
#: src/wtforms/fields/numeric.py:82 src/wtforms/fields/numeric.py:92
msgid "Not a valid integer value."
msgstr "قيمة العدد الحقيقي غير صالحة."
#: src/wtforms/fields/numeric.py:168
msgid "Not a valid decimal value."
msgstr "القيمة العشرية غير صالحة."
#: src/wtforms/fields/numeric.py:197
msgid "Not a valid float value."
msgstr "القيمة العائمة غير صالحة."

View File

@@ -0,0 +1,190 @@
# Bulgarian (Bulgaria) translations for WTForms.
# Copyright (C) 2020 WTForms Team
# This file is distributed under the same license as the WTForms project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
#
msgid ""
msgstr ""
"Project-Id-Version: WTForms 2.0dev\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-01-11 08:20+0100\n"
"PO-Revision-Date: 2017-02-16 11:59+0100\n"
"Last-Translator: \n"
"Language-Team: Vladimir Kolev <me@vkolev.net>\n"
"Language: bg_BG\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
"Generated-By: Babel 2.8.0\n"
#: src/wtforms/validators.py:86
#, python-format
msgid "Invalid field name '%s'."
msgstr "Невалидно име на поле '%s'."
#: src/wtforms/validators.py:99
#, python-format
msgid "Field must be equal to %(other_name)s."
msgstr "Полето трябва да е еднакво с %(other_name)s."
#: src/wtforms/validators.py:145
#, python-format
msgid "Field must be at least %(min)d character long."
msgid_plural "Field must be at least %(min)d characters long."
msgstr[0] "Полето трябва да бъде дълго поне %(min)d символ."
msgstr[1] "Полето трябва да бъде дълго поне %(min)d символа."
#: src/wtforms/validators.py:151
#, python-format
msgid "Field cannot be longer than %(max)d character."
msgid_plural "Field cannot be longer than %(max)d characters."
msgstr[0] "Полето не моде да бъде по-дълго от %(max)d символ."
msgstr[1] "Полето не моде да бъде по-дълго от %(max)d символа."
#: src/wtforms/validators.py:157
#, python-format
msgid "Field must be exactly %(max)d character long."
msgid_plural "Field must be exactly %(max)d characters long."
msgstr[0] ""
msgstr[1] ""
#: src/wtforms/validators.py:163
#, python-format
msgid "Field must be between %(min)d and %(max)d characters long."
msgstr "Дължината на полето трябва да бъде между %(min)d и %(max)d символа."
#: src/wtforms/validators.py:216
#, python-format
msgid "Number must be at least %(min)s."
msgstr "Числото трябва да е поне %(min)s."
#: src/wtforms/validators.py:219
#, python-format
msgid "Number must be at most %(max)s."
msgstr "Числото трябва да е максимално %(max)s."
#: src/wtforms/validators.py:222
#, python-format
msgid "Number must be between %(min)s and %(max)s."
msgstr "Числото трябва да бъде между %(min)s и %(max)s."
#: src/wtforms/validators.py:293 src/wtforms/validators.py:323
msgid "This field is required."
msgstr "Това поле е задължително"
#: src/wtforms/validators.py:358
msgid "Invalid input."
msgstr "Невалидно въвеждане."
#: src/wtforms/validators.py:422
msgid "Invalid email address."
msgstr "Невалиден Е-мейл адрес."
#: src/wtforms/validators.py:460
msgid "Invalid IP address."
msgstr "Невалиден IP адрес."
#: src/wtforms/validators.py:503
msgid "Invalid Mac address."
msgstr "Невалиден MAC адрес."
#: src/wtforms/validators.py:540
msgid "Invalid URL."
msgstr "Невалиден URL."
#: src/wtforms/validators.py:561
msgid "Invalid UUID."
msgstr "Невалиден UUID."
#: src/wtforms/validators.py:594
#, python-format
msgid "Invalid value, must be one of: %(values)s."
msgstr "Невалидна стойност, трябва да бъде една от: %(values)s."
#: src/wtforms/validators.py:629
#, python-format
msgid "Invalid value, can't be any of: %(values)s."
msgstr "Невалидна стойност, не може да бъде една от: %(values)s."
#: src/wtforms/validators.py:698
#, fuzzy
#| msgid "This field is required."
msgid "This field cannot be edited."
msgstr "Това поле е задължително"
#: src/wtforms/validators.py:714
msgid "This field is disabled and cannot have a value."
msgstr ""
#: src/wtforms/csrf/core.py:96
msgid "Invalid CSRF Token."
msgstr "Невалиден CSRF Token"
#: src/wtforms/csrf/session.py:63
msgid "CSRF token missing."
msgstr "CSRF token липсва"
#: src/wtforms/csrf/session.py:71
msgid "CSRF failed."
msgstr "CSRF провален"
#: src/wtforms/csrf/session.py:76
msgid "CSRF token expired."
msgstr "CSRF token изтече"
#: src/wtforms/fields/choices.py:142
msgid "Invalid Choice: could not coerce."
msgstr "Невалиден избор: не може да бъде преобразувана"
#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203
msgid "Choices cannot be None."
msgstr ""
#: src/wtforms/fields/choices.py:155
msgid "Not a valid choice."
msgstr "Не е валиден избор"
#: src/wtforms/fields/choices.py:193
msgid "Invalid choice(s): one or more data inputs could not be coerced."
msgstr ""
"Невалиден(и) избор(и): една или повече въведени данни не могат да бъдат "
"преобразувани"
#: src/wtforms/fields/choices.py:214
#, fuzzy, python-format
#| msgid "'%(value)s' is not a valid choice for this field."
msgid "'%(value)s' is not a valid choice for this field."
msgid_plural "'%(value)s' are not valid choices for this field."
msgstr[0] "'%(value)s' не е валиден избор за това поле"
msgstr[1] "'%(value)s' не е валиден избор за това поле"
#: src/wtforms/fields/datetime.py:51
msgid "Not a valid datetime value."
msgstr "Не е валидна стойност за дата и време"
#: src/wtforms/fields/datetime.py:77
msgid "Not a valid date value."
msgstr "Не е валидна стойност за дата"
#: src/wtforms/fields/datetime.py:103
msgid "Not a valid time value."
msgstr ""
#: src/wtforms/fields/datetime.py:148
#, fuzzy
#| msgid "Not a valid date value."
msgid "Not a valid week value."
msgstr "Не е валидна стойност за дата"
#: src/wtforms/fields/numeric.py:82 src/wtforms/fields/numeric.py:92
msgid "Not a valid integer value."
msgstr "Не е валидна цифрова стойност"
#: src/wtforms/fields/numeric.py:168
msgid "Not a valid decimal value."
msgstr "Не е валидна десетична стойност"
#: src/wtforms/fields/numeric.py:197
msgid "Not a valid float value."
msgstr "Не е валидна стойност с плаваща запетая"

View File

@@ -0,0 +1,189 @@
# Catalan translations for WTForms.
# Copyright (C) 2020 WTForms Team
# This file is distributed under the same license as the WTForms project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
#
msgid ""
msgstr ""
"Project-Id-Version: WTForms 2.0dev\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-01-11 08:20+0100\n"
"PO-Revision-Date: 2014-01-16 09:58+0100\n"
"Last-Translator: Òscar Vilaplana <oscar.vilaplana@paylogic.eu>\n"
"Language-Team: ca <oscar.vilaplana@paylogic.eu>\n"
"Language: ca\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
"Generated-By: Babel 2.8.0\n"
#: src/wtforms/validators.py:86
#, python-format
msgid "Invalid field name '%s'."
msgstr "Nom de camp no vàlid '%s'."
#: src/wtforms/validators.py:99
#, python-format
msgid "Field must be equal to %(other_name)s."
msgstr "El camp ha de ser igual a %(other_name)s."
#: src/wtforms/validators.py:145
#, python-format
msgid "Field must be at least %(min)d character long."
msgid_plural "Field must be at least %(min)d characters long."
msgstr[0] "El camp ha de contenir almenys %(min)d caràcter."
msgstr[1] "El camp ha de contenir almenys %(min)d caràcters."
#: src/wtforms/validators.py:151
#, python-format
msgid "Field cannot be longer than %(max)d character."
msgid_plural "Field cannot be longer than %(max)d characters."
msgstr[0] "El camp no pot contenir més d'%(max)d caràcter."
msgstr[1] "El camp no pot contenir més de %(max)d caràcters."
#: src/wtforms/validators.py:157
#, python-format
msgid "Field must be exactly %(max)d character long."
msgid_plural "Field must be exactly %(max)d characters long."
msgstr[0] ""
msgstr[1] ""
#: src/wtforms/validators.py:163
#, python-format
msgid "Field must be between %(min)d and %(max)d characters long."
msgstr "El camp ha de contenir entre %(min)d i %(min)d caràcters."
#: src/wtforms/validators.py:216
#, python-format
msgid "Number must be at least %(min)s."
msgstr "El nombre ha de ser major o igual a %(min)s."
#: src/wtforms/validators.py:219
#, python-format
msgid "Number must be at most %(max)s."
msgstr "El nombre ha de ser com a màxim %(max)s."
#: src/wtforms/validators.py:222
#, python-format
msgid "Number must be between %(min)s and %(max)s."
msgstr "El nombre ha d'estar entre %(min)s i %(max)s."
#: src/wtforms/validators.py:293 src/wtforms/validators.py:323
msgid "This field is required."
msgstr "Aquest camp és obligatori."
#: src/wtforms/validators.py:358
msgid "Invalid input."
msgstr "Valor no vàlid."
#: src/wtforms/validators.py:422
msgid "Invalid email address."
msgstr "Adreça d'e-mail no vàlida."
#: src/wtforms/validators.py:460
msgid "Invalid IP address."
msgstr "Adreça IP no vàlida."
#: src/wtforms/validators.py:503
msgid "Invalid Mac address."
msgstr "Adreça MAC no vàlida."
#: src/wtforms/validators.py:540
msgid "Invalid URL."
msgstr "URL no vàlida."
#: src/wtforms/validators.py:561
msgid "Invalid UUID."
msgstr "UUID no vàlid."
#: src/wtforms/validators.py:594
#, python-format
msgid "Invalid value, must be one of: %(values)s."
msgstr "Valor no vàlid, ha de ser un d'entre: %(values)s."
#: src/wtforms/validators.py:629
#, python-format
msgid "Invalid value, can't be any of: %(values)s."
msgstr "Valor no vàlid, no pot ser cap d'aquests: %(values)s."
#: src/wtforms/validators.py:698
#, fuzzy
#| msgid "This field is required."
msgid "This field cannot be edited."
msgstr "Aquest camp és obligatori."
#: src/wtforms/validators.py:714
msgid "This field is disabled and cannot have a value."
msgstr ""
#: src/wtforms/csrf/core.py:96
msgid "Invalid CSRF Token."
msgstr "Token CSRF no vàlid"
#: src/wtforms/csrf/session.py:63
msgid "CSRF token missing."
msgstr "Falta el token CSRF"
#: src/wtforms/csrf/session.py:71
msgid "CSRF failed."
msgstr "Ha fallat la comprovació de CSRF"
#: src/wtforms/csrf/session.py:76
msgid "CSRF token expired."
msgstr "Token CSRF caducat"
#: src/wtforms/fields/choices.py:142
msgid "Invalid Choice: could not coerce."
msgstr "Opció no vàlida"
#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203
msgid "Choices cannot be None."
msgstr ""
#: src/wtforms/fields/choices.py:155
msgid "Not a valid choice."
msgstr "Opció no acceptada"
#: src/wtforms/fields/choices.py:193
msgid "Invalid choice(s): one or more data inputs could not be coerced."
msgstr ""
"Opció o opcions no vàlides: alguna de les entrades no s'ha pogut processar"
#: src/wtforms/fields/choices.py:214
#, fuzzy, python-format
#| msgid "'%(value)s' is not a valid choice for this field."
msgid "'%(value)s' is not a valid choice for this field."
msgid_plural "'%(value)s' are not valid choices for this field."
msgstr[0] "'%(value)s' no és una opció acceptada per a aquest camp"
msgstr[1] "'%(value)s' no és una opció acceptada per a aquest camp"
#: src/wtforms/fields/datetime.py:51
msgid "Not a valid datetime value."
msgstr "Valor de data i hora no vàlid"
#: src/wtforms/fields/datetime.py:77
msgid "Not a valid date value."
msgstr "Valor de data no vàlid"
#: src/wtforms/fields/datetime.py:103
msgid "Not a valid time value."
msgstr ""
#: src/wtforms/fields/datetime.py:148
#, fuzzy
#| msgid "Not a valid date value."
msgid "Not a valid week value."
msgstr "Valor de data no vàlid"
#: src/wtforms/fields/numeric.py:82 src/wtforms/fields/numeric.py:92
msgid "Not a valid integer value."
msgstr "Valor enter no vàlid"
#: src/wtforms/fields/numeric.py:168
msgid "Not a valid decimal value."
msgstr "Valor decimal no vàlid"
#: src/wtforms/fields/numeric.py:197
msgid "Not a valid float value."
msgstr "Valor en coma flotant no vàlid"

View File

@@ -0,0 +1,192 @@
# Czech (Czechia) translations for WTForms.
# Copyright (C) 2020 WTForms Team
# This file is distributed under the same license as the WTForms project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
#
msgid ""
msgstr ""
"Project-Id-Version: WTForms 2.0.2dev\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-01-11 08:20+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Daniil Barabash <ghostbarik@gmail.com>\n"
"Language-Team: cz <ghostbarik@gmail.com>\n"
"Language: cs_CZ\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2)\n"
"Generated-By: Babel 2.8.0\n"
#: src/wtforms/validators.py:86
#, python-format
msgid "Invalid field name '%s'."
msgstr "Neplatný název pole '%s'."
#: src/wtforms/validators.py:99
#, python-format
msgid "Field must be equal to %(other_name)s."
msgstr "Hodnota pole má být stejná jako u %(other_name)s."
#: src/wtforms/validators.py:145
#, python-format
msgid "Field must be at least %(min)d character long."
msgid_plural "Field must be at least %(min)d characters long."
msgstr[0] "Počet znaků daného pole má být minimálně %(min)d."
msgstr[1] "Počet znaků daného pole má být minimálně %(min)d."
msgstr[2] ""
#: src/wtforms/validators.py:151
#, python-format
msgid "Field cannot be longer than %(max)d character."
msgid_plural "Field cannot be longer than %(max)d characters."
msgstr[0] "Počet znaků daného pole má byt maximálně %(max)d."
msgstr[1] "Počet znaků daného pole má byt maximálně %(max)d."
msgstr[2] ""
#: src/wtforms/validators.py:157
#, python-format
msgid "Field must be exactly %(max)d character long."
msgid_plural "Field must be exactly %(max)d characters long."
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
#: src/wtforms/validators.py:163
#, python-format
msgid "Field must be between %(min)d and %(max)d characters long."
msgstr "Délka pole ma být mezi %(min)d a %(max)d."
#: src/wtforms/validators.py:216
#, python-format
msgid "Number must be at least %(min)s."
msgstr "Hodnota čísla má být alespoň %(min)s."
#: src/wtforms/validators.py:219
#, python-format
msgid "Number must be at most %(max)s."
msgstr "Hodnota čísla má být maximálně %(max)s."
#: src/wtforms/validators.py:222
#, python-format
msgid "Number must be between %(min)s and %(max)s."
msgstr "Hodnota čísla má být mezi %(min)s and %(max)s."
#: src/wtforms/validators.py:293 src/wtforms/validators.py:323
msgid "This field is required."
msgstr "Toto pole je povinné."
#: src/wtforms/validators.py:358
msgid "Invalid input."
msgstr "Neplatný vstup."
#: src/wtforms/validators.py:422
msgid "Invalid email address."
msgstr "Neplatná emailová adresa."
#: src/wtforms/validators.py:460
msgid "Invalid IP address."
msgstr "Neplatná IP adresa."
#: src/wtforms/validators.py:503
msgid "Invalid Mac address."
msgstr "Neplatná MAC adresa."
#: src/wtforms/validators.py:540
msgid "Invalid URL."
msgstr "Neplatné URL."
#: src/wtforms/validators.py:561
msgid "Invalid UUID."
msgstr "Neplatné UUID."
#: src/wtforms/validators.py:594
#, python-format
msgid "Invalid value, must be one of: %(values)s."
msgstr "Neplatná hodnota, povolené hodnoty jsou: %(values)s."
#: src/wtforms/validators.py:629
#, python-format
msgid "Invalid value, can't be any of: %(values)s."
msgstr "Neplatná hodnota, nesmí být mezi: %(values)s."
#: src/wtforms/validators.py:698
#, fuzzy
#| msgid "This field is required."
msgid "This field cannot be edited."
msgstr "Toto pole je povinné."
#: src/wtforms/validators.py:714
msgid "This field is disabled and cannot have a value."
msgstr ""
#: src/wtforms/csrf/core.py:96
msgid "Invalid CSRF Token."
msgstr "Neplatný CSRF token."
#: src/wtforms/csrf/session.py:63
msgid "CSRF token missing."
msgstr "Chybí CSRF token."
#: src/wtforms/csrf/session.py:71
msgid "CSRF failed."
msgstr "Chyba CSRF."
#: src/wtforms/csrf/session.py:76
msgid "CSRF token expired."
msgstr "Hodnota CSRF tokenu."
#: src/wtforms/fields/choices.py:142
msgid "Invalid Choice: could not coerce."
msgstr "Neplatná volba: nelze převést."
#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203
msgid "Choices cannot be None."
msgstr ""
#: src/wtforms/fields/choices.py:155
msgid "Not a valid choice."
msgstr "Neplatná volba."
#: src/wtforms/fields/choices.py:193
msgid "Invalid choice(s): one or more data inputs could not be coerced."
msgstr "Neplatná volba: jeden nebo více datových vstupů nemohou být převedeny."
#: src/wtforms/fields/choices.py:214
#, fuzzy, python-format
#| msgid "'%(value)s' is not a valid choice for this field."
msgid "'%(value)s' is not a valid choice for this field."
msgid_plural "'%(value)s' are not valid choices for this field."
msgstr[0] "'%(value)s' není platnou volbou pro dané pole."
msgstr[1] "'%(value)s' není platnou volbou pro dané pole."
msgstr[2] "'%(value)s' není platnou volbou pro dané pole."
#: src/wtforms/fields/datetime.py:51
msgid "Not a valid datetime value."
msgstr "Neplatná hodnota pro datum a čas."
#: src/wtforms/fields/datetime.py:77
msgid "Not a valid date value."
msgstr "Neplatná hodnota pro datum."
#: src/wtforms/fields/datetime.py:103
msgid "Not a valid time value."
msgstr ""
#: src/wtforms/fields/datetime.py:148
#, fuzzy
#| msgid "Not a valid date value."
msgid "Not a valid week value."
msgstr "Neplatná hodnota pro datum."
#: src/wtforms/fields/numeric.py:82 src/wtforms/fields/numeric.py:92
msgid "Not a valid integer value."
msgstr "Neplatná hodnota pro celé číslo."
#: src/wtforms/fields/numeric.py:168
msgid "Not a valid decimal value."
msgstr "Neplatná hodnota pro desetinné číslo."
#: src/wtforms/fields/numeric.py:197
msgid "Not a valid float value."
msgstr "Neplatná hodnota pro desetinné číslo."

View File

@@ -0,0 +1,189 @@
# Welsh translations for WTForms.
# Copyright (C) 2020 WTForms Team
# This file is distributed under the same license as the WTForms project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
#
msgid ""
msgstr ""
"Project-Id-Version: WTForms 2.0dev\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-01-11 08:20+0100\n"
"PO-Revision-Date: 2015-01-29 14:07+0000\n"
"Last-Translator: Josh Rowe josh.rowe@digital.justice.gov.uk\n"
"Language-Team: cy <LL@li.org>\n"
"Language: cy\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
"Generated-By: Babel 2.8.0\n"
#: src/wtforms/validators.py:86
#, python-format
msgid "Invalid field name '%s'."
msgstr "Enw maes annilys '%s'."
#: src/wtforms/validators.py:99
#, python-format
msgid "Field must be equal to %(other_name)s."
msgstr "Rhaid i'r maes fod yr un fath â/ag %(other_name)s."
#: src/wtforms/validators.py:145
#, python-format
msgid "Field must be at least %(min)d character long."
msgid_plural "Field must be at least %(min)d characters long."
msgstr[0] "Mae'n rhaid i Maes fod o leiaf %(min)d cymeriad hir."
msgstr[1] "Mae'n rhaid i Maes fod o leiaf %(min)d nod o hyd."
#: src/wtforms/validators.py:151
#, python-format
msgid "Field cannot be longer than %(max)d character."
msgid_plural "Field cannot be longer than %(max)d characters."
msgstr[0] "Ni all Maes fod yn hirach na %(max)d cymeriad."
msgstr[1] "Ni all Maes fod yn fwy na %(max)d cymeriadau."
#: src/wtforms/validators.py:157
#, python-format
msgid "Field must be exactly %(max)d character long."
msgid_plural "Field must be exactly %(max)d characters long."
msgstr[0] ""
msgstr[1] ""
#: src/wtforms/validators.py:163
#, python-format
msgid "Field must be between %(min)d and %(max)d characters long."
msgstr "Rhaid i'r maes fod rhwng %(min)d a %(max)d o nodau"
#: src/wtforms/validators.py:216
#, python-format
msgid "Number must be at least %(min)s."
msgstr "Rhaid i'r rhif fod o leiaf %(min)s."
#: src/wtforms/validators.py:219
#, python-format
msgid "Number must be at most %(max)s."
msgstr "Ni chaiff y rhif fod yn fwy na %(max)s. "
#: src/wtforms/validators.py:222
#, python-format
msgid "Number must be between %(min)s and %(max)s."
msgstr "Rhaid i'r rhif fod rhwng %(min)s a %(max)s. "
#: src/wtforms/validators.py:293 src/wtforms/validators.py:323
msgid "This field is required."
msgstr "Rhaid cwblhau'r maes hwn."
#: src/wtforms/validators.py:358
msgid "Invalid input."
msgstr "Mewnbwn annilys"
#: src/wtforms/validators.py:422
msgid "Invalid email address."
msgstr "Cyfeiriad e-bost annilys"
#: src/wtforms/validators.py:460
msgid "Invalid IP address."
msgstr "Cyfeiriad IP annilys"
#: src/wtforms/validators.py:503
msgid "Invalid Mac address."
msgstr "Cyfeiriad Mac annilys."
#: src/wtforms/validators.py:540
msgid "Invalid URL."
msgstr "URL annilys."
#: src/wtforms/validators.py:561
msgid "Invalid UUID."
msgstr "UUID annilys."
#: src/wtforms/validators.py:594
#, python-format
msgid "Invalid value, must be one of: %(values)s."
msgstr "Gwerth annilys, rhaid i'r gwerth fod yn un o'r canlynol: %(values)s."
#: src/wtforms/validators.py:629
#, python-format
msgid "Invalid value, can't be any of: %(values)s."
msgstr "Gwerth annilys, ni all fod yn un o'r canlynol: %(values)s"
#: src/wtforms/validators.py:698
#, fuzzy
#| msgid "This field is required."
msgid "This field cannot be edited."
msgstr "Rhaid cwblhau'r maes hwn."
#: src/wtforms/validators.py:714
msgid "This field is disabled and cannot have a value."
msgstr ""
#: src/wtforms/csrf/core.py:96
msgid "Invalid CSRF Token."
msgstr "Tocyn CSRF annilys"
#: src/wtforms/csrf/session.py:63
msgid "CSRF token missing."
msgstr "Tocyn CSRF ar goll"
#: src/wtforms/csrf/session.py:71
msgid "CSRF failed."
msgstr "CSRF wedi methu"
#: src/wtforms/csrf/session.py:76
msgid "CSRF token expired."
msgstr "Tocyn CSRF wedi dod i ben"
#: src/wtforms/fields/choices.py:142
msgid "Invalid Choice: could not coerce."
msgstr "Dewis annilys: ddim yn bosib gweithredu"
#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203
msgid "Choices cannot be None."
msgstr ""
#: src/wtforms/fields/choices.py:155
msgid "Not a valid choice."
msgstr "Nid yw hwn yn ddewis dilys"
#: src/wtforms/fields/choices.py:193
msgid "Invalid choice(s): one or more data inputs could not be coerced."
msgstr ""
"Dewis(iadau) annilys: ddim yn bosib gweithredu un neu ragor o fewnbynnau data"
#: src/wtforms/fields/choices.py:214
#, fuzzy, python-format
#| msgid "'%(value)s' is not a valid choice for this field."
msgid "'%(value)s' is not a valid choice for this field."
msgid_plural "'%(value)s' are not valid choices for this field."
msgstr[0] "Nid yw '%(value)s' yn ddewis dilys ar gyfer y maes hwn"
msgstr[1] "Nid yw '%(value)s' yn ddewis dilys ar gyfer y maes hwn"
#: src/wtforms/fields/datetime.py:51
msgid "Not a valid datetime value."
msgstr "Gwerth dyddiad/amser annilys"
#: src/wtforms/fields/datetime.py:77
msgid "Not a valid date value."
msgstr "Gwerth dyddiad annilys"
#: src/wtforms/fields/datetime.py:103
msgid "Not a valid time value."
msgstr ""
#: src/wtforms/fields/datetime.py:148
#, fuzzy
#| msgid "Not a valid date value."
msgid "Not a valid week value."
msgstr "Gwerth dyddiad annilys"
#: src/wtforms/fields/numeric.py:82 src/wtforms/fields/numeric.py:92
msgid "Not a valid integer value."
msgstr "Gwerth integer annilys"
#: src/wtforms/fields/numeric.py:168
msgid "Not a valid decimal value."
msgstr "Gwerth degolyn annilys"
#: src/wtforms/fields/numeric.py:197
msgid "Not a valid float value."
msgstr "Gwerth float annilys"

View File

@@ -0,0 +1,190 @@
# German translations for WTForms.
# Copyright (C) 2020 WTForms Team
# This file is distributed under the same license as the WTForms project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
#
msgid ""
msgstr ""
"Project-Id-Version: WTForms 1.0.4\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-01-11 08:20+0100\n"
"PO-Revision-Date: 2013-05-13 19:27+0100\n"
"Last-Translator: Chris Buergi <chris.buergi@gmx.net>\n"
"Language-Team: de <LL@li.org>\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
"Generated-By: Babel 2.8.0\n"
#: src/wtforms/validators.py:86
#, python-format
msgid "Invalid field name '%s'."
msgstr "Ungültiger Feldname '%s'."
#: src/wtforms/validators.py:99
#, python-format
msgid "Field must be equal to %(other_name)s."
msgstr "Feld muss gleich wie %(other_name)s sein."
#: src/wtforms/validators.py:145
#, python-format
msgid "Field must be at least %(min)d character long."
msgid_plural "Field must be at least %(min)d characters long."
msgstr[0] "Feld muss mindestens %(min)d Zeichen beinhalten."
msgstr[1] "Feld muss mindestens %(min)d Zeichen beinhalten."
#: src/wtforms/validators.py:151
#, python-format
msgid "Field cannot be longer than %(max)d character."
msgid_plural "Field cannot be longer than %(max)d characters."
msgstr[0] "Feld kann nicht länger als %(max)d Zeichen sein."
msgstr[1] "Feld kann nicht länger als %(max)d Zeichen sein."
#: src/wtforms/validators.py:157
#, python-format
msgid "Field must be exactly %(max)d character long."
msgid_plural "Field must be exactly %(max)d characters long."
msgstr[0] ""
msgstr[1] ""
#: src/wtforms/validators.py:163
#, python-format
msgid "Field must be between %(min)d and %(max)d characters long."
msgstr "Feld muss zwischen %(min)d und %(max)d Zeichen beinhalten."
#: src/wtforms/validators.py:216
#, python-format
msgid "Number must be at least %(min)s."
msgstr "Zahl muss mindestens %(min)s sein."
#: src/wtforms/validators.py:219
#, python-format
msgid "Number must be at most %(max)s."
msgstr "Zahl kann höchstens %(max)s sein."
#: src/wtforms/validators.py:222
#, python-format
msgid "Number must be between %(min)s and %(max)s."
msgstr "Zahl muss zwischen %(min)s und %(max)s liegen."
#: src/wtforms/validators.py:293 src/wtforms/validators.py:323
msgid "This field is required."
msgstr "Dieses Feld wird benötigt."
#: src/wtforms/validators.py:358
msgid "Invalid input."
msgstr "Ungültige Eingabe."
#: src/wtforms/validators.py:422
msgid "Invalid email address."
msgstr "Ungültige E-Mail-Adresse."
#: src/wtforms/validators.py:460
msgid "Invalid IP address."
msgstr "Ungültige IP-Adresse."
#: src/wtforms/validators.py:503
msgid "Invalid Mac address."
msgstr "Ungültige Mac-Adresse."
#: src/wtforms/validators.py:540
msgid "Invalid URL."
msgstr "Ungültige URL."
#: src/wtforms/validators.py:561
msgid "Invalid UUID."
msgstr "Ungültige UUID."
#: src/wtforms/validators.py:594
#, python-format
msgid "Invalid value, must be one of: %(values)s."
msgstr "Ungültiger Wert. Mögliche Werte: %(values)s."
#: src/wtforms/validators.py:629
#, python-format
msgid "Invalid value, can't be any of: %(values)s."
msgstr "Ungültiger Wert. Wert kann keiner von folgenden sein: %(values)s."
#: src/wtforms/validators.py:698
#, fuzzy
#| msgid "This field is required."
msgid "This field cannot be edited."
msgstr "Dieses Feld wird benötigt."
#: src/wtforms/validators.py:714
msgid "This field is disabled and cannot have a value."
msgstr ""
#: src/wtforms/csrf/core.py:96
msgid "Invalid CSRF Token."
msgstr "Ungültiger CSRF-Code."
#: src/wtforms/csrf/session.py:63
msgid "CSRF token missing."
msgstr "CSRF-Code nicht vorhanden."
#: src/wtforms/csrf/session.py:71
msgid "CSRF failed."
msgstr "CSRF fehlgeschlagen."
#: src/wtforms/csrf/session.py:76
msgid "CSRF token expired."
msgstr "CSRF-Code verfallen."
#: src/wtforms/fields/choices.py:142
msgid "Invalid Choice: could not coerce."
msgstr "Ungültige Auswahl: Konnte nicht umwandeln."
#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203
msgid "Choices cannot be None."
msgstr ""
#: src/wtforms/fields/choices.py:155
msgid "Not a valid choice."
msgstr "Keine gültige Auswahl."
#: src/wtforms/fields/choices.py:193
msgid "Invalid choice(s): one or more data inputs could not be coerced."
msgstr ""
"Ungültige Auswahl: Einer oder mehrere Eingaben konnten nicht umgewandelt "
"werden."
#: src/wtforms/fields/choices.py:214
#, fuzzy, python-format
#| msgid "'%(value)s' is not a valid choice for this field."
msgid "'%(value)s' is not a valid choice for this field."
msgid_plural "'%(value)s' are not valid choices for this field."
msgstr[0] "'%(value)s' ist kein gültige Auswahl für dieses Feld."
msgstr[1] "'%(value)s' ist kein gültige Auswahl für dieses Feld."
#: src/wtforms/fields/datetime.py:51
msgid "Not a valid datetime value."
msgstr "Kein gültiges Datum mit Zeit."
#: src/wtforms/fields/datetime.py:77
msgid "Not a valid date value."
msgstr "Kein gültiges Datum."
#: src/wtforms/fields/datetime.py:103
msgid "Not a valid time value."
msgstr ""
#: src/wtforms/fields/datetime.py:148
#, fuzzy
#| msgid "Not a valid date value."
msgid "Not a valid week value."
msgstr "Kein gültiges Datum."
#: src/wtforms/fields/numeric.py:82 src/wtforms/fields/numeric.py:92
msgid "Not a valid integer value."
msgstr "Keine gültige, ganze Zahl."
#: src/wtforms/fields/numeric.py:168
msgid "Not a valid decimal value."
msgstr "Keine gültige Dezimalzahl."
#: src/wtforms/fields/numeric.py:197
msgid "Not a valid float value."
msgstr "Keine gültige Gleitkommazahl."

View File

@@ -0,0 +1,190 @@
# German (Switzerland) translations for WTForms.
# Copyright (C) 2020 WTForms Team
# This file is distributed under the same license as the WTForms project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
#
msgid ""
msgstr ""
"Project-Id-Version: WTForms 1.0.4\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-01-11 08:20+0100\n"
"PO-Revision-Date: 2013-05-13 19:27+0100\n"
"Last-Translator: Chris Buergi <chris.buergi@gmx.net>\n"
"Language-Team: de_CH <LL@li.org>\n"
"Language: de_CH\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
"Generated-By: Babel 2.8.0\n"
#: src/wtforms/validators.py:86
#, python-format
msgid "Invalid field name '%s'."
msgstr "Ungültiger Feldname '%s'."
#: src/wtforms/validators.py:99
#, python-format
msgid "Field must be equal to %(other_name)s."
msgstr "Feld muss gleich wie %(other_name)s sein."
#: src/wtforms/validators.py:145
#, python-format
msgid "Field must be at least %(min)d character long."
msgid_plural "Field must be at least %(min)d characters long."
msgstr[0] "Feld muss mindestens %(min)d Zeichen beinhalten."
msgstr[1] "Feld muss mindestens %(min)d Zeichen beinhalten."
#: src/wtforms/validators.py:151
#, python-format
msgid "Field cannot be longer than %(max)d character."
msgid_plural "Field cannot be longer than %(max)d characters."
msgstr[0] "Feld kann nicht länger als %(max)d Zeichen sein."
msgstr[1] "Feld kann nicht länger als %(max)d Zeichen sein."
#: src/wtforms/validators.py:157
#, python-format
msgid "Field must be exactly %(max)d character long."
msgid_plural "Field must be exactly %(max)d characters long."
msgstr[0] ""
msgstr[1] ""
#: src/wtforms/validators.py:163
#, python-format
msgid "Field must be between %(min)d and %(max)d characters long."
msgstr "Feld muss zwischen %(min)d und %(max)d Zeichen beinhalten."
#: src/wtforms/validators.py:216
#, python-format
msgid "Number must be at least %(min)s."
msgstr "Zahl muss mindestens %(min)s sein."
#: src/wtforms/validators.py:219
#, python-format
msgid "Number must be at most %(max)s."
msgstr "Zahl kann höchstens %(max)s sein."
#: src/wtforms/validators.py:222
#, python-format
msgid "Number must be between %(min)s and %(max)s."
msgstr "Zahl muss zwischen %(min)s und %(max)s liegen."
#: src/wtforms/validators.py:293 src/wtforms/validators.py:323
msgid "This field is required."
msgstr "Dieses Feld wird benötigt."
#: src/wtforms/validators.py:358
msgid "Invalid input."
msgstr "Ungültige Eingabe."
#: src/wtforms/validators.py:422
msgid "Invalid email address."
msgstr "Ungültige Email-Adresse."
#: src/wtforms/validators.py:460
msgid "Invalid IP address."
msgstr "Ungültige IP-Adresse."
#: src/wtforms/validators.py:503
msgid "Invalid Mac address."
msgstr "Ungültige Mac-Adresse."
#: src/wtforms/validators.py:540
msgid "Invalid URL."
msgstr "Ungültige URL."
#: src/wtforms/validators.py:561
msgid "Invalid UUID."
msgstr "Ungültige UUID."
#: src/wtforms/validators.py:594
#, python-format
msgid "Invalid value, must be one of: %(values)s."
msgstr "Ungültiger Wert. Mögliche Werte: %(values)s."
#: src/wtforms/validators.py:629
#, python-format
msgid "Invalid value, can't be any of: %(values)s."
msgstr "Ungültiger Wert. Wert kann keiner von folgenden sein: %(values)s."
#: src/wtforms/validators.py:698
#, fuzzy
#| msgid "This field is required."
msgid "This field cannot be edited."
msgstr "Dieses Feld wird benötigt."
#: src/wtforms/validators.py:714
msgid "This field is disabled and cannot have a value."
msgstr ""
#: src/wtforms/csrf/core.py:96
msgid "Invalid CSRF Token."
msgstr "Ungültiger CSRF-Code"
#: src/wtforms/csrf/session.py:63
msgid "CSRF token missing."
msgstr "CSRF-Code nicht vorhanden"
#: src/wtforms/csrf/session.py:71
msgid "CSRF failed."
msgstr "CSRF fehlgeschlagen"
#: src/wtforms/csrf/session.py:76
msgid "CSRF token expired."
msgstr "CSRF-Code verfallen"
#: src/wtforms/fields/choices.py:142
msgid "Invalid Choice: could not coerce."
msgstr "Ungültige Auswahl: Konnte nicht umwandeln"
#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203
msgid "Choices cannot be None."
msgstr ""
#: src/wtforms/fields/choices.py:155
msgid "Not a valid choice."
msgstr "Keine gültige Auswahl"
#: src/wtforms/fields/choices.py:193
msgid "Invalid choice(s): one or more data inputs could not be coerced."
msgstr ""
"Ungültige Auswahl: Einer oder mehrere Eingaben konnten nicht umgewandelt "
"werden."
#: src/wtforms/fields/choices.py:214
#, fuzzy, python-format
#| msgid "'%(value)s' is not a valid choice for this field."
msgid "'%(value)s' is not a valid choice for this field."
msgid_plural "'%(value)s' are not valid choices for this field."
msgstr[0] "'%(value)s' ist kein gültige Auswahl für dieses Feld."
msgstr[1] "'%(value)s' ist kein gültige Auswahl für dieses Feld."
#: src/wtforms/fields/datetime.py:51
msgid "Not a valid datetime value."
msgstr "Kein gültiges Datum mit Zeit"
#: src/wtforms/fields/datetime.py:77
msgid "Not a valid date value."
msgstr "Kein gültiges Datum"
#: src/wtforms/fields/datetime.py:103
msgid "Not a valid time value."
msgstr ""
#: src/wtforms/fields/datetime.py:148
#, fuzzy
#| msgid "Not a valid date value."
msgid "Not a valid week value."
msgstr "Kein gültiges Datum"
#: src/wtforms/fields/numeric.py:82 src/wtforms/fields/numeric.py:92
msgid "Not a valid integer value."
msgstr "Keine gültige, ganze Zahl"
#: src/wtforms/fields/numeric.py:168
msgid "Not a valid decimal value."
msgstr "Keine gültige Dezimalzahl"
#: src/wtforms/fields/numeric.py:197
msgid "Not a valid float value."
msgstr "Keine gültige Gleitkommazahl"

View File

@@ -0,0 +1,188 @@
# Greek translations for WTForms.
# Copyright (C) 2020 WTForms Team
# This file is distributed under the same license as the WTForms project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
#
msgid ""
msgstr ""
"Project-Id-Version: WTForms 2.0dev\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-01-11 08:20+0100\n"
"PO-Revision-Date: 2014-04-04 20:18+0300\n"
"Last-Translator: Daniel Dourvaris <dourvaris@gmail.com>\n"
"Language-Team: el <LL@li.org>\n"
"Language: el\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
"Generated-By: Babel 2.8.0\n"
#: src/wtforms/validators.py:86
#, python-format
msgid "Invalid field name '%s'."
msgstr "Λάθος όνομα πεδίου '%s'."
#: src/wtforms/validators.py:99
#, python-format
msgid "Field must be equal to %(other_name)s."
msgstr "Το πεδίο πρέπει να είναι το ίδιο με το %(other_name)s."
#: src/wtforms/validators.py:145
#, python-format
msgid "Field must be at least %(min)d character long."
msgid_plural "Field must be at least %(min)d characters long."
msgstr[0] "Το πεδίο πρέπει να έχει τουλάχιστον %(min)d χαρακτήρα."
msgstr[1] "Το πεδίο πρέπει να έχει τουλάχιστον %(min)d χαρακτήρες."
#: src/wtforms/validators.py:151
#, python-format
msgid "Field cannot be longer than %(max)d character."
msgid_plural "Field cannot be longer than %(max)d characters."
msgstr[0] "Το πεδίο δεν μπορεί να έχει πάνω από %(max)d χαρακτήρα."
msgstr[1] "Το πεδίο δεν μπορεί να έχει πάνω από %(max)d χαρακτήρες."
#: src/wtforms/validators.py:157
#, python-format
msgid "Field must be exactly %(max)d character long."
msgid_plural "Field must be exactly %(max)d characters long."
msgstr[0] ""
msgstr[1] ""
#: src/wtforms/validators.py:163
#, python-format
msgid "Field must be between %(min)d and %(max)d characters long."
msgstr "Το πεδίο πρέπει να είναι ανάμεσα από %(min)d και %(max)d χαρακτήρες."
#: src/wtforms/validators.py:216
#, python-format
msgid "Number must be at least %(min)s."
msgstr "Το νούμερο πρέπει να είναι τουλάχιστον %(min)s."
#: src/wtforms/validators.py:219
#, python-format
msgid "Number must be at most %(max)s."
msgstr "Το νούμερο πρέπει να είναι μέγιστο %(max)s."
#: src/wtforms/validators.py:222
#, python-format
msgid "Number must be between %(min)s and %(max)s."
msgstr "Το νούμερο πρέπει να είναι ανάμεσα %(min)s και %(max)s."
#: src/wtforms/validators.py:293 src/wtforms/validators.py:323
msgid "This field is required."
msgstr "Αυτό το πεδίο είναι υποχρεωτικό"
#: src/wtforms/validators.py:358
msgid "Invalid input."
msgstr "Λανθασμένα δεδομένα"
#: src/wtforms/validators.py:422
msgid "Invalid email address."
msgstr "Λανθασμένο email."
#: src/wtforms/validators.py:460
msgid "Invalid IP address."
msgstr "Λανθασμένη διεύθυνση IP."
#: src/wtforms/validators.py:503
msgid "Invalid Mac address."
msgstr "Λανθασμένο διεύθυνση Mac."
#: src/wtforms/validators.py:540
msgid "Invalid URL."
msgstr "Λανθασμένο URL."
#: src/wtforms/validators.py:561
msgid "Invalid UUID."
msgstr "Λανθασμένο UUID."
#: src/wtforms/validators.py:594
#, python-format
msgid "Invalid value, must be one of: %(values)s."
msgstr "Λάθος επιλογή, πρέπει να είναι ένα από: %(values)s."
#: src/wtforms/validators.py:629
#, python-format
msgid "Invalid value, can't be any of: %(values)s."
msgstr "Λάθος επιλογή, δεν μπορεί να είναι ένα από: %(values)s."
#: src/wtforms/validators.py:698
#, fuzzy
#| msgid "This field is required."
msgid "This field cannot be edited."
msgstr "Αυτό το πεδίο είναι υποχρεωτικό"
#: src/wtforms/validators.py:714
msgid "This field is disabled and cannot have a value."
msgstr ""
#: src/wtforms/csrf/core.py:96
msgid "Invalid CSRF Token."
msgstr "Λάθος CSRF"
#: src/wtforms/csrf/session.py:63
msgid "CSRF token missing."
msgstr "To CSRF δεν υπάρχει"
#: src/wtforms/csrf/session.py:71
msgid "CSRF failed."
msgstr "Αποτυχία CSRF"
#: src/wtforms/csrf/session.py:76
msgid "CSRF token expired."
msgstr "Έχει λήξει το διακριτικό CSRF"
#: src/wtforms/fields/choices.py:142
msgid "Invalid Choice: could not coerce."
msgstr "Λανθασμένη Επιλογή: δεν μετατρέπεται"
#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203
msgid "Choices cannot be None."
msgstr ""
#: src/wtforms/fields/choices.py:155
msgid "Not a valid choice."
msgstr "Άγνωστη επιλογή"
#: src/wtforms/fields/choices.py:193
msgid "Invalid choice(s): one or more data inputs could not be coerced."
msgstr "Λανθασμένη επιλογή(ές): κάποιες τιμές δεν μπορούσαν να μετατραπούν"
#: src/wtforms/fields/choices.py:214
#, fuzzy, python-format
#| msgid "'%(value)s' is not a valid choice for this field."
msgid "'%(value)s' is not a valid choice for this field."
msgid_plural "'%(value)s' are not valid choices for this field."
msgstr[0] "'%(value)s' δεν είναι έγκυρη επιλογή για αυτό το πεδίο"
msgstr[1] "'%(value)s' δεν είναι έγκυρη επιλογή για αυτό το πεδίο"
#: src/wtforms/fields/datetime.py:51
msgid "Not a valid datetime value."
msgstr "Δεν είναι σωστή ημερομηνία/ώρα"
#: src/wtforms/fields/datetime.py:77
msgid "Not a valid date value."
msgstr "Δεν είναι σωστή ημερομηνία"
#: src/wtforms/fields/datetime.py:103
msgid "Not a valid time value."
msgstr ""
#: src/wtforms/fields/datetime.py:148
#, fuzzy
#| msgid "Not a valid date value."
msgid "Not a valid week value."
msgstr "Δεν είναι σωστή ημερομηνία"
#: src/wtforms/fields/numeric.py:82 src/wtforms/fields/numeric.py:92
msgid "Not a valid integer value."
msgstr "Δεν είναι ακέραιο νούμερο"
#: src/wtforms/fields/numeric.py:168
msgid "Not a valid decimal value."
msgstr "Δεν είναι δεκαδικό"
#: src/wtforms/fields/numeric.py:197
msgid "Not a valid float value."
msgstr "Δεν είναι δεκαδικό"

View File

@@ -0,0 +1,169 @@
# English translations for WTForms.
# Copyright (C) 2020 WTForms Team
# This file is distributed under the same license as the WTForms project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
#
msgid ""
msgstr ""
"Project-Id-Version: WTForms 1.0.4\n"
"Report-Msgid-Bugs-To: wtforms@simplecodes.com\n"
"POT-Creation-Date: 2020-04-25 11:34-0700\n"
"PO-Revision-Date: 2013-04-28 15:36-0700\n"
"Last-Translator: James Crasta <james+i18n@simplecodes.com>\n"
"Language: en\n"
"Language-Team: en_US <james+i18n@simplecodes.com>\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.8.0\n"
#: src/wtforms/validators.py:87
#, python-format
msgid "Invalid field name '%s'."
msgstr "Invalid field name '%s'."
#: src/wtforms/validators.py:98
#, python-format
msgid "Field must be equal to %(other_name)s."
msgstr "Field must be equal to %(other_name)s."
#: src/wtforms/validators.py:134
#, python-format
msgid "Field must be at least %(min)d character long."
msgid_plural "Field must be at least %(min)d characters long."
msgstr[0] "Field must be at least %(min)d character long."
msgstr[1] "Field must be at least %(min)d characters long."
#: src/wtforms/validators.py:140
#, python-format
msgid "Field cannot be longer than %(max)d character."
msgid_plural "Field cannot be longer than %(max)d characters."
msgstr[0] "Field cannot be longer than %(max)d character."
msgstr[1] "Field cannot be longer than %(max)d characters."
#: src/wtforms/validators.py:146
#, python-format
msgid "Field must be exactly %(max)d character long."
msgid_plural "Field must be exactly %(max)d characters long."
msgstr[0] "Field must be exactly %(max)d character long."
msgstr[1] "Field must be exactly %(max)d characters long."
#: src/wtforms/validators.py:152
#, python-format
msgid "Field must be between %(min)d and %(max)d characters long."
msgstr "Field must be between %(min)d and %(max)d characters long."
#: src/wtforms/validators.py:197
#, python-format
msgid "Number must be at least %(min)s."
msgstr "Number must be at least %(min)s."
#: src/wtforms/validators.py:199
#, python-format
msgid "Number must be at most %(max)s."
msgstr "Number must be at most %(max)s."
#: src/wtforms/validators.py:201
#, python-format
msgid "Number must be between %(min)s and %(max)s."
msgstr "Number must be between %(min)s and %(max)s."
#: src/wtforms/validators.py:269 src/wtforms/validators.py:294
msgid "This field is required."
msgstr "This field is required."
#: src/wtforms/validators.py:327
msgid "Invalid input."
msgstr "Invalid input."
#: src/wtforms/validators.py:387
msgid "Invalid email address."
msgstr "Invalid email address."
#: src/wtforms/validators.py:423
msgid "Invalid IP address."
msgstr "Invalid IP address."
#: src/wtforms/validators.py:466
msgid "Invalid Mac address."
msgstr "Invalid MAC address."
#: src/wtforms/validators.py:501
msgid "Invalid URL."
msgstr "Invalid URL."
#: src/wtforms/validators.py:522
msgid "Invalid UUID."
msgstr "Invalid UUID."
#: src/wtforms/validators.py:553
#, python-format
msgid "Invalid value, must be one of: %(values)s."
msgstr "Invalid value, must be one of: %(values)s."
#: src/wtforms/validators.py:588
#, python-format
msgid "Invalid value, can't be any of: %(values)s."
msgstr "Invalid value, can't be any of: %(values)s."
#: src/wtforms/csrf/core.py:96
msgid "Invalid CSRF Token."
msgstr "Invalid CSRF Token."
#: src/wtforms/csrf/session.py:63
msgid "CSRF token missing."
msgstr "CSRF token missing."
#: src/wtforms/csrf/session.py:71
msgid "CSRF failed."
msgstr "CSRF failed."
#: src/wtforms/csrf/session.py:76
msgid "CSRF token expired."
msgstr "CSRF token expired."
#: src/wtforms/fields/core.py:534
msgid "Invalid Choice: could not coerce."
msgstr "Invalid Choice: could not coerce."
#: src/wtforms/fields/core.py:538
msgid "Choices cannot be None."
msgstr "Choices cannot be None."
#: src/wtforms/fields/core.py:545
msgid "Not a valid choice."
msgstr "Not a valid choice."
#: src/wtforms/fields/core.py:573
msgid "Invalid choice(s): one or more data inputs could not be coerced."
msgstr "Invalid choice(s): one or more data inputs could not be coerced."
#: src/wtforms/fields/core.py:584
#, python-format
msgid "'%(value)s' is not a valid choice for this field."
msgstr "'%(value)s' is not a valid choice for this field."
#: src/wtforms/fields/core.py:679 src/wtforms/fields/core.py:689
msgid "Not a valid integer value."
msgstr "Not a valid integer value."
#: src/wtforms/fields/core.py:760
msgid "Not a valid decimal value."
msgstr "Not a valid decimal value."
#: src/wtforms/fields/core.py:788
msgid "Not a valid float value."
msgstr "Not a valid float value."
#: src/wtforms/fields/core.py:853
msgid "Not a valid datetime value."
msgstr "Not a valid datetime value."
#: src/wtforms/fields/core.py:871
msgid "Not a valid date value."
msgstr "Not a valid date value."
#: src/wtforms/fields/core.py:889
msgid "Not a valid time value."
msgstr "Not a valid time value."

View File

@@ -0,0 +1,187 @@
# Spanish translations for WTForms.
# Copyright (C) 2020 WTForms Team
# This file is distributed under the same license as the WTForms project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
#
msgid ""
msgstr ""
"Project-Id-Version: WTForms 1.0\n"
"Report-Msgid-Bugs-To: eloi.rivard@nubla.fr\n"
"POT-Creation-Date: 2024-01-11 08:20+0100\n"
"PO-Revision-Date: 2024-01-15 09:06+0000\n"
"Last-Translator: gallegonovato <fran-carro@hotmail.es>\n"
"Language-Team: Spanish <https://hosted.weblate.org/projects/wtforms/wtforms/"
"es/>\n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.4-dev\n"
"Generated-By: Babel 2.8.0\n"
#: src/wtforms/validators.py:86
#, python-format
msgid "Invalid field name '%s'."
msgstr "Nombre de campo inválido '%s'."
#: src/wtforms/validators.py:99
#, python-format
msgid "Field must be equal to %(other_name)s."
msgstr "El campo debe coincidir con %(other_name)s."
#: src/wtforms/validators.py:145
#, python-format
msgid "Field must be at least %(min)d character long."
msgid_plural "Field must be at least %(min)d characters long."
msgstr[0] "El campo debe tener al menos %(min)d caracter."
msgstr[1] "El campo debe tener al menos %(min)d caracteres."
#: src/wtforms/validators.py:151
#, python-format
msgid "Field cannot be longer than %(max)d character."
msgid_plural "Field cannot be longer than %(max)d characters."
msgstr[0] "El campo no puede tener más de %(max)d caracter."
msgstr[1] "El campo no puede tener más de %(max)d caracteres."
#: src/wtforms/validators.py:157
#, python-format
msgid "Field must be exactly %(max)d character long."
msgid_plural "Field must be exactly %(max)d characters long."
msgstr[0] "El campo debe ser exactamente %(max)d caracter."
msgstr[1] "El campo debe ser exactamente %(max)d caracteres."
#: src/wtforms/validators.py:163
#, python-format
msgid "Field must be between %(min)d and %(max)d characters long."
msgstr "El campo debe tener entre %(min)d y %(max)d caracteres."
#: src/wtforms/validators.py:216
#, python-format
msgid "Number must be at least %(min)s."
msgstr "El número debe ser mayor que %(min)s."
#: src/wtforms/validators.py:219
#, python-format
msgid "Number must be at most %(max)s."
msgstr "El número debe ser menor que %(max)s."
#: src/wtforms/validators.py:222
#, python-format
msgid "Number must be between %(min)s and %(max)s."
msgstr "El número debe estar entre %(min)s y %(max)s."
#: src/wtforms/validators.py:293 src/wtforms/validators.py:323
msgid "This field is required."
msgstr "Este campo es obligatorio."
#: src/wtforms/validators.py:358
msgid "Invalid input."
msgstr "Valor inválido."
#: src/wtforms/validators.py:422
msgid "Invalid email address."
msgstr "Email inválido."
#: src/wtforms/validators.py:460
msgid "Invalid IP address."
msgstr "Dirección IP inválida."
#: src/wtforms/validators.py:503
msgid "Invalid Mac address."
msgstr "Dirección MAC inválida."
#: src/wtforms/validators.py:540
msgid "Invalid URL."
msgstr "URL inválida."
#: src/wtforms/validators.py:561
msgid "Invalid UUID."
msgstr "UUID inválido."
#: src/wtforms/validators.py:594
#, python-format
msgid "Invalid value, must be one of: %(values)s."
msgstr "Valor inválido, debe ser uno de: %(values)s."
#: src/wtforms/validators.py:629
#, python-format
msgid "Invalid value, can't be any of: %(values)s."
msgstr "Valor inválido, no puede ser ninguno de: %(values)s."
#: src/wtforms/validators.py:698
msgid "This field cannot be edited."
msgstr "Este campo no se puede editar."
#: src/wtforms/validators.py:714
msgid "This field is disabled and cannot have a value."
msgstr "Este campo está desactivado y no puede tener un valor."
#: src/wtforms/csrf/core.py:96
msgid "Invalid CSRF Token."
msgstr "El token CSRF es incorrecto."
#: src/wtforms/csrf/session.py:63
msgid "CSRF token missing."
msgstr "El token CSRF falta."
#: src/wtforms/csrf/session.py:71
msgid "CSRF failed."
msgstr "Fallo CSRF."
#: src/wtforms/csrf/session.py:76
msgid "CSRF token expired."
msgstr "El token CSRF ha expirado."
#: src/wtforms/fields/choices.py:142
msgid "Invalid Choice: could not coerce."
msgstr "Elección inválida: no se puede ajustar."
#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203
msgid "Choices cannot be None."
msgstr "La elección no puede ser None."
#: src/wtforms/fields/choices.py:155
msgid "Not a valid choice."
msgstr "Opción inválida."
#: src/wtforms/fields/choices.py:193
msgid "Invalid choice(s): one or more data inputs could not be coerced."
msgstr ""
"Opción(es) inválida(s): una o más entradas de datos no pueden ser "
"coaccionadas."
#: src/wtforms/fields/choices.py:214
#, python-format
msgid "'%(value)s' is not a valid choice for this field."
msgid_plural "'%(value)s' are not valid choices for this field."
msgstr[0] "%(value)s' no es una opción válida para este campo."
msgstr[1] "%(value)s' no son opciones válidas para este campo."
#: src/wtforms/fields/datetime.py:51
msgid "Not a valid datetime value."
msgstr "No es un valor para la fecha y la hora válido."
#: src/wtforms/fields/datetime.py:77
msgid "Not a valid date value."
msgstr "No es una fecha válida."
#: src/wtforms/fields/datetime.py:103
msgid "Not a valid time value."
msgstr "No es un tiempo válido."
#: src/wtforms/fields/datetime.py:148
msgid "Not a valid week value."
msgstr "No es un valor semanal válido."
#: src/wtforms/fields/numeric.py:82 src/wtforms/fields/numeric.py:92
msgid "Not a valid integer value."
msgstr "No es un valor entero válido."
#: src/wtforms/fields/numeric.py:168
msgid "Not a valid decimal value."
msgstr "No es un numero decimal válido."
#: src/wtforms/fields/numeric.py:197
msgid "Not a valid float value."
msgstr "No es un número de punto flotante válido."

View File

@@ -0,0 +1,188 @@
# Estonian translations for WTForms.
# Copyright (C) 2020 WTForms Team
# This file is distributed under the same license as the WTForms project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
#
msgid ""
msgstr ""
"Project-Id-Version: WTForms 1.0.6dev\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-01-11 08:20+0100\n"
"PO-Revision-Date: 2013-09-22 12:37+0300\n"
"Last-Translator: Laur Mõtus <laur@povi.ee>\n"
"Language-Team: Estonian <kde-i18n-doc@kde.org>\n"
"Language: et\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
"Generated-By: Babel 2.8.0\n"
#: src/wtforms/validators.py:86
#, python-format
msgid "Invalid field name '%s'."
msgstr "Vigane välja nimi: '%s'."
#: src/wtforms/validators.py:99
#, python-format
msgid "Field must be equal to %(other_name)s."
msgstr "Väli peab võrduma %(other_name)s -ga."
#: src/wtforms/validators.py:145
#, python-format
msgid "Field must be at least %(min)d character long."
msgid_plural "Field must be at least %(min)d characters long."
msgstr[0] "Väli peab olema vähemalt %(min)d tähemärgi pikkune."
msgstr[1] "Väli peab olema vähemalt %(min)d tähemärgi pikkune."
#: src/wtforms/validators.py:151
#, python-format
msgid "Field cannot be longer than %(max)d character."
msgid_plural "Field cannot be longer than %(max)d characters."
msgstr[0] "Väli ei tohi olla üle %(max)d tähemärgi pikk."
msgstr[1] "Väli ei tohi olla üle %(max)d tähemärgi pikk."
#: src/wtforms/validators.py:157
#, python-format
msgid "Field must be exactly %(max)d character long."
msgid_plural "Field must be exactly %(max)d characters long."
msgstr[0] ""
msgstr[1] ""
#: src/wtforms/validators.py:163
#, python-format
msgid "Field must be between %(min)d and %(max)d characters long."
msgstr "Välja pikkus peab olema vahemikus %(min)d - %(max)d."
#: src/wtforms/validators.py:216
#, python-format
msgid "Number must be at least %(min)s."
msgstr "Number peab olema vähemalt %(min)s."
#: src/wtforms/validators.py:219
#, python-format
msgid "Number must be at most %(max)s."
msgstr "Number tohib olla maksimaalselt %(max)s."
#: src/wtforms/validators.py:222
#, python-format
msgid "Number must be between %(min)s and %(max)s."
msgstr "Number peab olema vahemikus %(min)s - %(max)s."
#: src/wtforms/validators.py:293 src/wtforms/validators.py:323
msgid "This field is required."
msgstr "Kohustuslik väli."
#: src/wtforms/validators.py:358
msgid "Invalid input."
msgstr "Vigane sisend."
#: src/wtforms/validators.py:422
msgid "Invalid email address."
msgstr "Vigane e-posti aadress."
#: src/wtforms/validators.py:460
msgid "Invalid IP address."
msgstr "Vigane IP aadress."
#: src/wtforms/validators.py:503
msgid "Invalid Mac address."
msgstr "Vigane MAC aadress."
#: src/wtforms/validators.py:540
msgid "Invalid URL."
msgstr "Vigane URL."
#: src/wtforms/validators.py:561
msgid "Invalid UUID."
msgstr "Vigane UUID."
#: src/wtforms/validators.py:594
#, python-format
msgid "Invalid value, must be one of: %(values)s."
msgstr "Vigane väärtus, peaks hoopis olema üks järgmistest: %(values)s."
#: src/wtforms/validators.py:629
#, python-format
msgid "Invalid value, can't be any of: %(values)s."
msgstr "Vigane väärtus, ei tohi olla ükski järgnevatest: %(values)s."
#: src/wtforms/validators.py:698
#, fuzzy
#| msgid "This field is required."
msgid "This field cannot be edited."
msgstr "Kohustuslik väli."
#: src/wtforms/validators.py:714
msgid "This field is disabled and cannot have a value."
msgstr ""
#: src/wtforms/csrf/core.py:96
msgid "Invalid CSRF Token."
msgstr "Vigane CSRF tunnus"
#: src/wtforms/csrf/session.py:63
msgid "CSRF token missing."
msgstr "Puudub CSRF tunnus"
#: src/wtforms/csrf/session.py:71
msgid "CSRF failed."
msgstr "CSRF nurjus"
#: src/wtforms/csrf/session.py:76
msgid "CSRF token expired."
msgstr "CSRF tunnus on aegunud"
#: src/wtforms/fields/choices.py:142
msgid "Invalid Choice: could not coerce."
msgstr "Vigane valik: ei saa teisendada"
#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203
msgid "Choices cannot be None."
msgstr ""
#: src/wtforms/fields/choices.py:155
msgid "Not a valid choice."
msgstr "Pole korrektne valik"
#: src/wtforms/fields/choices.py:193
msgid "Invalid choice(s): one or more data inputs could not be coerced."
msgstr "Vigane valik: ühte või rohkemat andmesisendit ei saa teisendada"
#: src/wtforms/fields/choices.py:214
#, fuzzy, python-format
#| msgid "'%(value)s' is not a valid choice for this field."
msgid "'%(value)s' is not a valid choice for this field."
msgid_plural "'%(value)s' are not valid choices for this field."
msgstr[0] "'%(value)s' pole sellele väljale korrektne valik"
msgstr[1] "'%(value)s' pole sellele väljale korrektne valik"
#: src/wtforms/fields/datetime.py:51
msgid "Not a valid datetime value."
msgstr "Pole korrektne kuupäeva/kellaaja väärtus"
#: src/wtforms/fields/datetime.py:77
msgid "Not a valid date value."
msgstr "Pole korrektne kuupäevaline väärtus"
#: src/wtforms/fields/datetime.py:103
msgid "Not a valid time value."
msgstr ""
#: src/wtforms/fields/datetime.py:148
#, fuzzy
#| msgid "Not a valid date value."
msgid "Not a valid week value."
msgstr "Pole korrektne kuupäevaline väärtus"
#: src/wtforms/fields/numeric.py:82 src/wtforms/fields/numeric.py:92
msgid "Not a valid integer value."
msgstr "Pole korrektne täisarvuline väärtus"
#: src/wtforms/fields/numeric.py:168
msgid "Not a valid decimal value."
msgstr "Pole korrektne kümnendarvuline väärtus"
#: src/wtforms/fields/numeric.py:197
msgid "Not a valid float value."
msgstr "Pole korrektne ujukomaarvuline väärtus"

View File

@@ -0,0 +1,187 @@
# persian translations for WTForms.
# Copyright (C) 2020 WTForms Team
# This file is distributed under the same license as the WTForms project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
#
msgid ""
msgstr ""
"Project-Id-Version: WTForms 1.0.3\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-01-11 08:20+0100\n"
"PO-Revision-Date: 2013-01-20 16:49+0330\n"
"Last-Translator: mohammad Efazati <mohammad@efazati.org>\n"
"Language-Team: fa <mohammad@efazati.org>\n"
"Language: persian\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.8.0\n"
#: src/wtforms/validators.py:86
#, python-format
msgid "Invalid field name '%s'."
msgstr "فیلد '%s' اشتباه است."
#: src/wtforms/validators.py:99
#, python-format
msgid "Field must be equal to %(other_name)s."
msgstr "مقدار فیلد باید برابر %(other_name)s باشد."
#: src/wtforms/validators.py:145
#, python-format
msgid "Field must be at least %(min)d character long."
msgid_plural "Field must be at least %(min)d characters long."
msgstr[0] "طول فیلد حداقل باید %(min)d حرف باشد."
msgstr[1] "طول فیلد حداقل باید %(min)d حرف باشد."
#: src/wtforms/validators.py:151
#, python-format
msgid "Field cannot be longer than %(max)d character."
msgid_plural "Field cannot be longer than %(max)d characters."
msgstr[0] "طول فیلد حداکثر باید %(max)d حرف باشد."
msgstr[1] "طول فیلد حداکثر باید %(max)d حرف باشد."
#: src/wtforms/validators.py:157
#, python-format
msgid "Field must be exactly %(max)d character long."
msgid_plural "Field must be exactly %(max)d characters long."
msgstr[0] ""
msgstr[1] ""
#: src/wtforms/validators.py:163
#, python-format
msgid "Field must be between %(min)d and %(max)d characters long."
msgstr "طول فیلد باید بین %(min)d تا %(max)d حرف باشد."
#: src/wtforms/validators.py:216
#, python-format
msgid "Number must be at least %(min)s."
msgstr "عدد باید از %(min)s بزرگتر باشد."
#: src/wtforms/validators.py:219
#, python-format
msgid "Number must be at most %(max)s."
msgstr "عدد باید از %(max)s. کوچکتر باشد."
#: src/wtforms/validators.py:222
#, python-format
msgid "Number must be between %(min)s and %(max)s."
msgstr "عدد باید بین %(min)s تا %(max)s باشد."
#: src/wtforms/validators.py:293 src/wtforms/validators.py:323
msgid "This field is required."
msgstr "این فیلد اجباریست."
#: src/wtforms/validators.py:358
msgid "Invalid input."
msgstr "ورودی اشتباه است."
#: src/wtforms/validators.py:422
msgid "Invalid email address."
msgstr "آدرس پست الکترونیک اشتباه است."
#: src/wtforms/validators.py:460
msgid "Invalid IP address."
msgstr "آدرس IP اشتباه است."
#: src/wtforms/validators.py:503
msgid "Invalid Mac address."
msgstr "آدرس MAC اشتباه است."
#: src/wtforms/validators.py:540
msgid "Invalid URL."
msgstr "آدرس وب سایت وارد شده اشتباه است."
#: src/wtforms/validators.py:561
msgid "Invalid UUID."
msgstr "UUID اشتباده است."
#: src/wtforms/validators.py:594
#, python-format
msgid "Invalid value, must be one of: %(values)s."
msgstr "ورودی اشتباه است. باید یکی از %(values)s باشد."
#: src/wtforms/validators.py:629
#, python-format
msgid "Invalid value, can't be any of: %(values)s."
msgstr "ورودی اشتباه است. نباید یکی از %(values)s باشد."
#: src/wtforms/validators.py:698
#, fuzzy
#| msgid "This field is required."
msgid "This field cannot be edited."
msgstr "این فیلد اجباریست."
#: src/wtforms/validators.py:714
msgid "This field is disabled and cannot have a value."
msgstr ""
#: src/wtforms/csrf/core.py:96
msgid "Invalid CSRF Token."
msgstr "مقدار کلید امنیتی اشتباه است."
#: src/wtforms/csrf/session.py:63
msgid "CSRF token missing."
msgstr "مقدار کلید امنیتی در درخواست شما نیست."
#: src/wtforms/csrf/session.py:71
msgid "CSRF failed."
msgstr "کلید امنیتی با خطا مواجه شد."
#: src/wtforms/csrf/session.py:76
msgid "CSRF token expired."
msgstr "زمان استفاده از کلید امنیتی به اتمام رسیده است."
#: src/wtforms/fields/choices.py:142
msgid "Invalid Choice: could not coerce."
msgstr "انتخاب شما اشتباه است. ورودی قابل بررسی نیست."
#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203
msgid "Choices cannot be None."
msgstr ""
#: src/wtforms/fields/choices.py:155
msgid "Not a valid choice."
msgstr "انتخاب درستی نیست."
#: src/wtforms/fields/choices.py:193
msgid "Invalid choice(s): one or more data inputs could not be coerced."
msgstr "انتخاب شما اشتباه است. یک یا چند تا از ورودی ها قابل بررسی نیست."
#: src/wtforms/fields/choices.py:214
#, fuzzy, python-format
#| msgid "'%(value)s' is not a valid choice for this field."
msgid "'%(value)s' is not a valid choice for this field."
msgid_plural "'%(value)s' are not valid choices for this field."
msgstr[0] "'%(value)s انتخاب مناسبی برای این فیلد نیست."
msgstr[1] "'%(value)s انتخاب مناسبی برای این فیلد نیست."
#: src/wtforms/fields/datetime.py:51
msgid "Not a valid datetime value."
msgstr "مقداری که وارد کردید، تاریخ نیست."
#: src/wtforms/fields/datetime.py:77
msgid "Not a valid date value."
msgstr "مقداری که وارد کردید، تاریخ نیست."
#: src/wtforms/fields/datetime.py:103
msgid "Not a valid time value."
msgstr ""
#: src/wtforms/fields/datetime.py:148
#, fuzzy
#| msgid "Not a valid date value."
msgid "Not a valid week value."
msgstr "مقداری که وارد کردید، تاریخ نیست."
#: src/wtforms/fields/numeric.py:82 src/wtforms/fields/numeric.py:92
msgid "Not a valid integer value."
msgstr "یک عدد درست نیست."
#: src/wtforms/fields/numeric.py:168
msgid "Not a valid decimal value."
msgstr "یک عدد اعشاری درست نیست."
#: src/wtforms/fields/numeric.py:197
msgid "Not a valid float value."
msgstr "یک عدد اعشاری درست نیست."

View File

@@ -0,0 +1,188 @@
# Finnish translations for WTForms.
# Copyright (C) 2020 WTForms Team
# This file is distributed under the same license as the WTForms project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
#
msgid ""
msgstr ""
"Project-Id-Version: WTForms 2.0dev\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-01-11 08:20+0100\n"
"PO-Revision-Date: 2016-06-13 15:16+0300\n"
"Last-Translator: Teijo Mursu <zcmander+wtforms@gmail.com>\n"
"Language-Team: fi <LL@li.org>\n"
"Language: fi\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
"Generated-By: Babel 2.8.0\n"
#: src/wtforms/validators.py:86
#, python-format
msgid "Invalid field name '%s'."
msgstr "Epäkelpo kentän nimi '%s'."
#: src/wtforms/validators.py:99
#, python-format
msgid "Field must be equal to %(other_name)s."
msgstr "Täytyy olla sama kuin %(other_name)s."
#: src/wtforms/validators.py:145
#, python-format
msgid "Field must be at least %(min)d character long."
msgid_plural "Field must be at least %(min)d characters long."
msgstr[0] "Täytyy olla vähintään %(min)d merkki."
msgstr[1] "Täytyy olla vähintään %(min)d merkkiä."
#: src/wtforms/validators.py:151
#, python-format
msgid "Field cannot be longer than %(max)d character."
msgid_plural "Field cannot be longer than %(max)d characters."
msgstr[0] "Ei voi olla pidempi kuin %(max)d merkki."
msgstr[1] "Ei voi olla pidempi kuin %(max)d merkkiä."
#: src/wtforms/validators.py:157
#, python-format
msgid "Field must be exactly %(max)d character long."
msgid_plural "Field must be exactly %(max)d characters long."
msgstr[0] ""
msgstr[1] ""
#: src/wtforms/validators.py:163
#, python-format
msgid "Field must be between %(min)d and %(max)d characters long."
msgstr "Täytyy olla pidempi kuin %(min)d ja lyhyempi kuin %(max)d."
#: src/wtforms/validators.py:216
#, python-format
msgid "Number must be at least %(min)s."
msgstr "Vähintään %(min)s."
#: src/wtforms/validators.py:219
#, python-format
msgid "Number must be at most %(max)s."
msgstr "Enintään %(max)s."
#: src/wtforms/validators.py:222
#, python-format
msgid "Number must be between %(min)s and %(max)s."
msgstr "Täytyy olla välillä %(min)s - %(max)s."
#: src/wtforms/validators.py:293 src/wtforms/validators.py:323
msgid "This field is required."
msgstr "Pakollinen."
#: src/wtforms/validators.py:358
msgid "Invalid input."
msgstr "Virheellinen syöte."
#: src/wtforms/validators.py:422
msgid "Invalid email address."
msgstr "Virheellinen sähköpostiosoite."
#: src/wtforms/validators.py:460
msgid "Invalid IP address."
msgstr "Virheellinen IP-osoite"
#: src/wtforms/validators.py:503
msgid "Invalid Mac address."
msgstr "Virheellinen MAC-osoite."
#: src/wtforms/validators.py:540
msgid "Invalid URL."
msgstr "Virheellinen URL-osoite."
#: src/wtforms/validators.py:561
msgid "Invalid UUID."
msgstr "Virheellinen UUID-tunnus."
#: src/wtforms/validators.py:594
#, python-format
msgid "Invalid value, must be one of: %(values)s."
msgstr "Epäkelpo arvo, täytyy olla yksi seuraavista: %(values)s."
#: src/wtforms/validators.py:629
#, python-format
msgid "Invalid value, can't be any of: %(values)s."
msgstr "Epäkelpo arvo, ei voi olla yksi seuraavista: %(values)s."
#: src/wtforms/validators.py:698
#, fuzzy
#| msgid "This field is required."
msgid "This field cannot be edited."
msgstr "Pakollinen."
#: src/wtforms/validators.py:714
msgid "This field is disabled and cannot have a value."
msgstr ""
#: src/wtforms/csrf/core.py:96
msgid "Invalid CSRF Token."
msgstr "Virheellienen CSRF-tunnus."
#: src/wtforms/csrf/session.py:63
msgid "CSRF token missing."
msgstr "CSRF-tunnus puuttuu."
#: src/wtforms/csrf/session.py:71
msgid "CSRF failed."
msgstr "CSRF epäonnistui"
#: src/wtforms/csrf/session.py:76
msgid "CSRF token expired."
msgstr "CSRF-tunnus vanhentunut"
#: src/wtforms/fields/choices.py:142
msgid "Invalid Choice: could not coerce."
msgstr "Virheellinen valinta: ei voida muuntaa"
#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203
msgid "Choices cannot be None."
msgstr ""
#: src/wtforms/fields/choices.py:155
msgid "Not a valid choice."
msgstr "Virheellinen valinta"
#: src/wtforms/fields/choices.py:193
msgid "Invalid choice(s): one or more data inputs could not be coerced."
msgstr "Virheellinen valinta: Yksi tai useampaa syötettä ei voitu muuntaa"
#: src/wtforms/fields/choices.py:214
#, fuzzy, python-format
#| msgid "'%(value)s' is not a valid choice for this field."
msgid "'%(value)s' is not a valid choice for this field."
msgid_plural "'%(value)s' are not valid choices for this field."
msgstr[0] "'%(value)s' ei ole kelvollinen valinta tälle kentälle"
msgstr[1] "'%(value)s' ei ole kelvollinen valinta tälle kentälle"
#: src/wtforms/fields/datetime.py:51
msgid "Not a valid datetime value."
msgstr "Ei ole kelvollinen päivämäärä ja aika -arvo"
#: src/wtforms/fields/datetime.py:77
msgid "Not a valid date value."
msgstr "Ei ole kelvollinen päivämäärä-arvo"
#: src/wtforms/fields/datetime.py:103
msgid "Not a valid time value."
msgstr ""
#: src/wtforms/fields/datetime.py:148
#, fuzzy
#| msgid "Not a valid date value."
msgid "Not a valid week value."
msgstr "Ei ole kelvollinen päivämäärä-arvo"
#: src/wtforms/fields/numeric.py:82 src/wtforms/fields/numeric.py:92
msgid "Not a valid integer value."
msgstr "Ei ole kelvollinen kokonaisluku"
#: src/wtforms/fields/numeric.py:168
msgid "Not a valid decimal value."
msgstr "Ei ole kelvollinen desimaaliluku"
#: src/wtforms/fields/numeric.py:197
msgid "Not a valid float value."
msgstr "Ei ole kelvollinen liukuluku"

View File

@@ -0,0 +1,188 @@
# French translations for WTForms.
# Copyright (C) 2020 WTForms Team
# This file is distributed under the same license as the WTForms project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
# Stéphane Raimbault <stephane.raimbault@gmail.com>, 2020.
#
msgid ""
msgstr ""
"Project-Id-Version: WTForms 1.0.3\n"
"Report-Msgid-Bugs-To: eloi.rivard@nubla.fr\n"
"POT-Creation-Date: 2024-01-11 08:20+0100\n"
"PO-Revision-Date: 2024-01-11 20:06+0000\n"
"Last-Translator: Éloi Rivard <eloi.rivard@nubla.fr>\n"
"Language-Team: French <https://hosted.weblate.org/projects/wtforms/wtforms/"
"fr/>\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 5.4-dev\n"
"Generated-By: Babel 2.8.0\n"
#: src/wtforms/validators.py:86
#, python-format
msgid "Invalid field name '%s'."
msgstr "Nom de champ non valide « %s »."
#: src/wtforms/validators.py:99
#, python-format
msgid "Field must be equal to %(other_name)s."
msgstr "Le champ doit être égal à %(other_name)s."
#: src/wtforms/validators.py:145
#, python-format
msgid "Field must be at least %(min)d character long."
msgid_plural "Field must be at least %(min)d characters long."
msgstr[0] "Le champ doit contenir au moins %(min)d caractère."
msgstr[1] "Le champ doit contenir au moins %(min)d caractères."
#: src/wtforms/validators.py:151
#, python-format
msgid "Field cannot be longer than %(max)d character."
msgid_plural "Field cannot be longer than %(max)d characters."
msgstr[0] "Le champ ne peut pas contenir plus de %(max)d caractère."
msgstr[1] "Le champ ne peut pas contenir plus de %(max)d caractères."
#: src/wtforms/validators.py:157
#, python-format
msgid "Field must be exactly %(max)d character long."
msgid_plural "Field must be exactly %(max)d characters long."
msgstr[0] "Le champ doit contenir exactement %(max)d caractère."
msgstr[1] "Le champ doit contenir exactement %(max)d caractères."
#: src/wtforms/validators.py:163
#, python-format
msgid "Field must be between %(min)d and %(max)d characters long."
msgstr ""
"La longueur du champ doit être comprise entre %(min)d et %(max)d caractères."
#: src/wtforms/validators.py:216
#, python-format
msgid "Number must be at least %(min)s."
msgstr "Le nombre doit être au minimum %(min)s."
#: src/wtforms/validators.py:219
#, python-format
msgid "Number must be at most %(max)s."
msgstr "Le nombre doit être au maximum %(max)s."
#: src/wtforms/validators.py:222
#, python-format
msgid "Number must be between %(min)s and %(max)s."
msgstr "Le nombre doit être compris entre %(min)s et %(max)s."
#: src/wtforms/validators.py:293 src/wtforms/validators.py:323
msgid "This field is required."
msgstr "Ce champ est requis."
#: src/wtforms/validators.py:358
msgid "Invalid input."
msgstr "Saisie non valide."
#: src/wtforms/validators.py:422
msgid "Invalid email address."
msgstr "Adresse électronique non valide."
#: src/wtforms/validators.py:460
msgid "Invalid IP address."
msgstr "Adresse IP non valide."
#: src/wtforms/validators.py:503
msgid "Invalid Mac address."
msgstr "Adresse MAC non valide."
#: src/wtforms/validators.py:540
msgid "Invalid URL."
msgstr "URL non valide."
#: src/wtforms/validators.py:561
msgid "Invalid UUID."
msgstr "UUID non valide."
#: src/wtforms/validators.py:594
#, python-format
msgid "Invalid value, must be one of: %(values)s."
msgstr "Valeur non valide, doit être parmi : %(values)s."
#: src/wtforms/validators.py:629
#, python-format
msgid "Invalid value, can't be any of: %(values)s."
msgstr "Valeur non valide, ne peut contenir : %(values)s."
#: src/wtforms/validators.py:698
msgid "This field cannot be edited."
msgstr "Ce champ nest pas éditable."
#: src/wtforms/validators.py:714
msgid "This field is disabled and cannot have a value."
msgstr "Ce champ est désactivé et ne peut avoir de valeur."
#: src/wtforms/csrf/core.py:96
msgid "Invalid CSRF Token."
msgstr "Jeton CSRF non valide."
#: src/wtforms/csrf/session.py:63
msgid "CSRF token missing."
msgstr "Jeton CSRF manquant."
#: src/wtforms/csrf/session.py:71
msgid "CSRF failed."
msgstr "CSRF a échoué."
#: src/wtforms/csrf/session.py:76
msgid "CSRF token expired."
msgstr "Jeton CSRF expiré."
#: src/wtforms/fields/choices.py:142
msgid "Invalid Choice: could not coerce."
msgstr "Choix non valide, ne peut pas être converti."
#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203
msgid "Choices cannot be None."
msgstr "Vous devez choisir au moins un élément."
#: src/wtforms/fields/choices.py:155
msgid "Not a valid choice."
msgstr "N'est pas un choix valide."
#: src/wtforms/fields/choices.py:193
msgid "Invalid choice(s): one or more data inputs could not be coerced."
msgstr ""
"Choix incorrect, une ou plusieurs saisies ne peuvent pas être converties."
#: src/wtforms/fields/choices.py:214
#, python-format
msgid "'%(value)s' is not a valid choice for this field."
msgid_plural "'%(value)s' are not valid choices for this field."
msgstr[0] "« %(value)s » n'est pas un choix valide pour ce champ."
msgstr[1] "« %(value)s » n'est pas un choix valide pour ce champ."
#: src/wtforms/fields/datetime.py:51
msgid "Not a valid datetime value."
msgstr "N'est pas une date/heure valide."
#: src/wtforms/fields/datetime.py:77
msgid "Not a valid date value."
msgstr "N'est pas une date valide."
#: src/wtforms/fields/datetime.py:103
msgid "Not a valid time value."
msgstr "N'est pas un horaire valide."
#: src/wtforms/fields/datetime.py:148
msgid "Not a valid week value."
msgstr "N'est pas une semaine valide."
#: src/wtforms/fields/numeric.py:82 src/wtforms/fields/numeric.py:92
msgid "Not a valid integer value."
msgstr "N'est pas un entier valide."
#: src/wtforms/fields/numeric.py:168
msgid "Not a valid decimal value."
msgstr "N'est pas une valeur décimale valide."
#: src/wtforms/fields/numeric.py:197
msgid "Not a valid float value."
msgstr "N'est pas un flottant valide."

View File

@@ -0,0 +1,188 @@
# Hebrew translations for WTForms.
# Copyright (C) 2020 WTForms Team
# This file is distributed under the same license as the WTForms project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
#
msgid ""
msgstr ""
"Project-Id-Version: WTForms 2.0dev\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-01-11 08:20+0100\n"
"PO-Revision-Date: 2017-04-19 00:41+0300\n"
"Last-Translator: Tomer Levy <tmrlvi@gmail.com>\n"
"Language-Team: he <LL@li.org>\n"
"Language: he\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
"Generated-By: Babel 2.8.0\n"
#: src/wtforms/validators.py:86
#, python-format
msgid "Invalid field name '%s'."
msgstr "שם שדה לא תקין: '%s'"
#: src/wtforms/validators.py:99
#, python-format
msgid "Field must be equal to %(other_name)s."
msgstr "שדה חייב להיות זהה ל-%(other_name)s."
#: src/wtforms/validators.py:145
#, python-format
msgid "Field must be at least %(min)d character long."
msgid_plural "Field must be at least %(min)d characters long."
msgstr[0] "שדה חייב להכיל לפחות %(min)d תו."
msgstr[1] "שדה חייב להכיל לפחות %(min)d תווים."
#: src/wtforms/validators.py:151
#, python-format
msgid "Field cannot be longer than %(max)d character."
msgid_plural "Field cannot be longer than %(max)d characters."
msgstr[0] "שדה אינו יכול להכיל יותר מ-%(max)d תו"
msgstr[1] "שדה אינו יכול להכיל יותר מ-%(max)d תווים"
#: src/wtforms/validators.py:157
#, python-format
msgid "Field must be exactly %(max)d character long."
msgid_plural "Field must be exactly %(max)d characters long."
msgstr[0] ""
msgstr[1] ""
#: src/wtforms/validators.py:163
#, python-format
msgid "Field must be between %(min)d and %(max)d characters long."
msgstr "שדה חייב להכיל בין %(min)d ל-%(max)d תווים"
#: src/wtforms/validators.py:216
#, python-format
msgid "Number must be at least %(min)s."
msgstr "מספר חייב להיות לפחות %(min)s."
#: src/wtforms/validators.py:219
#, python-format
msgid "Number must be at most %(max)s."
msgstr "מספר חייב להיות לכל היותר %(max)s."
#: src/wtforms/validators.py:222
#, python-format
msgid "Number must be between %(min)s and %(max)s."
msgstr "מספר חייב להיות בין %(min)s ו-%(max)s."
#: src/wtforms/validators.py:293 src/wtforms/validators.py:323
msgid "This field is required."
msgstr "חובה למלא שדה זה."
#: src/wtforms/validators.py:358
msgid "Invalid input."
msgstr "קלט לא תקין."
#: src/wtforms/validators.py:422
msgid "Invalid email address."
msgstr "כתובת מייל לא תקינה."
#: src/wtforms/validators.py:460
msgid "Invalid IP address."
msgstr "כתובת IP לא תקינה."
#: src/wtforms/validators.py:503
msgid "Invalid Mac address."
msgstr "כתובת Mac לא תקינה."
#: src/wtforms/validators.py:540
msgid "Invalid URL."
msgstr "URL לא תקין."
#: src/wtforms/validators.py:561
msgid "Invalid UUID."
msgstr "UUID לא תקין."
#: src/wtforms/validators.py:594
#, python-format
msgid "Invalid value, must be one of: %(values)s."
msgstr "ערך לא חוקי, חייב להיות מתוך: %(values)s."
#: src/wtforms/validators.py:629
#, python-format
msgid "Invalid value, can't be any of: %(values)s."
msgstr "ערך לא חוקי, לא יכול להיות מתוך: %(values)s."
#: src/wtforms/validators.py:698
#, fuzzy
#| msgid "This field is required."
msgid "This field cannot be edited."
msgstr "חובה למלא שדה זה."
#: src/wtforms/validators.py:714
msgid "This field is disabled and cannot have a value."
msgstr ""
#: src/wtforms/csrf/core.py:96
msgid "Invalid CSRF Token."
msgstr "מזהה CSRF לא תקין"
#: src/wtforms/csrf/session.py:63
msgid "CSRF token missing."
msgstr "מזהה CSRF חסר"
#: src/wtforms/csrf/session.py:71
msgid "CSRF failed."
msgstr "CSRF נכשל"
#: src/wtforms/csrf/session.py:76
msgid "CSRF token expired."
msgstr "מזהה CSRF פג תוקף"
#: src/wtforms/fields/choices.py:142
msgid "Invalid Choice: could not coerce."
msgstr ""
#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203
msgid "Choices cannot be None."
msgstr ""
#: src/wtforms/fields/choices.py:155
msgid "Not a valid choice."
msgstr "לא בחירה חוקית"
#: src/wtforms/fields/choices.py:193
msgid "Invalid choice(s): one or more data inputs could not be coerced."
msgstr "בחירה\\ות לא תקינה: לא ניתן לכפות סוג על קלט אחד או יותר"
#: src/wtforms/fields/choices.py:214
#, fuzzy, python-format
#| msgid "'%(value)s' is not a valid choice for this field."
msgid "'%(value)s' is not a valid choice for this field."
msgid_plural "'%(value)s' are not valid choices for this field."
msgstr[0] "'%(value)s' אינו בחירה תקינה עבור השדה הזה"
msgstr[1] "'%(value)s' אינו בחירה תקינה עבור השדה הזה"
#: src/wtforms/fields/datetime.py:51
msgid "Not a valid datetime value."
msgstr "לא ערך תאריך-זמן תקין"
#: src/wtforms/fields/datetime.py:77
msgid "Not a valid date value."
msgstr "לא תאריך תקין"
#: src/wtforms/fields/datetime.py:103
msgid "Not a valid time value."
msgstr ""
#: src/wtforms/fields/datetime.py:148
#, fuzzy
#| msgid "Not a valid date value."
msgid "Not a valid week value."
msgstr "לא תאריך תקין"
#: src/wtforms/fields/numeric.py:82 src/wtforms/fields/numeric.py:92
msgid "Not a valid integer value."
msgstr "לא מספר שלם תקין"
#: src/wtforms/fields/numeric.py:168
msgid "Not a valid decimal value."
msgstr "לא מספר עשרוני"
#: src/wtforms/fields/numeric.py:197
msgid "Not a valid float value."
msgstr "לא מספר מסוג float"

View File

@@ -0,0 +1,188 @@
# Hungarian translations for WTForms.
# Copyright (C) 2020 WTForms Team
# This file is distributed under the same license as the WTForms project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
#
msgid ""
msgstr ""
"Project-Id-Version: WTForms 2.0dev\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-01-11 08:20+0100\n"
"PO-Revision-Date: 2016-09-27 13:09-0400\n"
"Last-Translator: Zoltan Fedor <zoltan.0.fedor@gmail.com>\n"
"Language-Team: Hungarian <>\n"
"Language: hu\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
"Generated-By: Babel 2.8.0\n"
#: src/wtforms/validators.py:86
#, python-format
msgid "Invalid field name '%s'."
msgstr "Érvénytelen mező '%s'."
#: src/wtforms/validators.py:99
#, python-format
msgid "Field must be equal to %(other_name)s."
msgstr "A mező értéke %(other_name)s kell hogy legyen."
#: src/wtforms/validators.py:145
#, python-format
msgid "Field must be at least %(min)d character long."
msgid_plural "Field must be at least %(min)d characters long."
msgstr[0] "A mező legalább %(min)d karakter hosszú kell hogy legyen."
msgstr[1] ""
#: src/wtforms/validators.py:151
#, python-format
msgid "Field cannot be longer than %(max)d character."
msgid_plural "Field cannot be longer than %(max)d characters."
msgstr[0] "A mező nem lehet hosszabb mint %(max)d karakter."
msgstr[1] ""
#: src/wtforms/validators.py:157
#, python-format
msgid "Field must be exactly %(max)d character long."
msgid_plural "Field must be exactly %(max)d characters long."
msgstr[0] ""
msgstr[1] ""
#: src/wtforms/validators.py:163
#, python-format
msgid "Field must be between %(min)d and %(max)d characters long."
msgstr "A mező hossza %(min)d és %(max)d karakter között kell hogy legyen."
#: src/wtforms/validators.py:216
#, python-format
msgid "Number must be at least %(min)s."
msgstr "A szám %(min)s vagy nagyobb kell hogy legyen."
#: src/wtforms/validators.py:219
#, python-format
msgid "Number must be at most %(max)s."
msgstr "A szám maximum %(max)s lehet."
#: src/wtforms/validators.py:222
#, python-format
msgid "Number must be between %(min)s and %(max)s."
msgstr "A szám %(min)s és %(max)s között kell hogy legyen."
#: src/wtforms/validators.py:293 src/wtforms/validators.py:323
msgid "This field is required."
msgstr "Ez a mező kötelező."
#: src/wtforms/validators.py:358
msgid "Invalid input."
msgstr "Érvénytelen adat."
#: src/wtforms/validators.py:422
msgid "Invalid email address."
msgstr "Érvénytelen email cím."
#: src/wtforms/validators.py:460
msgid "Invalid IP address."
msgstr "Érvénytelen IP cím."
#: src/wtforms/validators.py:503
msgid "Invalid Mac address."
msgstr "Érvénytelen Mac cím."
#: src/wtforms/validators.py:540
msgid "Invalid URL."
msgstr "Érvénytelen URL."
#: src/wtforms/validators.py:561
msgid "Invalid UUID."
msgstr "Érvénytelen UUID."
#: src/wtforms/validators.py:594
#, python-format
msgid "Invalid value, must be one of: %(values)s."
msgstr "Érvénytelen adat, a következőek egyike kell hogy legyen: %(values)s."
#: src/wtforms/validators.py:629
#, python-format
msgid "Invalid value, can't be any of: %(values)s."
msgstr "Érvénytelen adat, a következőek egyike sem lehet: %(values)s."
#: src/wtforms/validators.py:698
#, fuzzy
#| msgid "This field is required."
msgid "This field cannot be edited."
msgstr "Ez a mező kötelező."
#: src/wtforms/validators.py:714
msgid "This field is disabled and cannot have a value."
msgstr ""
#: src/wtforms/csrf/core.py:96
msgid "Invalid CSRF Token."
msgstr "Érvénytelen CSRF token"
#: src/wtforms/csrf/session.py:63
msgid "CSRF token missing."
msgstr "Hiányzó CSRF token"
#: src/wtforms/csrf/session.py:71
msgid "CSRF failed."
msgstr "CSRF hiba"
#: src/wtforms/csrf/session.py:76
msgid "CSRF token expired."
msgstr "Lejárt CSRF token"
#: src/wtforms/fields/choices.py:142
msgid "Invalid Choice: could not coerce."
msgstr "Érvénytelen választás: adat nem használható"
#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203
msgid "Choices cannot be None."
msgstr ""
#: src/wtforms/fields/choices.py:155
msgid "Not a valid choice."
msgstr "Érvénytelen érték"
#: src/wtforms/fields/choices.py:193
msgid "Invalid choice(s): one or more data inputs could not be coerced."
msgstr "Érvénytelen választás: egy vagy több adat elem nem használható"
#: src/wtforms/fields/choices.py:214
#, fuzzy, python-format
#| msgid "'%(value)s' is not a valid choice for this field."
msgid "'%(value)s' is not a valid choice for this field."
msgid_plural "'%(value)s' are not valid choices for this field."
msgstr[0] "'%(value)s' egy érvénytelen érték ebben a mezőben"
msgstr[1] "'%(value)s' egy érvénytelen érték ebben a mezőben"
#: src/wtforms/fields/datetime.py:51
msgid "Not a valid datetime value."
msgstr "Érvénytelen adat, nem dátum/időpont"
#: src/wtforms/fields/datetime.py:77
msgid "Not a valid date value."
msgstr "Érvénytelen adat, nem dátum"
#: src/wtforms/fields/datetime.py:103
msgid "Not a valid time value."
msgstr ""
#: src/wtforms/fields/datetime.py:148
#, fuzzy
#| msgid "Not a valid date value."
msgid "Not a valid week value."
msgstr "Érvénytelen adat, nem dátum"
#: src/wtforms/fields/numeric.py:82 src/wtforms/fields/numeric.py:92
msgid "Not a valid integer value."
msgstr "Érvénytelen adat, nem egész szám"
#: src/wtforms/fields/numeric.py:168
msgid "Not a valid decimal value."
msgstr "Érvénytelen adat, nem decimális szám"
#: src/wtforms/fields/numeric.py:197
msgid "Not a valid float value."
msgstr "Érvénytelen adat, nem lebegőpontos szám"

View File

@@ -0,0 +1,190 @@
# Italian translations for WTForms.
# Copyright (C) 2020 WTForms Team
# This file is distributed under the same license as the WTForms project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
#
msgid ""
msgstr ""
"Project-Id-Version: WTForms 2.0dev\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-01-11 08:20+0100\n"
"PO-Revision-Date: 2017-03-01 11:53+0100\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
"Generated-By: Babel 2.8.0\n"
#: src/wtforms/validators.py:86
#, python-format
msgid "Invalid field name '%s'."
msgstr "Nome del campo non valido '%s'."
#: src/wtforms/validators.py:99
#, python-format
msgid "Field must be equal to %(other_name)s."
msgstr "Il valore deve essere uguale a %(other_name)s."
#: src/wtforms/validators.py:145
#, python-format
msgid "Field must be at least %(min)d character long."
msgid_plural "Field must be at least %(min)d characters long."
msgstr[0] "Il valore deve essere lungo almeno %(min)d carattere."
msgstr[1] "Il valore deve essere lungo almeno %(min)d caratteri."
#: src/wtforms/validators.py:151
#, python-format
msgid "Field cannot be longer than %(max)d character."
msgid_plural "Field cannot be longer than %(max)d characters."
msgstr[0] "Il valore non può essere più lungo di %(max)d carattere."
msgstr[1] "Il valore non può essere più lungo di %(max)d caratteri."
#: src/wtforms/validators.py:157
#, python-format
msgid "Field must be exactly %(max)d character long."
msgid_plural "Field must be exactly %(max)d characters long."
msgstr[0] ""
msgstr[1] ""
#: src/wtforms/validators.py:163
#, python-format
msgid "Field must be between %(min)d and %(max)d characters long."
msgstr ""
"La lunghezza del valore deve essere compresa tra %(min)d e %(max)d caratteri."
#: src/wtforms/validators.py:216
#, python-format
msgid "Number must be at least %(min)s."
msgstr "Il numero deve essere maggiore o uguale a %(min)s."
#: src/wtforms/validators.py:219
#, python-format
msgid "Number must be at most %(max)s."
msgstr "Il numero deve essere minore o uguale a %(max)s."
#: src/wtforms/validators.py:222
#, python-format
msgid "Number must be between %(min)s and %(max)s."
msgstr "Il numero deve essere compreso tra %(min)s e %(max)s."
#: src/wtforms/validators.py:293 src/wtforms/validators.py:323
msgid "This field is required."
msgstr "Questo campo è obbligatorio."
#: src/wtforms/validators.py:358
msgid "Invalid input."
msgstr "Valore non valido."
#: src/wtforms/validators.py:422
msgid "Invalid email address."
msgstr "Indirizzo e-mail non valido."
#: src/wtforms/validators.py:460
msgid "Invalid IP address."
msgstr "Indirizzo IP non valido."
#: src/wtforms/validators.py:503
msgid "Invalid Mac address."
msgstr "Indirizzo Mac non valido."
#: src/wtforms/validators.py:540
msgid "Invalid URL."
msgstr "URL non valido."
#: src/wtforms/validators.py:561
msgid "Invalid UUID."
msgstr "UUID non valido."
#: src/wtforms/validators.py:594
#, python-format
msgid "Invalid value, must be one of: %(values)s."
msgstr "Valore non valido, deve essere uno tra: %(values)s."
#: src/wtforms/validators.py:629
#, python-format
msgid "Invalid value, can't be any of: %(values)s."
msgstr "Valore non valido, non può essere nessuno tra: %(values)s."
#: src/wtforms/validators.py:698
#, fuzzy
#| msgid "This field is required."
msgid "This field cannot be edited."
msgstr "Questo campo è obbligatorio."
#: src/wtforms/validators.py:714
msgid "This field is disabled and cannot have a value."
msgstr ""
#: src/wtforms/csrf/core.py:96
msgid "Invalid CSRF Token."
msgstr "Token CSRF non valido"
#: src/wtforms/csrf/session.py:63
msgid "CSRF token missing."
msgstr "Token CSRF mancante"
#: src/wtforms/csrf/session.py:71
msgid "CSRF failed."
msgstr "CSRF fallito"
#: src/wtforms/csrf/session.py:76
msgid "CSRF token expired."
msgstr "Token CSRF scaduto"
#: src/wtforms/fields/choices.py:142
msgid "Invalid Choice: could not coerce."
msgstr "Opzione non valida: valore non convertibile"
#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203
msgid "Choices cannot be None."
msgstr ""
#: src/wtforms/fields/choices.py:155
msgid "Not a valid choice."
msgstr "Non è una opzione valida"
#: src/wtforms/fields/choices.py:193
msgid "Invalid choice(s): one or more data inputs could not be coerced."
msgstr ""
"Opzione(i) non valida(e): uno o pù valori non possono essere convertiti"
#: src/wtforms/fields/choices.py:214
#, fuzzy, python-format
#| msgid "'%(value)s' is not a valid choice for this field."
msgid "'%(value)s' is not a valid choice for this field."
msgid_plural "'%(value)s' are not valid choices for this field."
msgstr[0] "'%(value)s' non è una opzione valida per questo campo"
msgstr[1] "'%(value)s' non è una opzione valida per questo campo"
#: src/wtforms/fields/datetime.py:51
msgid "Not a valid datetime value."
msgstr "Il valore non corrisponde ad una data e un orario validi"
#: src/wtforms/fields/datetime.py:77
msgid "Not a valid date value."
msgstr "Non è una data valida"
#: src/wtforms/fields/datetime.py:103
msgid "Not a valid time value."
msgstr ""
#: src/wtforms/fields/datetime.py:148
#, fuzzy
#| msgid "Not a valid date value."
msgid "Not a valid week value."
msgstr "Non è una data valida"
#: src/wtforms/fields/numeric.py:82 src/wtforms/fields/numeric.py:92
msgid "Not a valid integer value."
msgstr "Non è una valore intero valido"
#: src/wtforms/fields/numeric.py:168
msgid "Not a valid decimal value."
msgstr "Non è un valore decimale valido"
#: src/wtforms/fields/numeric.py:197
msgid "Not a valid float value."
msgstr "Non è un valore in virgola mobile valido"

View File

@@ -0,0 +1,184 @@
# Japanese translations for WTForms.
# Copyright (C) 2020 WTForms Team
# This file is distributed under the same license as the WTForms project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
#
msgid ""
msgstr ""
"Project-Id-Version: WTForms 2.0dev\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-01-11 08:20+0100\n"
"PO-Revision-Date: 2015-07-06 23:49+0900\n"
"Last-Translator: yusuke furukawa <littlefive.jp@gmail.com>\n"
"Language-Team: ja <littlefive.jp@gmail.com>\n"
"Language: ja\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0\n"
"Generated-By: Babel 2.8.0\n"
#: src/wtforms/validators.py:86
#, python-format
msgid "Invalid field name '%s'."
msgstr "%s は無効なフィールド名です。"
#: src/wtforms/validators.py:99
#, python-format
msgid "Field must be equal to %(other_name)s."
msgstr "フィールドは %(other_name)s でなければいけません。"
#: src/wtforms/validators.py:145
#, python-format
msgid "Field must be at least %(min)d character long."
msgid_plural "Field must be at least %(min)d characters long."
msgstr[0] "フィールドは %(min)d 文字以上でなければなりません。"
#: src/wtforms/validators.py:151
#, python-format
msgid "Field cannot be longer than %(max)d character."
msgid_plural "Field cannot be longer than %(max)d characters."
msgstr[0] "フィールドは %(max)d 文字を超えることはできません。"
#: src/wtforms/validators.py:157
#, python-format
msgid "Field must be exactly %(max)d character long."
msgid_plural "Field must be exactly %(max)d characters long."
msgstr[0] ""
#: src/wtforms/validators.py:163
#, python-format
msgid "Field must be between %(min)d and %(max)d characters long."
msgstr "フィールドは %(min)d 以上, %(max)d 文字以内でなければなりません。"
#: src/wtforms/validators.py:216
#, python-format
msgid "Number must be at least %(min)s."
msgstr "数値は %(min)s 以上でなければなりません。"
#: src/wtforms/validators.py:219
#, python-format
msgid "Number must be at most %(max)s."
msgstr "数値は 最高でも %(max)s でなければなりません。"
#: src/wtforms/validators.py:222
#, python-format
msgid "Number must be between %(min)s and %(max)s."
msgstr "数値は %(min)s 以上, %(max)s 以下でなければいけません。"
#: src/wtforms/validators.py:293 src/wtforms/validators.py:323
msgid "This field is required."
msgstr "このフィールドは必須です。"
#: src/wtforms/validators.py:358
msgid "Invalid input."
msgstr "無効な入力です。"
#: src/wtforms/validators.py:422
msgid "Invalid email address."
msgstr "無効なメールアドレスです。"
#: src/wtforms/validators.py:460
msgid "Invalid IP address."
msgstr "無効なIPアドレスです。"
#: src/wtforms/validators.py:503
msgid "Invalid Mac address."
msgstr "無効なMacアドレスです。"
#: src/wtforms/validators.py:540
msgid "Invalid URL."
msgstr "無効なURLです。"
#: src/wtforms/validators.py:561
msgid "Invalid UUID."
msgstr "無効なUUIDです。"
#: src/wtforms/validators.py:594
#, python-format
msgid "Invalid value, must be one of: %(values)s."
msgstr "無効な値です, 次のうちの1つでなければいけません: %(values)s。"
#: src/wtforms/validators.py:629
#, python-format
msgid "Invalid value, can't be any of: %(values)s."
msgstr "無効な値です、次に含まれるものは使えません: %(values)s。"
#: src/wtforms/validators.py:698
#, fuzzy
#| msgid "This field is required."
msgid "This field cannot be edited."
msgstr "このフィールドは必須です。"
#: src/wtforms/validators.py:714
msgid "This field is disabled and cannot have a value."
msgstr ""
#: src/wtforms/csrf/core.py:96
msgid "Invalid CSRF Token."
msgstr "不正なCSRFトークンです。"
#: src/wtforms/csrf/session.py:63
msgid "CSRF token missing."
msgstr "CSRFトークンがありません。"
#: src/wtforms/csrf/session.py:71
msgid "CSRF failed."
msgstr "CSRF認証に失敗しました。"
#: src/wtforms/csrf/session.py:76
msgid "CSRF token expired."
msgstr "CSRFトークンの期限が切れました。"
#: src/wtforms/fields/choices.py:142
msgid "Invalid Choice: could not coerce."
msgstr "無効な選択: 型変換できません。"
#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203
msgid "Choices cannot be None."
msgstr ""
#: src/wtforms/fields/choices.py:155
msgid "Not a valid choice."
msgstr "選択肢が正しくありません。"
#: src/wtforms/fields/choices.py:193
msgid "Invalid choice(s): one or more data inputs could not be coerced."
msgstr "無効な選択: 1つ以上の値を型変換できません。"
#: src/wtforms/fields/choices.py:214
#, fuzzy, python-format
#| msgid "'%(value)s' is not a valid choice for this field."
msgid "'%(value)s' is not a valid choice for this field."
msgid_plural "'%(value)s' are not valid choices for this field."
msgstr[0] "'%(value)s' はこのフィールドでは有効ではありません。"
#: src/wtforms/fields/datetime.py:51
msgid "Not a valid datetime value."
msgstr "無効な時間型です。"
#: src/wtforms/fields/datetime.py:77
msgid "Not a valid date value."
msgstr "無効な日付型です。"
#: src/wtforms/fields/datetime.py:103
msgid "Not a valid time value."
msgstr "無効な時間型です。"
#: src/wtforms/fields/datetime.py:148
#, fuzzy
#| msgid "Not a valid date value."
msgid "Not a valid week value."
msgstr "無効な日付型です。"
#: src/wtforms/fields/numeric.py:82 src/wtforms/fields/numeric.py:92
msgid "Not a valid integer value."
msgstr "無効な整数です。"
#: src/wtforms/fields/numeric.py:168
msgid "Not a valid decimal value."
msgstr "無効な少数です。"
#: src/wtforms/fields/numeric.py:197
msgid "Not a valid float value."
msgstr "無効なfloat値です。"

View File

@@ -0,0 +1,187 @@
# Translations template for WTForms.
# Copyright (C) 2024 WTForms Team
# This file is distributed under the same license as the WTForms project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2024.
#
msgid ""
msgstr ""
"Project-Id-Version: WTForms 3.0.0\n"
"Report-Msgid-Bugs-To: eloi.rivard@nubla.fr\n"
"POT-Creation-Date: 2024-01-11 08:20+0100\n"
"PO-Revision-Date: 2024-03-11 07:01+0000\n"
"Last-Translator: Baurzhan Muftakhidinov <baurthefirst@gmail.com>\n"
"Language-Team: Kazakh <https://hosted.weblate.org/projects/wtforms/wtforms/"
"kk/>\n"
"Language: kk\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.5-dev\n"
"Generated-By: Babel 2.12.1\n"
#: src/wtforms/validators.py:86
#, python-format
msgid "Invalid field name '%s'."
msgstr "Жарамсыз '%s' өріс атауы."
#: src/wtforms/validators.py:99
#, python-format
msgid "Field must be equal to %(other_name)s."
msgstr "Өріс мәні %(other_name)s өрісімен бірдей болуы тиіс."
#: src/wtforms/validators.py:145
#, python-format
msgid "Field must be at least %(min)d character long."
msgid_plural "Field must be at least %(min)d characters long."
msgstr[0] "Өріс ұзындығы кем дегенде %(min)d таңба болуы тиіс."
msgstr[1] "Өріс ұзындығы кем дегенде %(min)d таңба болуы тиіс."
#: src/wtforms/validators.py:151
#, python-format
msgid "Field cannot be longer than %(max)d character."
msgid_plural "Field cannot be longer than %(max)d characters."
msgstr[0] "Өріс ұзындығы көп дегенде %(max)d таңба болуы тиіс."
msgstr[1] "Өріс ұзындығы көп дегенде %(max)d таңба болуы тиіс."
#: src/wtforms/validators.py:157
#, python-format
msgid "Field must be exactly %(max)d character long."
msgid_plural "Field must be exactly %(max)d characters long."
msgstr[0] "Өріс ұзындығы дәл %(max)d таңба болуы тиіс."
msgstr[1] "Өріс ұзындығы дәл %(max)d таңба болуы тиіс."
#: src/wtforms/validators.py:163
#, python-format
msgid "Field must be between %(min)d and %(max)d characters long."
msgstr "Өріс ұзындығы %(min)d және %(max)d таңба арасында болуы тиіс."
#: src/wtforms/validators.py:216
#, python-format
msgid "Number must be at least %(min)s."
msgstr "Сан кем дегенде %(min)s болуы тиіс."
#: src/wtforms/validators.py:219
#, python-format
msgid "Number must be at most %(max)s."
msgstr "Сан көп дегенде %(max)s болуы тиіс."
#: src/wtforms/validators.py:222
#, python-format
msgid "Number must be between %(min)s and %(max)s."
msgstr "Сан %(min)s және %(max)s аралығында болуы тиіс."
#: src/wtforms/validators.py:293 src/wtforms/validators.py:323
msgid "This field is required."
msgstr "Бұл өріс міндетті түрде керек."
#: src/wtforms/validators.py:358
msgid "Invalid input."
msgstr "Жарасыз енгізу."
#: src/wtforms/validators.py:422
msgid "Invalid email address."
msgstr "Жарамсыз эл. пошта адресі."
#: src/wtforms/validators.py:460
msgid "Invalid IP address."
msgstr "Жарамсыз IP адрес."
#: src/wtforms/validators.py:503
msgid "Invalid Mac address."
msgstr "Жарамсыз Mac адрес."
#: src/wtforms/validators.py:540
msgid "Invalid URL."
msgstr "Жарамсыз URL адресі."
#: src/wtforms/validators.py:561
msgid "Invalid UUID."
msgstr "Жарамсыз UUID."
#: src/wtforms/validators.py:594
#, python-format
msgid "Invalid value, must be one of: %(values)s."
msgstr "Жарамсыз мән, келесінің біреуі болуы тиіс: %(values)s."
#: src/wtforms/validators.py:629
#, python-format
msgid "Invalid value, can't be any of: %(values)s."
msgstr "Жарамсыз мән, келесінің ешқайсысы болмауы тиіс: %(values)s."
#: src/wtforms/validators.py:698
msgid "This field cannot be edited."
msgstr "Бұл өрісті өңдеу мүмкін емес."
#: src/wtforms/validators.py:714
msgid "This field is disabled and cannot have a value."
msgstr "Бұл өріс сөндірілген және мәнге ие бола алмайды."
#: src/wtforms/csrf/core.py:96
msgid "Invalid CSRF Token."
msgstr "Жарамсыз CSRF токені."
#: src/wtforms/csrf/session.py:63
msgid "CSRF token missing."
msgstr "CSRF токені жоқ болып тұр."
#: src/wtforms/csrf/session.py:71
msgid "CSRF failed."
msgstr "CSRF сәтсіз аяқталды."
#: src/wtforms/csrf/session.py:76
msgid "CSRF token expired."
msgstr "CSRF токенінің мерзімі аяқталды."
#: src/wtforms/fields/choices.py:142
msgid "Invalid Choice: could not coerce."
msgstr "Жарамсыз таңдау: Мәнін келтіру мүмкін емес."
#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203
msgid "Choices cannot be None."
msgstr "Таңдаулар мәні Ешнәрсе болмауы тиіс."
#: src/wtforms/fields/choices.py:155
msgid "Not a valid choice."
msgstr "Жарамды таңдау емес."
#: src/wtforms/fields/choices.py:193
msgid "Invalid choice(s): one or more data inputs could not be coerced."
msgstr ""
"Жарамсыз таңдау(лар): бір немесе бірнеше деректер енгізуін келтіру мүмкін "
"емес."
#: src/wtforms/fields/choices.py:214
#, python-format
msgid "'%(value)s' is not a valid choice for this field."
msgid_plural "'%(value)s' are not valid choices for this field."
msgstr[0] "'%(value)s' бұл өріс үшін жарамды таңдау емес."
msgstr[1] "'%(value)s' бұл өріс үшін жарамды таңдаулар емес."
#: src/wtforms/fields/datetime.py:51
msgid "Not a valid datetime value."
msgstr "Жарамды күн мен уақыт мәні емес."
#: src/wtforms/fields/datetime.py:77
msgid "Not a valid date value."
msgstr "Жарамды күн мәні емес."
#: src/wtforms/fields/datetime.py:103
msgid "Not a valid time value."
msgstr "Жарамды уақыт мәні емес."
#: src/wtforms/fields/datetime.py:148
msgid "Not a valid week value."
msgstr "Жарамды апта мәні емес."
#: src/wtforms/fields/numeric.py:82 src/wtforms/fields/numeric.py:92
msgid "Not a valid integer value."
msgstr "Жарамды бүтін сан мәні емес."
#: src/wtforms/fields/numeric.py:168
msgid "Not a valid decimal value."
msgstr "Жарамды ондық мән емес."
#: src/wtforms/fields/numeric.py:197
msgid "Not a valid float value."
msgstr "Жарамды қалқымалы үтірлі сан мәні емес."

View File

@@ -0,0 +1,184 @@
# Korean translations for WTForms.
# Copyright (C) 2020 WTForms Team
# This file is distributed under the same license as the WTForms project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
#
msgid ""
msgstr ""
"Project-Id-Version: WTForms 1.0.3\n"
"Report-Msgid-Bugs-To: eloi.rivard@nubla.fr\n"
"POT-Creation-Date: 2024-01-11 08:20+0100\n"
"PO-Revision-Date: 2024-09-29 13:15+0000\n"
"Last-Translator: simmon <simmon@nplob.com>\n"
"Language-Team: Korean <https://hosted.weblate.org/projects/wtforms/wtforms/"
"ko/>\n"
"Language: ko\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 5.8-dev\n"
"Generated-By: Babel 2.8.0\n"
#: src/wtforms/validators.py:86
#, python-format
msgid "Invalid field name '%s'."
msgstr "'%s'는 올바르지 않은 항목 이름입니다."
#: src/wtforms/validators.py:99
#, python-format
msgid "Field must be equal to %(other_name)s."
msgstr "이 항목은 %(other_name)s 항목과 같아야 합니다."
#: src/wtforms/validators.py:145
#, python-format
msgid "Field must be at least %(min)d character long."
msgid_plural "Field must be at least %(min)d characters long."
msgstr[0] "이 항목은 최소 %(min)d자 이상이어야 합니다."
#: src/wtforms/validators.py:151
#, python-format
msgid "Field cannot be longer than %(max)d character."
msgid_plural "Field cannot be longer than %(max)d characters."
msgstr[0] "이 항목은 %(max)d자 보다 많을 수 없습니다."
#: src/wtforms/validators.py:157
#, python-format
msgid "Field must be exactly %(max)d character long."
msgid_plural "Field must be exactly %(max)d characters long."
msgstr[0] "이 항목은 정확히 %(max)d자이어야 합니다."
#: src/wtforms/validators.py:163
#, python-format
msgid "Field must be between %(min)d and %(max)d characters long."
msgstr "이 항목은 최소 %(min)d자 이상, %(max)d자 이하이어야 합니다."
#: src/wtforms/validators.py:216
#, python-format
msgid "Number must be at least %(min)s."
msgstr "이 값은 최소 %(min)s 이상이어야 합니다."
#: src/wtforms/validators.py:219
#, python-format
msgid "Number must be at most %(max)s."
msgstr "이 값은 %(max)s보다 클 수 없습니다."
#: src/wtforms/validators.py:222
#, python-format
msgid "Number must be between %(min)s and %(max)s."
msgstr "이 값은 %(min)s 이상, %(max)s 이하이어야 합니다."
#: src/wtforms/validators.py:293 src/wtforms/validators.py:323
msgid "This field is required."
msgstr "이 항목은 필수입니다."
#: src/wtforms/validators.py:358
msgid "Invalid input."
msgstr "올바르지 않은 입력값입니다."
#: src/wtforms/validators.py:422
msgid "Invalid email address."
msgstr "올바르지 않은 이메일 주소입니다."
#: src/wtforms/validators.py:460
msgid "Invalid IP address."
msgstr "올바르지 않은 IP 주소입니다."
#: src/wtforms/validators.py:503
msgid "Invalid Mac address."
msgstr "올바르지 않은 Mac주소입니다."
#: src/wtforms/validators.py:540
msgid "Invalid URL."
msgstr "올바르지 않은 URL입니다."
#: src/wtforms/validators.py:561
msgid "Invalid UUID."
msgstr "올바르지 않은 UUID입니다."
#: src/wtforms/validators.py:594
#, python-format
msgid "Invalid value, must be one of: %(values)s."
msgstr "올바르지 않은 값입니다, 다음 중 하나이어야 합니다: %(values)s."
#: src/wtforms/validators.py:629
#, python-format
msgid "Invalid value, can't be any of: %(values)s."
msgstr "올바르지 않은 값입니다, 다음 값은 사용할 수 없습니다: %(values)s."
#: src/wtforms/validators.py:698
msgid "This field cannot be edited."
msgstr "이 필드는 편집할 수 없습니다."
#: src/wtforms/validators.py:714
msgid "This field is disabled and cannot have a value."
msgstr "이 필드는 사용할 수 없으므로 값을 가질 수 없습니다."
#: src/wtforms/csrf/core.py:96
msgid "Invalid CSRF Token."
msgstr "올바르지 않은 CSRF 토큰입니다."
#: src/wtforms/csrf/session.py:63
msgid "CSRF token missing."
msgstr "CSRF 토큰을 찾을 수 없습니다."
#: src/wtforms/csrf/session.py:71
msgid "CSRF failed."
msgstr "CSRF 인증에 실패하였습니다."
#: src/wtforms/csrf/session.py:76
msgid "CSRF token expired."
msgstr "CSRF 토큰이 만료되었습니다."
#: src/wtforms/fields/choices.py:142
msgid "Invalid Choice: could not coerce."
msgstr "올바르지 않은 선택값입니다: 변환할 수 없습니다."
#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203
msgid "Choices cannot be None."
msgstr "선택값이 None일 수 없습니다."
#: src/wtforms/fields/choices.py:155
msgid "Not a valid choice."
msgstr "올바르지 않은 선택값입니다."
#: src/wtforms/fields/choices.py:193
msgid "Invalid choice(s): one or more data inputs could not be coerced."
msgstr "올바르지 않은 선택값입니다: 한개 이상의 값을 변화할 수 없습니다."
#: src/wtforms/fields/choices.py:214
#, python-format
msgid "'%(value)s' is not a valid choice for this field."
msgid_plural "'%(value)s' are not valid choices for this field."
msgstr[0] ""
"'%(value)s'는 이와 같은 부분을 위해 유효한 선택이 없습니다.\n"
"\n"
"'%(value)s'는 이와 같은 부분을 위해 유효한 선택들이 없습니다."
#: src/wtforms/fields/datetime.py:51
msgid "Not a valid datetime value."
msgstr "올바르지 않은 시간 값입니다."
#: src/wtforms/fields/datetime.py:77
msgid "Not a valid date value."
msgstr "올바르지 않은 날짜 값입니다."
#: src/wtforms/fields/datetime.py:103
msgid "Not a valid time value."
msgstr "올바르지 않은 시간 값입니다."
#: src/wtforms/fields/datetime.py:148
msgid "Not a valid week value."
msgstr "유효한 주 값이 아닙니다."
#: src/wtforms/fields/numeric.py:82 src/wtforms/fields/numeric.py:92
msgid "Not a valid integer value."
msgstr "올바르지 않은 정수 값입니다."
#: src/wtforms/fields/numeric.py:168
msgid "Not a valid decimal value."
msgstr "올바르지 않은 숫자 값입니다."
#: src/wtforms/fields/numeric.py:197
msgid "Not a valid float value."
msgstr "올바르지 않은 float 값입니다."

View File

@@ -0,0 +1,188 @@
# Norwegian Bokmål translations for WTForms.
# Copyright (C) 2020 WTForms Team
# This file is distributed under the same license as the WTForms project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
#
msgid ""
msgstr ""
"Project-Id-Version: WTForms 2.0dev\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-01-11 08:20+0100\n"
"PO-Revision-Date: 2014-05-05 16:18+0100\n"
"Last-Translator: Frode Danielsen <frode@e5r.no>\n"
"Language-Team: nb <LL@li.org>\n"
"Language: nb\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
"Generated-By: Babel 2.8.0\n"
#: src/wtforms/validators.py:86
#, python-format
msgid "Invalid field name '%s'."
msgstr "Ugyldig feltnavn '%s'."
#: src/wtforms/validators.py:99
#, python-format
msgid "Field must be equal to %(other_name)s."
msgstr "Feltet må være lik som %(other_name)s."
#: src/wtforms/validators.py:145
#, python-format
msgid "Field must be at least %(min)d character long."
msgid_plural "Field must be at least %(min)d characters long."
msgstr[0] "Feltet må være minst %(min)d tegn langt."
msgstr[1] "Feltet må være minst %(min)d tegn langt."
#: src/wtforms/validators.py:151
#, python-format
msgid "Field cannot be longer than %(max)d character."
msgid_plural "Field cannot be longer than %(max)d characters."
msgstr[0] "Feltet kan ikke være lenger enn %(max)d tegn."
msgstr[1] "Feltet kan ikke være lenger enn %(max)d tegn."
#: src/wtforms/validators.py:157
#, python-format
msgid "Field must be exactly %(max)d character long."
msgid_plural "Field must be exactly %(max)d characters long."
msgstr[0] ""
msgstr[1] ""
#: src/wtforms/validators.py:163
#, python-format
msgid "Field must be between %(min)d and %(max)d characters long."
msgstr "Feltet må være mellom %(min)d og %(max)d tegn langt."
#: src/wtforms/validators.py:216
#, python-format
msgid "Number must be at least %(min)s."
msgstr "Tall må være minst %(min)s."
#: src/wtforms/validators.py:219
#, python-format
msgid "Number must be at most %(max)s."
msgstr "Tall må være maks %(max)s."
#: src/wtforms/validators.py:222
#, python-format
msgid "Number must be between %(min)s and %(max)s."
msgstr "Tall må være mellom %(min)s og %(max)s."
#: src/wtforms/validators.py:293 src/wtforms/validators.py:323
msgid "This field is required."
msgstr "Dette feltet er påkrevd."
#: src/wtforms/validators.py:358
msgid "Invalid input."
msgstr "Ugyldig verdi."
#: src/wtforms/validators.py:422
msgid "Invalid email address."
msgstr "Ugyldig e-postadresse."
#: src/wtforms/validators.py:460
msgid "Invalid IP address."
msgstr "Ugyldig IP-adresse."
#: src/wtforms/validators.py:503
msgid "Invalid Mac address."
msgstr "Ugyldig MAC-adresse."
#: src/wtforms/validators.py:540
msgid "Invalid URL."
msgstr "Ugyldig URL."
#: src/wtforms/validators.py:561
msgid "Invalid UUID."
msgstr "Ugyldig UUID."
#: src/wtforms/validators.py:594
#, python-format
msgid "Invalid value, must be one of: %(values)s."
msgstr "Ugyldig verdi, den må være en av følgende: %(values)s."
#: src/wtforms/validators.py:629
#, python-format
msgid "Invalid value, can't be any of: %(values)s."
msgstr "Ugyldig verdi, den kan ikke være en av følgende: %(values)s."
#: src/wtforms/validators.py:698
#, fuzzy
#| msgid "This field is required."
msgid "This field cannot be edited."
msgstr "Dette feltet er påkrevd."
#: src/wtforms/validators.py:714
msgid "This field is disabled and cannot have a value."
msgstr ""
#: src/wtforms/csrf/core.py:96
msgid "Invalid CSRF Token."
msgstr "Ugyldig CSRF-pollett"
#: src/wtforms/csrf/session.py:63
msgid "CSRF token missing."
msgstr "Manglende CSRF-pollett"
#: src/wtforms/csrf/session.py:71
msgid "CSRF failed."
msgstr "CSRF-sjekk feilet"
#: src/wtforms/csrf/session.py:76
msgid "CSRF token expired."
msgstr "Utløpt CSRF-pollett"
#: src/wtforms/fields/choices.py:142
msgid "Invalid Choice: could not coerce."
msgstr "Ugyldig valg: Kunne ikke oversette"
#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203
msgid "Choices cannot be None."
msgstr ""
#: src/wtforms/fields/choices.py:155
msgid "Not a valid choice."
msgstr "Ikke et gyldig valg"
#: src/wtforms/fields/choices.py:193
msgid "Invalid choice(s): one or more data inputs could not be coerced."
msgstr "Ugyldig(e) valg: En eller flere dataverdier kunne ikke oversettes"
#: src/wtforms/fields/choices.py:214
#, fuzzy, python-format
#| msgid "'%(value)s' is not a valid choice for this field."
msgid "'%(value)s' is not a valid choice for this field."
msgid_plural "'%(value)s' are not valid choices for this field."
msgstr[0] "'%(value)s' er ikke et gyldig valg for dette feltet"
msgstr[1] "'%(value)s' er ikke et gyldig valg for dette feltet"
#: src/wtforms/fields/datetime.py:51
msgid "Not a valid datetime value."
msgstr "Ikke en gyldig dato- og tidsverdi"
#: src/wtforms/fields/datetime.py:77
msgid "Not a valid date value."
msgstr "Ikke en gyldig datoverdi"
#: src/wtforms/fields/datetime.py:103
msgid "Not a valid time value."
msgstr ""
#: src/wtforms/fields/datetime.py:148
#, fuzzy
#| msgid "Not a valid date value."
msgid "Not a valid week value."
msgstr "Ikke en gyldig datoverdi"
#: src/wtforms/fields/numeric.py:82 src/wtforms/fields/numeric.py:92
msgid "Not a valid integer value."
msgstr "Ikke en gyldig heltallsverdi"
#: src/wtforms/fields/numeric.py:168
msgid "Not a valid decimal value."
msgstr "Ikke en gyldig desimalverdi"
#: src/wtforms/fields/numeric.py:197
msgid "Not a valid float value."
msgstr "Ikke en gyldig flyttallsverdi"

View File

@@ -0,0 +1,186 @@
# Dutch translations for WTForms.
# Copyright (C) 2020 WTForms Team
# This file is distributed under the same license as the WTForms project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
#
msgid ""
msgstr ""
"Project-Id-Version: WTForms 2.0dev\n"
"Report-Msgid-Bugs-To: eloi.rivard@nubla.fr\n"
"POT-Creation-Date: 2024-01-11 08:20+0100\n"
"PO-Revision-Date: 2024-03-22 11:01+0000\n"
"Last-Translator: Mikachu <micah.sh@proton.me>\n"
"Language-Team: Dutch <https://hosted.weblate.org/projects/wtforms/wtforms/nl/"
">\n"
"Language: nl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.5-dev\n"
"Generated-By: Babel 2.8.0\n"
#: src/wtforms/validators.py:86
#, python-format
msgid "Invalid field name '%s'."
msgstr "Ongeldige naam voor veld '%s'."
#: src/wtforms/validators.py:99
#, python-format
msgid "Field must be equal to %(other_name)s."
msgstr "Veld moet gelijk zijn aan %(other_name)s."
#: src/wtforms/validators.py:145
#, python-format
msgid "Field must be at least %(min)d character long."
msgid_plural "Field must be at least %(min)d characters long."
msgstr[0] "Veld moet minstens %(min)d karakter lang zijn."
msgstr[1] "Veld moet minstens %(min)d karakters lang zijn."
#: src/wtforms/validators.py:151
#, python-format
msgid "Field cannot be longer than %(max)d character."
msgid_plural "Field cannot be longer than %(max)d characters."
msgstr[0] "Veld mag niet langer zijn dan %(max)d karakter."
msgstr[1] "Veld mag niet langer zijn dan %(max)d karakters."
#: src/wtforms/validators.py:157
#, python-format
msgid "Field must be exactly %(max)d character long."
msgid_plural "Field must be exactly %(max)d characters long."
msgstr[0] "Veld moet exact %(max)d karakter lang zijn."
msgstr[1] "Veld moet exact %(max)d karakters lang zijn."
#: src/wtforms/validators.py:163
#, python-format
msgid "Field must be between %(min)d and %(max)d characters long."
msgstr "Veld moet tussen %(min)d en %(max)d karakters lang zijn."
#: src/wtforms/validators.py:216
#, python-format
msgid "Number must be at least %(min)s."
msgstr "Getal moet minstens %(min)s zijn."
#: src/wtforms/validators.py:219
#, python-format
msgid "Number must be at most %(max)s."
msgstr "Nummer mag maximaal %(max)s zijn."
#: src/wtforms/validators.py:222
#, python-format
msgid "Number must be between %(min)s and %(max)s."
msgstr "Nummer moet tussen %(min)s en %(max)s liggen."
#: src/wtforms/validators.py:293 src/wtforms/validators.py:323
msgid "This field is required."
msgstr "Dit veld is vereist."
#: src/wtforms/validators.py:358
msgid "Invalid input."
msgstr "Ongeldige invoer."
#: src/wtforms/validators.py:422
msgid "Invalid email address."
msgstr "Ongeldig e-mailadres."
#: src/wtforms/validators.py:460
msgid "Invalid IP address."
msgstr "Ongeldig IP-adres."
#: src/wtforms/validators.py:503
msgid "Invalid Mac address."
msgstr "Ongeldig MAC-adres."
#: src/wtforms/validators.py:540
msgid "Invalid URL."
msgstr "Ongeldige URL."
#: src/wtforms/validators.py:561
msgid "Invalid UUID."
msgstr "Ongeldige UUID."
#: src/wtforms/validators.py:594
#, python-format
msgid "Invalid value, must be one of: %(values)s."
msgstr "Ongeldige waarde, moet een waarde zijn uit: %(values)s."
#: src/wtforms/validators.py:629
#, python-format
msgid "Invalid value, can't be any of: %(values)s."
msgstr "Ongeldige waarde, kan geen waarde zijn uit: %(values)s."
#: src/wtforms/validators.py:698
msgid "This field cannot be edited."
msgstr "Dit veld kan niet worden bewerkt."
#: src/wtforms/validators.py:714
msgid "This field is disabled and cannot have a value."
msgstr "Dit veld is uitgeschakeld en kan geen waarde hebben."
#: src/wtforms/csrf/core.py:96
msgid "Invalid CSRF Token."
msgstr "Ongeldig CSRF-token."
#: src/wtforms/csrf/session.py:63
msgid "CSRF token missing."
msgstr "CSRF-token ontbreekt."
#: src/wtforms/csrf/session.py:71
msgid "CSRF failed."
msgstr "CSRF is gefaald."
#: src/wtforms/csrf/session.py:76
msgid "CSRF token expired."
msgstr "CSRF-token is verlopen."
#: src/wtforms/fields/choices.py:142
msgid "Invalid Choice: could not coerce."
msgstr "Ongeldige keuze: kon niet omgezet worden."
#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203
msgid "Choices cannot be None."
msgstr "Keuzes mogen niet None zijn."
#: src/wtforms/fields/choices.py:155
msgid "Not a valid choice."
msgstr "Ongeldige keuze."
#: src/wtforms/fields/choices.py:193
msgid "Invalid choice(s): one or more data inputs could not be coerced."
msgstr ""
"Ongeldige keuze(s): een of meer van de invoeren kon niet omgezet worden."
#: src/wtforms/fields/choices.py:214
#, python-format
msgid "'%(value)s' is not a valid choice for this field."
msgid_plural "'%(value)s' are not valid choices for this field."
msgstr[0] "'%(value)s' is een ongeldige keuze voor dit veld."
msgstr[1] "'%(value)s' zijn ongeldige keuzes voor dit veld."
#: src/wtforms/fields/datetime.py:51
msgid "Not a valid datetime value."
msgstr "Ongeldige datum/tijd."
#: src/wtforms/fields/datetime.py:77
msgid "Not a valid date value."
msgstr "Ongeldige datum."
#: src/wtforms/fields/datetime.py:103
msgid "Not a valid time value."
msgstr "Ongeldige waarde."
#: src/wtforms/fields/datetime.py:148
msgid "Not a valid week value."
msgstr "Ongeldige waarde voor week."
#: src/wtforms/fields/numeric.py:82 src/wtforms/fields/numeric.py:92
msgid "Not a valid integer value."
msgstr "Ongeldig getal."
#: src/wtforms/fields/numeric.py:168
msgid "Not a valid decimal value."
msgstr "Ongeldige decimale waarde."
#: src/wtforms/fields/numeric.py:197
msgid "Not a valid float value."
msgstr "Ongeldige float-waarde."

View File

@@ -0,0 +1,194 @@
# Polish translations for WTForms.
# Copyright (C) 2020 WTForms Team
# This file is distributed under the same license as the WTForms project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
#
msgid ""
msgstr ""
"Project-Id-Version: WTForms 1.0\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-01-11 08:20+0100\n"
"PO-Revision-Date: 2012-05-05 23:20+0200\n"
"Last-Translator: Aleksander Nitecki <ixendr@itogi.re>\n"
"Language-Team: pl <wolanskim@gmail.com>\n"
"Language: pl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
"|| n%100>=20) ? 1 : 2)\n"
"Generated-By: Babel 2.8.0\n"
#: src/wtforms/validators.py:86
#, python-format
msgid "Invalid field name '%s'."
msgstr "Nieprawidłowa nazwa pola '%s'."
#: src/wtforms/validators.py:99
#, python-format
msgid "Field must be equal to %(other_name)s."
msgstr "Wartość pola musi być równa %(other_name)s."
#: src/wtforms/validators.py:145
#, python-format
msgid "Field must be at least %(min)d character long."
msgid_plural "Field must be at least %(min)d characters long."
msgstr[0] "Pole musi mieć przynajmniej %(min)d znak."
msgstr[1] "Pole musi mieć przynajmniej %(min)d znaki."
msgstr[2] "Pole musi mieć przynajmniej %(min)d znaków."
#: src/wtforms/validators.py:151
#, python-format
msgid "Field cannot be longer than %(max)d character."
msgid_plural "Field cannot be longer than %(max)d characters."
msgstr[0] "Wartość w polu nie może mieć więcej niż %(max)d znak."
msgstr[1] "Wartość w polu nie może mieć więcej niż %(max)d znaki."
msgstr[2] "Wartość w polu nie może mieć więcej niż %(max)d znaków."
#: src/wtforms/validators.py:157
#, python-format
msgid "Field must be exactly %(max)d character long."
msgid_plural "Field must be exactly %(max)d characters long."
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
#: src/wtforms/validators.py:163
#, python-format
msgid "Field must be between %(min)d and %(max)d characters long."
msgstr "Wartość musi być długa na od %(min)d do %(max)d znaków."
#: src/wtforms/validators.py:216
#, python-format
msgid "Number must be at least %(min)s."
msgstr "Liczba musi być większa lub równa %(min)s."
#: src/wtforms/validators.py:219
#, python-format
msgid "Number must be at most %(max)s."
msgstr "Liczba musi być mniejsza lub równa %(max)s."
#: src/wtforms/validators.py:222
#, python-format
msgid "Number must be between %(min)s and %(max)s."
msgstr "Liczba musi być z zakresu %(min)s i %(max)s."
#: src/wtforms/validators.py:293 src/wtforms/validators.py:323
msgid "This field is required."
msgstr "To pole jest wymagane."
#: src/wtforms/validators.py:358
msgid "Invalid input."
msgstr "Nieprawidłowa wartość."
#: src/wtforms/validators.py:422
msgid "Invalid email address."
msgstr "Nieprawidłowy adres e-mail."
#: src/wtforms/validators.py:460
msgid "Invalid IP address."
msgstr "Nieprawidłowy adres IP."
#: src/wtforms/validators.py:503
msgid "Invalid Mac address."
msgstr "Nieprawidłowy adres Mac."
#: src/wtforms/validators.py:540
msgid "Invalid URL."
msgstr "Nieprawidłowy URL."
#: src/wtforms/validators.py:561
msgid "Invalid UUID."
msgstr "Nieprawidłowy UUID."
#: src/wtforms/validators.py:594
#, python-format
msgid "Invalid value, must be one of: %(values)s."
msgstr "Wartość musi być jedną z: %(values)s."
#: src/wtforms/validators.py:629
#, python-format
msgid "Invalid value, can't be any of: %(values)s."
msgstr "Wartość nie może być żadną z: %(values)s."
#: src/wtforms/validators.py:698
#, fuzzy
#| msgid "This field is required."
msgid "This field cannot be edited."
msgstr "To pole jest wymagane."
#: src/wtforms/validators.py:714
msgid "This field is disabled and cannot have a value."
msgstr ""
#: src/wtforms/csrf/core.py:96
msgid "Invalid CSRF Token."
msgstr "Nieprawidłowy token CSRF"
#: src/wtforms/csrf/session.py:63
msgid "CSRF token missing."
msgstr "Brak tokena CSRF"
#: src/wtforms/csrf/session.py:71
msgid "CSRF failed."
msgstr "błąd CSRF"
#: src/wtforms/csrf/session.py:76
msgid "CSRF token expired."
msgstr "Wygasł token CSRF"
#: src/wtforms/fields/choices.py:142
msgid "Invalid Choice: could not coerce."
msgstr "Nieprawidłowy wybór: nie można skonwertować"
#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203
msgid "Choices cannot be None."
msgstr ""
#: src/wtforms/fields/choices.py:155
msgid "Not a valid choice."
msgstr "Nieprawidłowy wybór"
#: src/wtforms/fields/choices.py:193
msgid "Invalid choice(s): one or more data inputs could not be coerced."
msgstr ""
"Nieprawidłowy wybór: nie można skonwertować przynajmniej jednej wartości"
#: src/wtforms/fields/choices.py:214
#, fuzzy, python-format
#| msgid "'%(value)s' is not a valid choice for this field."
msgid "'%(value)s' is not a valid choice for this field."
msgid_plural "'%(value)s' are not valid choices for this field."
msgstr[0] "'%(value)s' nie jest poprawnym wyborem dla tego pola"
msgstr[1] "'%(value)s' nie jest poprawnym wyborem dla tego pola"
msgstr[2] "'%(value)s' nie jest poprawnym wyborem dla tego pola"
#: src/wtforms/fields/datetime.py:51
msgid "Not a valid datetime value."
msgstr "Nieprawidłowa data i czas"
#: src/wtforms/fields/datetime.py:77
msgid "Not a valid date value."
msgstr "Nieprawidłowa data"
#: src/wtforms/fields/datetime.py:103
msgid "Not a valid time value."
msgstr ""
#: src/wtforms/fields/datetime.py:148
#, fuzzy
#| msgid "Not a valid date value."
msgid "Not a valid week value."
msgstr "Nieprawidłowa data"
#: src/wtforms/fields/numeric.py:82 src/wtforms/fields/numeric.py:92
msgid "Not a valid integer value."
msgstr "Nieprawidłowa liczba całkowita"
#: src/wtforms/fields/numeric.py:168
msgid "Not a valid decimal value."
msgstr "Nieprawidłowa liczba dziesiętna"
#: src/wtforms/fields/numeric.py:197
msgid "Not a valid float value."
msgstr "Nieprawidłowa liczba zmiennoprzecinkowa"

View File

@@ -0,0 +1,185 @@
# Portuguese translations for WTForms.
# Copyright (C) 2020 WTForms Team
# This file is distributed under the same license as the WTForms project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
#
msgid ""
msgstr ""
"Project-Id-Version: WTForms 2.0dev\n"
"Report-Msgid-Bugs-To: eloi.rivard@nubla.fr\n"
"POT-Creation-Date: 2024-01-11 08:20+0100\n"
"PO-Revision-Date: 2024-06-17 21:09+0000\n"
"Last-Translator: Josimar Gabriel <jgr-araujo@protonmail.com>\n"
"Language-Team: Portuguese <https://hosted.weblate.org/projects/wtforms/"
"wtforms/pt/>\n"
"Language: pt\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.6-dev\n"
"Generated-By: Babel 2.8.0\n"
#: src/wtforms/validators.py:86
#, python-format
msgid "Invalid field name '%s'."
msgstr "Nome do campo inválido '%s'."
#: src/wtforms/validators.py:99
#, python-format
msgid "Field must be equal to %(other_name)s."
msgstr "O campo deve ser igual a %(other_name)s."
#: src/wtforms/validators.py:145
#, python-format
msgid "Field must be at least %(min)d character long."
msgid_plural "Field must be at least %(min)d characters long."
msgstr[0] "O campo deve ter pelo menos %(min)d caracteres."
msgstr[1] "Os campos devem ter pelo menos %(min)d caracteres."
#: src/wtforms/validators.py:151
#, python-format
msgid "Field cannot be longer than %(max)d character."
msgid_plural "Field cannot be longer than %(max)d characters."
msgstr[0] "O campo não pode ter mais do que %(max)d caracteres."
msgstr[1] "Os campos não podem ter mais do que %(max)d caracteres."
#: src/wtforms/validators.py:157
#, python-format
msgid "Field must be exactly %(max)d character long."
msgid_plural "Field must be exactly %(max)d characters long."
msgstr[0] "O campo deve ter exatamente %(max)d caracteres."
msgstr[1] "Os campos devem ter exatamente %(max)d caracteres."
#: src/wtforms/validators.py:163
#, python-format
msgid "Field must be between %(min)d and %(max)d characters long."
msgstr "O campo deve ter entre %(min)d e %(max)d caracteres."
#: src/wtforms/validators.py:216
#, python-format
msgid "Number must be at least %(min)s."
msgstr "O valor não pode ser menos do que %(min)s."
#: src/wtforms/validators.py:219
#, python-format
msgid "Number must be at most %(max)s."
msgstr "O valor não pode ser mais do que %(max)s."
#: src/wtforms/validators.py:222
#, python-format
msgid "Number must be between %(min)s and %(max)s."
msgstr "O valor tem que ser entre %(min)s e %(max)s."
#: src/wtforms/validators.py:293 src/wtforms/validators.py:323
msgid "This field is required."
msgstr "Campo obrigatório."
#: src/wtforms/validators.py:358
msgid "Invalid input."
msgstr "Entrada inválida."
#: src/wtforms/validators.py:422
msgid "Invalid email address."
msgstr "Email inválido."
#: src/wtforms/validators.py:460
msgid "Invalid IP address."
msgstr "IP inválido."
#: src/wtforms/validators.py:503
msgid "Invalid Mac address."
msgstr "Mac address inválido."
#: src/wtforms/validators.py:540
msgid "Invalid URL."
msgstr "URL inválido."
#: src/wtforms/validators.py:561
msgid "Invalid UUID."
msgstr "UUID inválido."
#: src/wtforms/validators.py:594
#, python-format
msgid "Invalid value, must be one of: %(values)s."
msgstr "Valor inválido, deve ser um dos seguintes: %(values)s."
#: src/wtforms/validators.py:629
#, python-format
msgid "Invalid value, can't be any of: %(values)s."
msgstr "Valor inválido, não deve ser um dos seguintes: %(values)s."
#: src/wtforms/validators.py:698
msgid "This field cannot be edited."
msgstr "Este campo não pode ser editado."
#: src/wtforms/validators.py:714
msgid "This field is disabled and cannot have a value."
msgstr "Campo desativado: não pode ter um valor."
#: src/wtforms/csrf/core.py:96
msgid "Invalid CSRF Token."
msgstr "Token CSRF inválido."
#: src/wtforms/csrf/session.py:63
msgid "CSRF token missing."
msgstr "Falta o token CSRF."
#: src/wtforms/csrf/session.py:71
msgid "CSRF failed."
msgstr "CSRF falhou."
#: src/wtforms/csrf/session.py:76
msgid "CSRF token expired."
msgstr "Token CSRF expirado."
#: src/wtforms/fields/choices.py:142
msgid "Invalid Choice: could not coerce."
msgstr "Escolha inválida: não é possível calcular."
#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203
msgid "Choices cannot be None."
msgstr "A escolha não pode ser None."
#: src/wtforms/fields/choices.py:155
msgid "Not a valid choice."
msgstr "Escolha inválida."
#: src/wtforms/fields/choices.py:193
msgid "Invalid choice(s): one or more data inputs could not be coerced."
msgstr "Escolha(s) inválida(s): não é possível calcular alguns dos valores."
#: src/wtforms/fields/choices.py:214
#, python-format
msgid "'%(value)s' is not a valid choice for this field."
msgid_plural "'%(value)s' are not valid choices for this field."
msgstr[0] "%(value)s não é uma escolha válida para este campo."
msgstr[1] "%(value)s não são escolhas válidas para este campo."
#: src/wtforms/fields/datetime.py:51
msgid "Not a valid datetime value."
msgstr "O valor temporal não é válido."
#: src/wtforms/fields/datetime.py:77
msgid "Not a valid date value."
msgstr "A data não é válida."
#: src/wtforms/fields/datetime.py:103
msgid "Not a valid time value."
msgstr "Não é um valor de tempo válido."
#: src/wtforms/fields/datetime.py:148
msgid "Not a valid week value."
msgstr "Não é um valor de semana válido."
#: src/wtforms/fields/numeric.py:82 src/wtforms/fields/numeric.py:92
msgid "Not a valid integer value."
msgstr "O valor inteiro não é válido."
#: src/wtforms/fields/numeric.py:168
msgid "Not a valid decimal value."
msgstr "O valor decimal não é válido."
#: src/wtforms/fields/numeric.py:197
msgid "Not a valid float value."
msgstr "O valor com vírgula flutuante não é válido."

View File

@@ -0,0 +1,195 @@
# Translations template for WTForms.
# Copyright (C) 2023 WTForms Team
# This file is distributed under the same license as the WTForms project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2023.
#
msgid ""
msgstr ""
"Project-Id-Version: WTForms 3.0.1\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-01-11 08:20+0100\n"
"PO-Revision-Date: 2023-10-07 06:11+0000\n"
"Last-Translator: Victor Buzdugan <buzdugan.victor@icloud.com>\n"
"Language-Team: Romanian <https://hosted.weblate.org/projects/wtforms/wtforms/"
"ro/>\n"
"Language: ro\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
"20)) ? 1 : 2;\n"
"X-Generator: Weblate 5.1-dev\n"
"Generated-By: Babel 2.12.1\n"
#: src/wtforms/validators.py:86
#, python-format
msgid "Invalid field name '%s'."
msgstr "Numele câmpului este invalid '%s'."
#: src/wtforms/validators.py:99
#, python-format
msgid "Field must be equal to %(other_name)s."
msgstr "Câmpul trebuie să fie egal cu %(other_name)s."
#: src/wtforms/validators.py:145
#, python-format
msgid "Field must be at least %(min)d character long."
msgid_plural "Field must be at least %(min)d characters long."
msgstr[0] "Câmpul trebuie să aibă minim %(min)d caracter."
msgstr[1] "Câmpul trebuie să aibă minim %(min)d caractere."
msgstr[2] "Câmpul trebuie să aibă minim %(min)d de caractere."
#: src/wtforms/validators.py:151
#, python-format
msgid "Field cannot be longer than %(max)d character."
msgid_plural "Field cannot be longer than %(max)d characters."
msgstr[0] "Câmpul nu poate fi mai mare de %(max)d caracter."
msgstr[1] "Câmpul nu poate fi mai mare de %(max)d caractere."
msgstr[2] "Câmpul nu poate fi mai mare de %(max)d de caractere."
#: src/wtforms/validators.py:157
#, python-format
msgid "Field must be exactly %(max)d character long."
msgid_plural "Field must be exactly %(max)d characters long."
msgstr[0] "Câmpul trebuie să aibă exact %(max)d caracter."
msgstr[1] "Câmpul trebuie să aibă exact %(max)d caractere."
msgstr[2] "Câmpul trebuie să aibă exact %(max)d de caractere."
#: src/wtforms/validators.py:163
#, python-format
msgid "Field must be between %(min)d and %(max)d characters long."
msgstr "Câmpul trebuie să aibă între %(min)d și %(max)d caractere."
#: src/wtforms/validators.py:216
#, python-format
msgid "Number must be at least %(min)s."
msgstr "Numărul trebuie să fie cel puțin %(min)s."
#: src/wtforms/validators.py:219
#, python-format
msgid "Number must be at most %(max)s."
msgstr "Numărul trebuie să fie cel mult %(max)s."
#: src/wtforms/validators.py:222
#, python-format
msgid "Number must be between %(min)s and %(max)s."
msgstr "Numărul trebuie să fie între %(min)s și %(max)s."
#: src/wtforms/validators.py:293 src/wtforms/validators.py:323
msgid "This field is required."
msgstr "Acest câmp este obligatoriu."
#: src/wtforms/validators.py:358
msgid "Invalid input."
msgstr "Valoarea introdusă este invalidă."
#: src/wtforms/validators.py:422
msgid "Invalid email address."
msgstr "Adresa email este invalidă."
#: src/wtforms/validators.py:460
msgid "Invalid IP address."
msgstr "Adresa IP este invalidă."
#: src/wtforms/validators.py:503
msgid "Invalid Mac address."
msgstr "Adresa Mac este invalidă."
#: src/wtforms/validators.py:540
msgid "Invalid URL."
msgstr "URL invalid."
#: src/wtforms/validators.py:561
msgid "Invalid UUID."
msgstr "UUID invalid."
#: src/wtforms/validators.py:594
#, python-format
msgid "Invalid value, must be one of: %(values)s."
msgstr "Valoare invalidă, trebuie să fie una din: %(values)s."
#: src/wtforms/validators.py:629
#, python-format
msgid "Invalid value, can't be any of: %(values)s."
msgstr "Valoare invalidă, nu trebuie să fie una din: %(values)s."
#: src/wtforms/validators.py:698
#, fuzzy
#| msgid "This field cannot be edited"
msgid "This field cannot be edited."
msgstr "Câmpul nu poate fi editat"
#: src/wtforms/validators.py:714
#, fuzzy
#| msgid "This field is disabled and cannot have a value"
msgid "This field is disabled and cannot have a value."
msgstr "Câmpul este dezactivat și nu poate conține o valoare"
#: src/wtforms/csrf/core.py:96
msgid "Invalid CSRF Token."
msgstr "Token-ul CSRF este invalid."
#: src/wtforms/csrf/session.py:63
msgid "CSRF token missing."
msgstr "Lipsește token-ul CSRF."
#: src/wtforms/csrf/session.py:71
msgid "CSRF failed."
msgstr "Validarea CSRF a eșuat."
#: src/wtforms/csrf/session.py:76
msgid "CSRF token expired."
msgstr "Token-ul CSRF a expirat."
#: src/wtforms/fields/choices.py:142
msgid "Invalid Choice: could not coerce."
msgstr "Selecție invalidă: valoarea nu a putut fi transformată."
#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203
msgid "Choices cannot be None."
msgstr "Selecția nu poate fi None."
#: src/wtforms/fields/choices.py:155
msgid "Not a valid choice."
msgstr "Selecție invalidă."
#: src/wtforms/fields/choices.py:193
msgid "Invalid choice(s): one or more data inputs could not be coerced."
msgstr ""
"Selecție(ii) invalidă: una sau mai multe valori nu au putut fi transformate."
#: src/wtforms/fields/choices.py:214
#, python-format
msgid "'%(value)s' is not a valid choice for this field."
msgid_plural "'%(value)s' are not valid choices for this field."
msgstr[0] "'%(value)s' nu este o selecție validă pentru acest câmp."
msgstr[1] "'%(value)s' nu sunt selecții valide pentru acest câmp."
msgstr[2] "'%(value)s' nu sunt selecții valide pentru acest câmp."
#: src/wtforms/fields/datetime.py:51
msgid "Not a valid datetime value."
msgstr "Valoare dată-timp invalidă."
#: src/wtforms/fields/datetime.py:77
msgid "Not a valid date value."
msgstr "Valoarea pentru dată este invalidă."
#: src/wtforms/fields/datetime.py:103
msgid "Not a valid time value."
msgstr "Valoarea pentru timp este invalidă."
#: src/wtforms/fields/datetime.py:148
msgid "Not a valid week value."
msgstr "Valoarea pentru săptămână este invalidă."
#: src/wtforms/fields/numeric.py:82 src/wtforms/fields/numeric.py:92
msgid "Not a valid integer value."
msgstr "Număr întreg invalid."
#: src/wtforms/fields/numeric.py:168
msgid "Not a valid decimal value."
msgstr "Număr zecimal invalid."
#: src/wtforms/fields/numeric.py:197
msgid "Not a valid float value."
msgstr "Număr cu virgulă invalid."

View File

@@ -0,0 +1,195 @@
# Russian translations for WTForms.
# Copyright (C) 2020 WTForms Team
# This file is distributed under the same license as the WTForms project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
#
msgid ""
msgstr ""
"Project-Id-Version: WTForms 1.0.3\n"
"Report-Msgid-Bugs-To: eloi.rivard@nubla.fr\n"
"POT-Creation-Date: 2024-01-11 08:20+0100\n"
"PO-Revision-Date: 2024-04-26 21:07+0000\n"
"Last-Translator: \"Sophie Sh.\" <lisp_spb@mail.ru>\n"
"Language-Team: Russian <https://hosted.weblate.org/projects/wtforms/wtforms/"
"ru/>\n"
"Language: ru\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Generator: Weblate 5.5.1\n"
"Generated-By: Babel 2.8.0\n"
#: src/wtforms/validators.py:86
#, python-format
msgid "Invalid field name '%s'."
msgstr "Неправильное имя поля '%s'."
#: src/wtforms/validators.py:99
#, python-format
msgid "Field must be equal to %(other_name)s."
msgstr "Поле должно совпадать с %(other_name)s."
#: src/wtforms/validators.py:145
#, python-format
msgid "Field must be at least %(min)d character long."
msgid_plural "Field must be at least %(min)d characters long."
msgstr[0] "Значение должно содержать не менее %(min)d символа."
msgstr[1] "Значение должно содержать не менее %(min)d символов."
msgstr[2] "Значение должно содержать не менее %(min)d символов."
#: src/wtforms/validators.py:151
#, python-format
msgid "Field cannot be longer than %(max)d character."
msgid_plural "Field cannot be longer than %(max)d characters."
msgstr[0] "Значение не должно содержать более %(max)d символа."
msgstr[1] "Значение не должно содержать более %(max)d символов."
msgstr[2] "Значение не должно содержать более %(max)d символов."
#: src/wtforms/validators.py:157
#, python-format
msgid "Field must be exactly %(max)d character long."
msgid_plural "Field must be exactly %(max)d characters long."
msgstr[0] "Значение должно быть точно %(max)d символа."
msgstr[1] "Значение должно быть %(max)d символов."
msgstr[2] "Значение должно быть %(max)d символов."
#: src/wtforms/validators.py:163
#, python-format
msgid "Field must be between %(min)d and %(max)d characters long."
msgstr "Значение должно содержать от %(min)d до %(max)d символов."
#: src/wtforms/validators.py:216
#, python-format
msgid "Number must be at least %(min)s."
msgstr "Число должно быть больше %(min)s."
#: src/wtforms/validators.py:219
#, python-format
msgid "Number must be at most %(max)s."
msgstr "Число должно быть меньше %(max)s."
#: src/wtforms/validators.py:222
#, python-format
msgid "Number must be between %(min)s and %(max)s."
msgstr "Значение должно быть между %(min)s и %(max)s."
#: src/wtforms/validators.py:293 src/wtforms/validators.py:323
msgid "This field is required."
msgstr "Обязательное поле."
#: src/wtforms/validators.py:358
msgid "Invalid input."
msgstr "Некорректный ввод."
#: src/wtforms/validators.py:422
msgid "Invalid email address."
msgstr "Неверный адрес электронной почты."
#: src/wtforms/validators.py:460
msgid "Invalid IP address."
msgstr "Неверный IP адрес."
#: src/wtforms/validators.py:503
msgid "Invalid Mac address."
msgstr "Неверный MAC адрес."
#: src/wtforms/validators.py:540
msgid "Invalid URL."
msgstr "Неверный URL."
#: src/wtforms/validators.py:561
msgid "Invalid UUID."
msgstr "Неверный UUID."
#: src/wtforms/validators.py:594
#, python-format
msgid "Invalid value, must be one of: %(values)s."
msgstr "Неверное значение, должно быть одним из %(values)s."
#: src/wtforms/validators.py:629
#, python-format
msgid "Invalid value, can't be any of: %(values)s."
msgstr "Неверное значение, не должно быть одним из %(values)s."
#: src/wtforms/validators.py:698
#, fuzzy
#| msgid "This field is required."
msgid "This field cannot be edited."
msgstr "Данное поле не может быть изменено."
#: src/wtforms/validators.py:714
msgid "This field is disabled and cannot have a value."
msgstr "Данное поле отключено и не может быть изменено."
#: src/wtforms/csrf/core.py:96
msgid "Invalid CSRF Token."
msgstr "Неверный CSRF токен."
#: src/wtforms/csrf/session.py:63
msgid "CSRF token missing."
msgstr "CSRF токен отсутствует."
#: src/wtforms/csrf/session.py:71
msgid "CSRF failed."
msgstr "Ошибка CSRF."
#: src/wtforms/csrf/session.py:76
msgid "CSRF token expired."
msgstr "CSRF токен просрочен."
#: src/wtforms/fields/choices.py:142
msgid "Invalid Choice: could not coerce."
msgstr "Неверный вариант: невозможно преобразовать."
#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203
msgid "Choices cannot be None."
msgstr "Выбор не может быть None"
#: src/wtforms/fields/choices.py:155
msgid "Not a valid choice."
msgstr "Неверный вариант."
#: src/wtforms/fields/choices.py:193
msgid "Invalid choice(s): one or more data inputs could not be coerced."
msgstr ""
"Неверный вариант(варианты): одно или несколько значений невозможно "
"преобразовать."
#: src/wtforms/fields/choices.py:214
#, fuzzy, python-format
#| msgid "'%(value)s' is not a valid choice for this field."
msgid "'%(value)s' is not a valid choice for this field."
msgid_plural "'%(value)s' are not valid choices for this field."
msgstr[0] "'%(value)s' - неверный вариант для этого поля."
msgstr[1] "'%(value)s' - неверный вариант для этого поля."
msgstr[2] "'%(value)s' - неверный вариант для этого поля."
#: src/wtforms/fields/datetime.py:51
msgid "Not a valid datetime value."
msgstr "Неверное значение даты и времени."
#: src/wtforms/fields/datetime.py:77
msgid "Not a valid date value."
msgstr "Неверное значение даты."
#: src/wtforms/fields/datetime.py:103
msgid "Not a valid time value."
msgstr "Неверное значение времени."
#: src/wtforms/fields/datetime.py:148
msgid "Not a valid week value."
msgstr "Неверное значение недели."
#: src/wtforms/fields/numeric.py:82 src/wtforms/fields/numeric.py:92
msgid "Not a valid integer value."
msgstr "Неверное целое число."
#: src/wtforms/fields/numeric.py:168
msgid "Not a valid decimal value."
msgstr "Неверное десятичное число."
#: src/wtforms/fields/numeric.py:197
msgid "Not a valid float value."
msgstr "Неверное десятичное число."

View File

@@ -0,0 +1,189 @@
# Slovak translations for WTForms.
# Copyright (C) 2020 WTForms Team
# This file is distributed under the same license as the WTForms project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
#
msgid ""
msgstr ""
"Project-Id-Version: WTForms 2.0dev\n"
"Report-Msgid-Bugs-To: eloi.rivard@nubla.fr\n"
"POT-Creation-Date: 2024-01-11 08:20+0100\n"
"PO-Revision-Date: 2024-01-19 21:00+0000\n"
"Last-Translator: Milan Šalka <salka.milan@googlemail.com>\n"
"Language-Team: Slovak <https://hosted.weblate.org/projects/wtforms/wtforms/"
"sk/>\n"
"Language: sk\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);\n"
"X-Generator: Weblate 5.4-dev\n"
"Generated-By: Babel 2.8.0\n"
#: src/wtforms/validators.py:86
#, python-format
msgid "Invalid field name '%s'."
msgstr "Neplatný názov poľa '%s'."
#: src/wtforms/validators.py:99
#, python-format
msgid "Field must be equal to %(other_name)s."
msgstr "Hodnota poľa musí byť rovnaká ako v prípade %(other_name)s."
#: src/wtforms/validators.py:145
#, python-format
msgid "Field must be at least %(min)d character long."
msgid_plural "Field must be at least %(min)d characters long."
msgstr[0] "Pole musí obsahovať aspoň %(min)d znak."
msgstr[1] "Pole musí obsahovať aspoň %(min)d znaky."
msgstr[2] "Pole musí obsahovať aspoň %(min)d znakov."
#: src/wtforms/validators.py:151
#, python-format
msgid "Field cannot be longer than %(max)d character."
msgid_plural "Field cannot be longer than %(max)d characters."
msgstr[0] "Pole nesmie byť dlhšie ako %(max)d znak."
msgstr[1] "Pole nesmie byť dlhšie ako %(max)d znaky."
msgstr[2] "Pole nesmie byť dlhšie ako %(max)d znakov."
#: src/wtforms/validators.py:157
#, python-format
msgid "Field must be exactly %(max)d character long."
msgid_plural "Field must be exactly %(max)d characters long."
msgstr[0] "Pole musí byť presne %(max)d znak dlhé."
msgstr[1] "Pole musí byť presne %(max)d znaky dlhé."
msgstr[2] "Pole musí byť presne %(max)d znakov dlhé."
#: src/wtforms/validators.py:163
#, python-format
msgid "Field must be between %(min)d and %(max)d characters long."
msgstr "Počet znakov v poli musí byť medzi %(min)d a %(max)d."
#: src/wtforms/validators.py:216
#, python-format
msgid "Number must be at least %(min)s."
msgstr "Číslo musí byť aspoň %(min)s."
#: src/wtforms/validators.py:219
#, python-format
msgid "Number must be at most %(max)s."
msgstr "Číslo musí byť najviac %(max)s."
#: src/wtforms/validators.py:222
#, python-format
msgid "Number must be between %(min)s and %(max)s."
msgstr "Číslo musí byť medzi %(min)s a %(max)s."
#: src/wtforms/validators.py:293 src/wtforms/validators.py:323
msgid "This field is required."
msgstr "Toto pole je povinné."
#: src/wtforms/validators.py:358
msgid "Invalid input."
msgstr "Neplatný vstup."
#: src/wtforms/validators.py:422
msgid "Invalid email address."
msgstr "Neplatná emailová adresa."
#: src/wtforms/validators.py:460
msgid "Invalid IP address."
msgstr "Neplatná IP adresa."
#: src/wtforms/validators.py:503
msgid "Invalid Mac address."
msgstr "Neplatná MAC adresa."
#: src/wtforms/validators.py:540
msgid "Invalid URL."
msgstr "Neplatné URL."
#: src/wtforms/validators.py:561
msgid "Invalid UUID."
msgstr "Neplatné UUID."
#: src/wtforms/validators.py:594
#, python-format
msgid "Invalid value, must be one of: %(values)s."
msgstr "Neplatná hodnota, povolené hodnoty sú: %(values)s."
#: src/wtforms/validators.py:629
#, python-format
msgid "Invalid value, can't be any of: %(values)s."
msgstr "Neplatná hodnota, nesmie byť jedna z: %(values)s."
#: src/wtforms/validators.py:698
msgid "This field cannot be edited."
msgstr "Toto pole nie je možné upravovať."
#: src/wtforms/validators.py:714
msgid "This field is disabled and cannot have a value."
msgstr "Toto pole je zakázané a nemôže mať hodnotu."
#: src/wtforms/csrf/core.py:96
msgid "Invalid CSRF Token."
msgstr "Neplatný CSRF token."
#: src/wtforms/csrf/session.py:63
msgid "CSRF token missing."
msgstr "Chýba CSRF token."
#: src/wtforms/csrf/session.py:71
msgid "CSRF failed."
msgstr "Chyba CSRF."
#: src/wtforms/csrf/session.py:76
msgid "CSRF token expired."
msgstr "CSRF token expiroval."
#: src/wtforms/fields/choices.py:142
msgid "Invalid Choice: could not coerce."
msgstr "Neplatná voľba: hodnotu sa nepodarilo previesť."
#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203
msgid "Choices cannot be None."
msgstr "Výbery nemôžu byť žiadne."
#: src/wtforms/fields/choices.py:155
msgid "Not a valid choice."
msgstr "Neplatná voľba."
#: src/wtforms/fields/choices.py:193
msgid "Invalid choice(s): one or more data inputs could not be coerced."
msgstr "Neplatná voľba: jeden alebo viacero vstupov sa nepodarilo previesť."
#: src/wtforms/fields/choices.py:214
#, python-format
msgid "'%(value)s' is not a valid choice for this field."
msgid_plural "'%(value)s' are not valid choices for this field."
msgstr[0] "'%(value)s' nieje platnou voľbou pre toto pole."
msgstr[1] "'%(value)s' niesú platnou voľbou pre toto pole."
msgstr[2] "'%(value)s' nieje platnou voľbou pre toto pole."
#: src/wtforms/fields/datetime.py:51
msgid "Not a valid datetime value."
msgstr "Neplatná hodnota pre dátum a čas."
#: src/wtforms/fields/datetime.py:77
msgid "Not a valid date value."
msgstr "Neplatná hodnota pre dátum."
#: src/wtforms/fields/datetime.py:103
msgid "Not a valid time value."
msgstr "Nie je platná hodnota času."
#: src/wtforms/fields/datetime.py:148
msgid "Not a valid week value."
msgstr "Nie je platný týždeň."
#: src/wtforms/fields/numeric.py:82 src/wtforms/fields/numeric.py:92
msgid "Not a valid integer value."
msgstr "Neplatná hodnota pre celé číslo."
#: src/wtforms/fields/numeric.py:168
msgid "Not a valid decimal value."
msgstr "Nie je platnou desatinnou hodnotou."
#: src/wtforms/fields/numeric.py:197
msgid "Not a valid float value."
msgstr "Neplatná hodnota pre desatinné číslo."

View File

@@ -0,0 +1,185 @@
# Swedish translations for WTForms.
# Copyright (C) 2020 WTForms Team
# This file is distributed under the same license as the WTForms project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
#
msgid ""
msgstr ""
"Project-Id-Version: WTForms 2.0dev\n"
"Report-Msgid-Bugs-To: eloi.rivard@nubla.fr\n"
"POT-Creation-Date: 2024-01-11 08:20+0100\n"
"PO-Revision-Date: 2024-01-24 11:01+0000\n"
"Last-Translator: bittin1ddc447d824349b2 <bittin@reimu.nl>\n"
"Language-Team: Swedish <https://hosted.weblate.org/projects/wtforms/wtforms/"
"sv/>\n"
"Language: sv\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.4-dev\n"
"Generated-By: Babel 2.8.0\n"
#: src/wtforms/validators.py:86
#, python-format
msgid "Invalid field name '%s'."
msgstr "Felaktigt fältnamn '%s'."
#: src/wtforms/validators.py:99
#, python-format
msgid "Field must be equal to %(other_name)s."
msgstr "Fältvärdet måste matcha %(other_name)s."
#: src/wtforms/validators.py:145
#, python-format
msgid "Field must be at least %(min)d character long."
msgid_plural "Field must be at least %(min)d characters long."
msgstr[0] "Fältet måste vara minst %(min)d tecken långt."
msgstr[1] "Fältet måste vara minst %(min)d tecken långt."
#: src/wtforms/validators.py:151
#, python-format
msgid "Field cannot be longer than %(max)d character."
msgid_plural "Field cannot be longer than %(max)d characters."
msgstr[0] "Fältet får inte vara längre än %(max)d tecken."
msgstr[1] "Fältet får inte vara längre än %(max)d tecken."
#: src/wtforms/validators.py:157
#, python-format
msgid "Field must be exactly %(max)d character long."
msgid_plural "Field must be exactly %(max)d characters long."
msgstr[0] "Fält måste vara exakt %(max)d tecken långt."
msgstr[1] "Fältet måste vara exakt %(max)d tecken långt."
#: src/wtforms/validators.py:163
#, python-format
msgid "Field must be between %(min)d and %(max)d characters long."
msgstr "Fältet måste vara mellan %(min)d och %(max)d tecken långt."
#: src/wtforms/validators.py:216
#, python-format
msgid "Number must be at least %(min)s."
msgstr "Numret får inte vara mindre än %(min)s."
#: src/wtforms/validators.py:219
#, python-format
msgid "Number must be at most %(max)s."
msgstr "Numret får inte vara högre än %(max)s."
#: src/wtforms/validators.py:222
#, python-format
msgid "Number must be between %(min)s and %(max)s."
msgstr "Numret måste vara mellan %(min)s och %(max)s."
#: src/wtforms/validators.py:293 src/wtforms/validators.py:323
msgid "This field is required."
msgstr "Det här fältet är obligatoriskt."
#: src/wtforms/validators.py:358
msgid "Invalid input."
msgstr "Felaktig indata."
#: src/wtforms/validators.py:422
msgid "Invalid email address."
msgstr "Felaktig epost-adress."
#: src/wtforms/validators.py:460
msgid "Invalid IP address."
msgstr "Felaktig IP-adress."
#: src/wtforms/validators.py:503
msgid "Invalid Mac address."
msgstr "Felaktig MAC-adress."
#: src/wtforms/validators.py:540
msgid "Invalid URL."
msgstr "Felaktig URL."
#: src/wtforms/validators.py:561
msgid "Invalid UUID."
msgstr "Felaktig UUID."
#: src/wtforms/validators.py:594
#, python-format
msgid "Invalid value, must be one of: %(values)s."
msgstr "Felaktigt värde, måste vara ett av: %(values)s."
#: src/wtforms/validators.py:629
#, python-format
msgid "Invalid value, can't be any of: %(values)s."
msgstr "Felaktigt värde, får inte vara något av: %(values)s."
#: src/wtforms/validators.py:698
msgid "This field cannot be edited."
msgstr "Detta fält kan inte redigeras."
#: src/wtforms/validators.py:714
msgid "This field is disabled and cannot have a value."
msgstr "Det här fältet är inaktiverat och kan inte ha ett värde."
#: src/wtforms/csrf/core.py:96
msgid "Invalid CSRF Token."
msgstr "Felaktigt CSRF-token"
#: src/wtforms/csrf/session.py:63
msgid "CSRF token missing."
msgstr "CSRF-token saknas"
#: src/wtforms/csrf/session.py:71
msgid "CSRF failed."
msgstr "CSRF misslyckades"
#: src/wtforms/csrf/session.py:76
msgid "CSRF token expired."
msgstr "CSRF-token utdaterat"
#: src/wtforms/fields/choices.py:142
msgid "Invalid Choice: could not coerce."
msgstr "Felaktigt val; kunde inte ceorce:a"
#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203
msgid "Choices cannot be None."
msgstr "Val kan inte vara Inga."
#: src/wtforms/fields/choices.py:155
msgid "Not a valid choice."
msgstr "Inte ett giltigt val"
#: src/wtforms/fields/choices.py:193
msgid "Invalid choice(s): one or more data inputs could not be coerced."
msgstr "Felaktigt val; ett eller flera inputfält kunde inte coerca:s"
#: src/wtforms/fields/choices.py:214
#, python-format
msgid "'%(value)s' is not a valid choice for this field."
msgid_plural "'%(value)s' are not valid choices for this field."
msgstr[0] "'%(value)s' är inte ett giltigt val för detta fält."
msgstr[1] "'%(value)s' är inte giltiga val för detta fält."
#: src/wtforms/fields/datetime.py:51
msgid "Not a valid datetime value."
msgstr "Inte ett giltigt datum-/tidsvärde"
#: src/wtforms/fields/datetime.py:77
msgid "Not a valid date value."
msgstr "Inte ett giltigt datum"
#: src/wtforms/fields/datetime.py:103
msgid "Not a valid time value."
msgstr "Inte ett giltigt tidsvärde."
#: src/wtforms/fields/datetime.py:148
msgid "Not a valid week value."
msgstr "Inte ett giltigt veckovärde."
#: src/wtforms/fields/numeric.py:82 src/wtforms/fields/numeric.py:92
msgid "Not a valid integer value."
msgstr "Inte ett giltigt heltal"
#: src/wtforms/fields/numeric.py:168
msgid "Not a valid decimal value."
msgstr "Inte ett giltigt decimaltal"
#: src/wtforms/fields/numeric.py:197
msgid "Not a valid float value."
msgstr "Inte ett giltigt flyttal"

View File

@@ -0,0 +1,185 @@
# Turkish translations for WTForms.
# Copyright (C) 2020 WTForms Team
# This file is distributed under the same license as the WTForms project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
#
msgid ""
msgstr ""
"Project-Id-Version: WTForms 1.0.4\n"
"Report-Msgid-Bugs-To: eloi.rivard@nubla.fr\n"
"POT-Creation-Date: 2024-01-11 08:20+0100\n"
"PO-Revision-Date: 2024-01-22 19:01+0000\n"
"Last-Translator: Oğuz Ersen <oguz@ersen.moe>\n"
"Language-Team: Turkish <https://hosted.weblate.org/projects/wtforms/wtforms/"
"tr/>\n"
"Language: tr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.4-dev\n"
"Generated-By: Babel 2.8.0\n"
#: src/wtforms/validators.py:86
#, python-format
msgid "Invalid field name '%s'."
msgstr "Geçersiz alan adı '%s'."
#: src/wtforms/validators.py:99
#, python-format
msgid "Field must be equal to %(other_name)s."
msgstr "Alan %(other_name)s ile eşit olmalı."
#: src/wtforms/validators.py:145
#, python-format
msgid "Field must be at least %(min)d character long."
msgid_plural "Field must be at least %(min)d characters long."
msgstr[0] "Alan en az %(min)d karakter uzunluğunda olmalı."
msgstr[1] "Alan en az %(min)d karakter uzunluğunda olmalı."
#: src/wtforms/validators.py:151
#, python-format
msgid "Field cannot be longer than %(max)d character."
msgid_plural "Field cannot be longer than %(max)d characters."
msgstr[0] "Alan %(max)d karakterden uzun olamaz."
msgstr[1] "Alan %(max)d karakterden uzun olamaz."
#: src/wtforms/validators.py:157
#, python-format
msgid "Field must be exactly %(max)d character long."
msgid_plural "Field must be exactly %(max)d characters long."
msgstr[0] "Alan tam olarak %(max)d karakter uzunluğunda olmalı."
msgstr[1] "Alan tam olarak %(max)d karakter uzunluğunda olmalı."
#: src/wtforms/validators.py:163
#, python-format
msgid "Field must be between %(min)d and %(max)d characters long."
msgstr "Alanın uzunluğu %(min)d ile %(max)d karakter arasında olmalıdır."
#: src/wtforms/validators.py:216
#, python-format
msgid "Number must be at least %(min)s."
msgstr "Sayı en az %(min)s olmalıdır."
#: src/wtforms/validators.py:219
#, python-format
msgid "Number must be at most %(max)s."
msgstr "Sayı en fazla %(max)s olmalıdır."
#: src/wtforms/validators.py:222
#, python-format
msgid "Number must be between %(min)s and %(max)s."
msgstr "Sayı %(min)s ile %(max)s arasında olmalıdır."
#: src/wtforms/validators.py:293 src/wtforms/validators.py:323
msgid "This field is required."
msgstr "Bu alan zorunludur."
#: src/wtforms/validators.py:358
msgid "Invalid input."
msgstr "Geçersiz girdi."
#: src/wtforms/validators.py:422
msgid "Invalid email address."
msgstr "Geçersiz e-posta adresi."
#: src/wtforms/validators.py:460
msgid "Invalid IP address."
msgstr "Geçersiz IP adresi."
#: src/wtforms/validators.py:503
msgid "Invalid Mac address."
msgstr "Geçersiz Mac adresi."
#: src/wtforms/validators.py:540
msgid "Invalid URL."
msgstr "Geçersiz URL."
#: src/wtforms/validators.py:561
msgid "Invalid UUID."
msgstr "Geçersiz UUID."
#: src/wtforms/validators.py:594
#, python-format
msgid "Invalid value, must be one of: %(values)s."
msgstr "Geçersiz değer, değerlerden biri olmalı: %(values)s ."
#: src/wtforms/validators.py:629
#, python-format
msgid "Invalid value, can't be any of: %(values)s."
msgstr "Geçersiz değer, değerlerden biri olamaz: %(values)s."
#: src/wtforms/validators.py:698
msgid "This field cannot be edited."
msgstr "Bu alan düzenlenemez."
#: src/wtforms/validators.py:714
msgid "This field is disabled and cannot have a value."
msgstr "Bu alan devre dışıdır ve bir değere sahip olamaz."
#: src/wtforms/csrf/core.py:96
msgid "Invalid CSRF Token."
msgstr "Geçersiz CSRF Anahtarı."
#: src/wtforms/csrf/session.py:63
msgid "CSRF token missing."
msgstr "CSRF anahtarı gerekli."
#: src/wtforms/csrf/session.py:71
msgid "CSRF failed."
msgstr "CSRF hatalı."
#: src/wtforms/csrf/session.py:76
msgid "CSRF token expired."
msgstr "CSRF anahtarının süresi doldu."
#: src/wtforms/fields/choices.py:142
msgid "Invalid Choice: could not coerce."
msgstr "Geçersiz seçim: tip uyuşmazlığı."
#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203
msgid "Choices cannot be None."
msgstr "Seçimler Hiçbiri olamaz."
#: src/wtforms/fields/choices.py:155
msgid "Not a valid choice."
msgstr "Geçerli bir seçenek değil."
#: src/wtforms/fields/choices.py:193
msgid "Invalid choice(s): one or more data inputs could not be coerced."
msgstr "Geçersiz seçenek: bir yada daha fazla tip uyuşmazlığı."
#: src/wtforms/fields/choices.py:214
#, python-format
msgid "'%(value)s' is not a valid choice for this field."
msgid_plural "'%(value)s' are not valid choices for this field."
msgstr[0] "'%(value)s' bu alan için geçerli bir seçim değil."
msgstr[1] "'%(value)s' bu alan için geçerli bir seçim değil."
#: src/wtforms/fields/datetime.py:51
msgid "Not a valid datetime value."
msgstr "Geçerli bir tarih-saat değeri değil."
#: src/wtforms/fields/datetime.py:77
msgid "Not a valid date value."
msgstr "Geçerli bir tarih değeri değil."
#: src/wtforms/fields/datetime.py:103
msgid "Not a valid time value."
msgstr "Geçerli bir zaman değeri değil."
#: src/wtforms/fields/datetime.py:148
msgid "Not a valid week value."
msgstr "Geçerli bir hafta değeri değil."
#: src/wtforms/fields/numeric.py:82 src/wtforms/fields/numeric.py:92
msgid "Not a valid integer value."
msgstr "Geçerli bir tam sayı değeri değil."
#: src/wtforms/fields/numeric.py:168
msgid "Not a valid decimal value."
msgstr "Geçerli bir ondalık sayı değeri değil."
#: src/wtforms/fields/numeric.py:197
msgid "Not a valid float value."
msgstr "Geçerli bir ondalık sayı değeri değil."

View File

@@ -0,0 +1,190 @@
# Ukrainian translations for WTForms.
# Copyright (C) 2020 WTForms Team
# This file is distributed under the same license as the WTForms project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
#
msgid ""
msgstr ""
"Project-Id-Version: WTForms 2.0dev\n"
"Report-Msgid-Bugs-To: eloi.rivard@nubla.fr\n"
"POT-Creation-Date: 2024-01-11 08:20+0100\n"
"PO-Revision-Date: 2024-01-15 09:06+0000\n"
"Last-Translator: Сергій <sergiy.goncharuk.1@gmail.com>\n"
"Language-Team: Ukrainian <https://hosted.weblate.org/projects/wtforms/"
"wtforms/uk/>\n"
"Language: uk\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Generator: Weblate 5.4-dev\n"
"Generated-By: Babel 2.8.0\n"
#: src/wtforms/validators.py:86
#, python-format
msgid "Invalid field name '%s'."
msgstr "Невірне ім'я поля '%s'."
#: src/wtforms/validators.py:99
#, python-format
msgid "Field must be equal to %(other_name)s."
msgstr "Поле має співпадати з %(other_name)s."
#: src/wtforms/validators.py:145
#, python-format
msgid "Field must be at least %(min)d character long."
msgid_plural "Field must be at least %(min)d characters long."
msgstr[0] "Значення поля має містити не менше %(min)d символа."
msgstr[1] "Значення поля має містити не менше ніж %(min)d символи."
msgstr[2] "Значення поля має містити не менше ніж %(min)d символів."
#: src/wtforms/validators.py:151
#, python-format
msgid "Field cannot be longer than %(max)d character."
msgid_plural "Field cannot be longer than %(max)d characters."
msgstr[0] "Значення поля має містити не більше %(max)d символа."
msgstr[1] "Значення поля має містити не більше ніж %(max)d символи."
msgstr[2] "Значення поля має містити не більше ніж %(max)d символів."
#: src/wtforms/validators.py:157
#, python-format
msgid "Field must be exactly %(max)d character long."
msgid_plural "Field must be exactly %(max)d characters long."
msgstr[0] "Поле повинно мати довжину рівно %(max)d символі."
msgstr[1] "Поле повинно мати довжину рівно %(max)d символи."
msgstr[2] "Поле повинно мати довжину рівно %(max)d символів."
#: src/wtforms/validators.py:163
#, python-format
msgid "Field must be between %(min)d and %(max)d characters long."
msgstr "Значення поля має містити від %(min)d до %(max)d символів."
#: src/wtforms/validators.py:216
#, python-format
msgid "Number must be at least %(min)s."
msgstr "Число має бути щонайменше %(min)s."
#: src/wtforms/validators.py:219
#, python-format
msgid "Number must be at most %(max)s."
msgstr "Число має бути щонайбільше %(max)s."
#: src/wtforms/validators.py:222
#, python-format
msgid "Number must be between %(min)s and %(max)s."
msgstr "Число має бути між %(min)s та %(max)s."
#: src/wtforms/validators.py:293 src/wtforms/validators.py:323
msgid "This field is required."
msgstr "Це поле є обов'язковим."
#: src/wtforms/validators.py:358
msgid "Invalid input."
msgstr "Введено невірно."
#: src/wtforms/validators.py:422
msgid "Invalid email address."
msgstr "Невірна електронна адреса."
#: src/wtforms/validators.py:460
msgid "Invalid IP address."
msgstr "Невірна IP адреса."
#: src/wtforms/validators.py:503
msgid "Invalid Mac address."
msgstr "Невірна Mac адреса."
#: src/wtforms/validators.py:540
msgid "Invalid URL."
msgstr "Невірний URL."
#: src/wtforms/validators.py:561
msgid "Invalid UUID."
msgstr "Невірний UUID."
#: src/wtforms/validators.py:594
#, python-format
msgid "Invalid value, must be one of: %(values)s."
msgstr "Значення невірне, має бути одним з: %(values)s."
#: src/wtforms/validators.py:629
#, python-format
msgid "Invalid value, can't be any of: %(values)s."
msgstr "Значення невірне, не може бути одним з: %(values)s."
#: src/wtforms/validators.py:698
msgid "This field cannot be edited."
msgstr "Це поле не можна редагувати."
#: src/wtforms/validators.py:714
msgid "This field is disabled and cannot have a value."
msgstr "Це поле неактивне і не може містити значення."
#: src/wtforms/csrf/core.py:96
msgid "Invalid CSRF Token."
msgstr "Невірний CSRF токен."
#: src/wtforms/csrf/session.py:63
msgid "CSRF token missing."
msgstr "CSRF токен відсутній."
#: src/wtforms/csrf/session.py:71
msgid "CSRF failed."
msgstr "Помилка CSRF."
#: src/wtforms/csrf/session.py:76
msgid "CSRF token expired."
msgstr "CSRF токен прострочений."
#: src/wtforms/fields/choices.py:142
msgid "Invalid Choice: could not coerce."
msgstr "Недійсний варіант: перетворення неможливе."
#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203
msgid "Choices cannot be None."
msgstr "Варіанти не можуть бути None."
#: src/wtforms/fields/choices.py:155
msgid "Not a valid choice."
msgstr "Недійсний варіант."
#: src/wtforms/fields/choices.py:193
msgid "Invalid choice(s): one or more data inputs could not be coerced."
msgstr "Недійсний варіант: одне чи більше значень неможливо перетворити."
#: src/wtforms/fields/choices.py:214
#, python-format
msgid "'%(value)s' is not a valid choice for this field."
msgid_plural "'%(value)s' are not valid choices for this field."
msgstr[0] "'%(value)s' не є дійсним варіантом для цього поля."
msgstr[1] "'%(value)s' не є дійсним варіантом для цього поля."
msgstr[2] "'%(value)s' не є дійсним варіантом для цього поля."
#: src/wtforms/fields/datetime.py:51
msgid "Not a valid datetime value."
msgstr "Недійсне значення дати/часу."
#: src/wtforms/fields/datetime.py:77
msgid "Not a valid date value."
msgstr "Не дійсне значення дати."
#: src/wtforms/fields/datetime.py:103
msgid "Not a valid time value."
msgstr "Не дійсне значення часу."
#: src/wtforms/fields/datetime.py:148
msgid "Not a valid week value."
msgstr "Недійсне значення тижня."
#: src/wtforms/fields/numeric.py:82 src/wtforms/fields/numeric.py:92
msgid "Not a valid integer value."
msgstr "Недійсне ціле число."
#: src/wtforms/fields/numeric.py:168
msgid "Not a valid decimal value."
msgstr "Не є дійсним десятковим числом."
#: src/wtforms/fields/numeric.py:197
msgid "Not a valid float value."
msgstr "Недійсне число з рухомою комою."

View File

@@ -0,0 +1,182 @@
# Translations template for WTForms.
# Copyright (C) 2024 WTForms Team
# This file is distributed under the same license as the WTForms project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2024.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: WTForms 3.0.0\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-01-11 08:20+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.12.1\n"
#: src/wtforms/validators.py:86
#, python-format
msgid "Invalid field name '%s'."
msgstr ""
#: src/wtforms/validators.py:99
#, python-format
msgid "Field must be equal to %(other_name)s."
msgstr ""
#: src/wtforms/validators.py:145
#, python-format
msgid "Field must be at least %(min)d character long."
msgid_plural "Field must be at least %(min)d characters long."
msgstr[0] ""
msgstr[1] ""
#: src/wtforms/validators.py:151
#, python-format
msgid "Field cannot be longer than %(max)d character."
msgid_plural "Field cannot be longer than %(max)d characters."
msgstr[0] ""
msgstr[1] ""
#: src/wtforms/validators.py:157
#, python-format
msgid "Field must be exactly %(max)d character long."
msgid_plural "Field must be exactly %(max)d characters long."
msgstr[0] ""
msgstr[1] ""
#: src/wtforms/validators.py:163
#, python-format
msgid "Field must be between %(min)d and %(max)d characters long."
msgstr ""
#: src/wtforms/validators.py:216
#, python-format
msgid "Number must be at least %(min)s."
msgstr ""
#: src/wtforms/validators.py:219
#, python-format
msgid "Number must be at most %(max)s."
msgstr ""
#: src/wtforms/validators.py:222
#, python-format
msgid "Number must be between %(min)s and %(max)s."
msgstr ""
#: src/wtforms/validators.py:293 src/wtforms/validators.py:323
msgid "This field is required."
msgstr ""
#: src/wtforms/validators.py:358
msgid "Invalid input."
msgstr ""
#: src/wtforms/validators.py:422
msgid "Invalid email address."
msgstr ""
#: src/wtforms/validators.py:460
msgid "Invalid IP address."
msgstr ""
#: src/wtforms/validators.py:503
msgid "Invalid Mac address."
msgstr ""
#: src/wtforms/validators.py:540
msgid "Invalid URL."
msgstr ""
#: src/wtforms/validators.py:561
msgid "Invalid UUID."
msgstr ""
#: src/wtforms/validators.py:594
#, python-format
msgid "Invalid value, must be one of: %(values)s."
msgstr ""
#: src/wtforms/validators.py:629
#, python-format
msgid "Invalid value, can't be any of: %(values)s."
msgstr ""
#: src/wtforms/validators.py:698
msgid "This field cannot be edited."
msgstr ""
#: src/wtforms/validators.py:714
msgid "This field is disabled and cannot have a value."
msgstr ""
#: src/wtforms/csrf/core.py:96
msgid "Invalid CSRF Token."
msgstr ""
#: src/wtforms/csrf/session.py:63
msgid "CSRF token missing."
msgstr ""
#: src/wtforms/csrf/session.py:71
msgid "CSRF failed."
msgstr ""
#: src/wtforms/csrf/session.py:76
msgid "CSRF token expired."
msgstr ""
#: src/wtforms/fields/choices.py:142
msgid "Invalid Choice: could not coerce."
msgstr ""
#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203
msgid "Choices cannot be None."
msgstr ""
#: src/wtforms/fields/choices.py:155
msgid "Not a valid choice."
msgstr ""
#: src/wtforms/fields/choices.py:193
msgid "Invalid choice(s): one or more data inputs could not be coerced."
msgstr ""
#: src/wtforms/fields/choices.py:214
#, python-format
msgid "'%(value)s' is not a valid choice for this field."
msgid_plural "'%(value)s' are not valid choices for this field."
msgstr[0] ""
msgstr[1] ""
#: src/wtforms/fields/datetime.py:51
msgid "Not a valid datetime value."
msgstr ""
#: src/wtforms/fields/datetime.py:77
msgid "Not a valid date value."
msgstr ""
#: src/wtforms/fields/datetime.py:103
msgid "Not a valid time value."
msgstr ""
#: src/wtforms/fields/datetime.py:148
msgid "Not a valid week value."
msgstr ""
#: src/wtforms/fields/numeric.py:82 src/wtforms/fields/numeric.py:92
msgid "Not a valid integer value."
msgstr ""
#: src/wtforms/fields/numeric.py:168
msgid "Not a valid decimal value."
msgstr ""
#: src/wtforms/fields/numeric.py:197
msgid "Not a valid float value."
msgstr ""

View File

@@ -0,0 +1,188 @@
# Chinese translations for WTForms.
# Copyright (C) 2020 WTForms Team
# This file is distributed under the same license as the WTForms project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
#
msgid ""
msgstr ""
"Project-Id-Version: WTForms 1.0.3\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2024-01-11 08:20+0100\n"
"PO-Revision-Date: 2012-01-31 13:03-0700\n"
"Last-Translator: Grey Li <withlihui@gmail.com>\n"
"Language-Team: zh_CN <james+i18n@simplecodes.com>\n"
"Language: zh\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
"Generated-By: Babel 2.8.0\n"
#: src/wtforms/validators.py:86
#, python-format
msgid "Invalid field name '%s'."
msgstr "'%s' 是无效的字段名。"
#: src/wtforms/validators.py:99
#, python-format
msgid "Field must be equal to %(other_name)s."
msgstr "字段必须和 %(other_name)s 相等。"
#: src/wtforms/validators.py:145
#, python-format
msgid "Field must be at least %(min)d character long."
msgid_plural "Field must be at least %(min)d characters long."
msgstr[0] "字段长度必须至少 %(min)d 个字符。"
msgstr[1] "字段长度必须至少 %(min)d 个字符。"
#: src/wtforms/validators.py:151
#, python-format
msgid "Field cannot be longer than %(max)d character."
msgid_plural "Field cannot be longer than %(max)d characters."
msgstr[0] "字段长度不能超过 %(max)d 个字符。"
msgstr[1] "字段长度不能超过 %(max)d 个字符。"
#: src/wtforms/validators.py:157
#, python-format
msgid "Field must be exactly %(max)d character long."
msgid_plural "Field must be exactly %(max)d characters long."
msgstr[0] "字段长度必须为 %(max)d 个字符。"
msgstr[1] "字段长度必须为 %(max)d 个字符。"
#: src/wtforms/validators.py:163
#, python-format
msgid "Field must be between %(min)d and %(max)d characters long."
msgstr "字段长度必须介于 %(min)d 到 %(max)d 个字符之间。"
#: src/wtforms/validators.py:216
#, python-format
msgid "Number must be at least %(min)s."
msgstr "数值必须大于 %(min)s。"
#: src/wtforms/validators.py:219
#, python-format
msgid "Number must be at most %(max)s."
msgstr "数值必须小于 %(max)s。"
#: src/wtforms/validators.py:222
#, python-format
msgid "Number must be between %(min)s and %(max)s."
msgstr "数值大小必须介于 %(min)s 到 %(max)s 之间。"
#: src/wtforms/validators.py:293 src/wtforms/validators.py:323
msgid "This field is required."
msgstr "该字段是必填字段。"
#: src/wtforms/validators.py:358
msgid "Invalid input."
msgstr "无效的输入。"
#: src/wtforms/validators.py:422
msgid "Invalid email address."
msgstr "无效的 Email 地址。"
#: src/wtforms/validators.py:460
msgid "Invalid IP address."
msgstr "无效的 IP 地址。"
#: src/wtforms/validators.py:503
msgid "Invalid Mac address."
msgstr "无效的 MAC 地址。"
#: src/wtforms/validators.py:540
msgid "Invalid URL."
msgstr "无效的 URL。"
#: src/wtforms/validators.py:561
msgid "Invalid UUID."
msgstr "无效的 UUID。"
#: src/wtforms/validators.py:594
#, python-format
msgid "Invalid value, must be one of: %(values)s."
msgstr "无效的值,必须是下列之一: %(values)s。"
#: src/wtforms/validators.py:629
#, python-format
msgid "Invalid value, can't be any of: %(values)s."
msgstr "无效的值,不能是下列任何一个: %(values)s。"
#: src/wtforms/validators.py:698
#, fuzzy
#| msgid "This field is required."
msgid "This field cannot be edited."
msgstr "该字段是必填字段。"
#: src/wtforms/validators.py:714
msgid "This field is disabled and cannot have a value."
msgstr ""
#: src/wtforms/csrf/core.py:96
msgid "Invalid CSRF Token."
msgstr "无效的 CSRF 验证令牌。"
#: src/wtforms/csrf/session.py:63
msgid "CSRF token missing."
msgstr "缺失 CSRF 验证令牌。"
#: src/wtforms/csrf/session.py:71
msgid "CSRF failed."
msgstr "CSRF 验证失败。"
#: src/wtforms/csrf/session.py:76
msgid "CSRF token expired."
msgstr "CSRF 验证令牌过期。"
#: src/wtforms/fields/choices.py:142
msgid "Invalid Choice: could not coerce."
msgstr "选择无效:无法转化类型。"
#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203
msgid "Choices cannot be None."
msgstr "选择不能是空值。"
#: src/wtforms/fields/choices.py:155
msgid "Not a valid choice."
msgstr "不是有效的选择。"
#: src/wtforms/fields/choices.py:193
msgid "Invalid choice(s): one or more data inputs could not be coerced."
msgstr "选择无效:至少一个数据输入无法被转化类型。"
#: src/wtforms/fields/choices.py:214
#, fuzzy, python-format
#| msgid "'%(value)s' is not a valid choice for this field."
msgid "'%(value)s' is not a valid choice for this field."
msgid_plural "'%(value)s' are not valid choices for this field."
msgstr[0] "“%(value)s” 对该字段而言是无效选项。"
msgstr[1] "“%(value)s” 对该字段而言是无效选项。"
#: src/wtforms/fields/datetime.py:51
msgid "Not a valid datetime value."
msgstr "不是有效的日期与时间值。"
#: src/wtforms/fields/datetime.py:77
msgid "Not a valid date value."
msgstr "不是有效的日期值。"
#: src/wtforms/fields/datetime.py:103
msgid "Not a valid time value."
msgstr "不是有效的时间值。"
#: src/wtforms/fields/datetime.py:148
#, fuzzy
#| msgid "Not a valid date value."
msgid "Not a valid week value."
msgstr "不是有效的日期值。"
#: src/wtforms/fields/numeric.py:82 src/wtforms/fields/numeric.py:92
msgid "Not a valid integer value."
msgstr "不是有效的整数。"
#: src/wtforms/fields/numeric.py:168
msgid "Not a valid decimal value."
msgstr "不是有效的小数。"
#: src/wtforms/fields/numeric.py:197
msgid "Not a valid float value."
msgstr "不是有效的浮点数。"

View File

@@ -0,0 +1,181 @@
# Chinese (Traditional, Taiwan) translations for WTForms.
# Copyright (C) 2020 WTForms Team
# This file is distributed under the same license as the WTForms project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2020.
#
msgid ""
msgstr ""
"Project-Id-Version: WTForms 1.0.3\n"
"Report-Msgid-Bugs-To: eloi.rivard@nubla.fr\n"
"POT-Creation-Date: 2024-01-11 08:20+0100\n"
"PO-Revision-Date: 2024-06-30 03:38+0000\n"
"Last-Translator: hugoalh <hugoalh@users.noreply.hosted.weblate.org>\n"
"Language-Team: Chinese (Traditional) <https://hosted.weblate.org/projects/"
"wtforms/wtforms/zh_Hant/>\n"
"Language: zh_TW\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 5.7-dev\n"
"Generated-By: Babel 2.8.0\n"
#: src/wtforms/validators.py:86
#, python-format
msgid "Invalid field name '%s'."
msgstr "無效的欄位名稱「%s」。"
#: src/wtforms/validators.py:99
#, python-format
msgid "Field must be equal to %(other_name)s."
msgstr "欄位必須與 %(other_name)s 相同。"
#: src/wtforms/validators.py:145
#, python-format
msgid "Field must be at least %(min)d character long."
msgid_plural "Field must be at least %(min)d characters long."
msgstr[0] "欄位長度必須至少為 %(min)d 個字元。"
#: src/wtforms/validators.py:151
#, python-format
msgid "Field cannot be longer than %(max)d character."
msgid_plural "Field cannot be longer than %(max)d characters."
msgstr[0] "欄位長度不能超過 %(max)d 個字元。"
#: src/wtforms/validators.py:157
#, python-format
msgid "Field must be exactly %(max)d character long."
msgid_plural "Field must be exactly %(max)d characters long."
msgstr[0] "欄位長度必須剛好為 %(max)d 個字元。"
#: src/wtforms/validators.py:163
#, python-format
msgid "Field must be between %(min)d and %(max)d characters long."
msgstr "欄位長度必須介於 %(min)d 和 %(max)d 個字元之間。"
#: src/wtforms/validators.py:216
#, python-format
msgid "Number must be at least %(min)s."
msgstr "數字必須至少為 %(min)s。"
#: src/wtforms/validators.py:219
#, python-format
msgid "Number must be at most %(max)s."
msgstr "數字必須至多為 %(max)s。"
#: src/wtforms/validators.py:222
#, python-format
msgid "Number must be between %(min)s and %(max)s."
msgstr "數字必須介於 %(min)s 和 %(max)s 之間。"
#: src/wtforms/validators.py:293 src/wtforms/validators.py:323
msgid "This field is required."
msgstr "此欄位是必需的。"
#: src/wtforms/validators.py:358
msgid "Invalid input."
msgstr "無效的輸入。"
#: src/wtforms/validators.py:422
msgid "Invalid email address."
msgstr "無效的電子郵件地址。"
#: src/wtforms/validators.py:460
msgid "Invalid IP address."
msgstr "無效的 IP 位址。"
#: src/wtforms/validators.py:503
msgid "Invalid Mac address."
msgstr "無效的 MAC 位址。"
#: src/wtforms/validators.py:540
msgid "Invalid URL."
msgstr "無效的網址。"
#: src/wtforms/validators.py:561
msgid "Invalid UUID."
msgstr "無效的 UUID。"
#: src/wtforms/validators.py:594
#, python-format
msgid "Invalid value, must be one of: %(values)s."
msgstr "無效的值,必須為以下之一:%(values)s。"
#: src/wtforms/validators.py:629
#, python-format
msgid "Invalid value, can't be any of: %(values)s."
msgstr "無效的值,不能為以下之一:%(values)s。"
#: src/wtforms/validators.py:698
msgid "This field cannot be edited."
msgstr "此欄位不能編輯。"
#: src/wtforms/validators.py:714
msgid "This field is disabled and cannot have a value."
msgstr "此欄位被停用並且不能有值。"
#: src/wtforms/csrf/core.py:96
msgid "Invalid CSRF Token."
msgstr "無效的 CSRF 憑證。"
#: src/wtforms/csrf/session.py:63
msgid "CSRF token missing."
msgstr "CSRF 憑證不存在。"
#: src/wtforms/csrf/session.py:71
msgid "CSRF failed."
msgstr "CSRF 驗證失敗。"
#: src/wtforms/csrf/session.py:76
msgid "CSRF token expired."
msgstr "CSRF 憑證過期。"
#: src/wtforms/fields/choices.py:142
msgid "Invalid Choice: could not coerce."
msgstr "無效的選擇:無法強制轉化。"
#: src/wtforms/fields/choices.py:149 src/wtforms/fields/choices.py:203
msgid "Choices cannot be None."
msgstr "選擇不能為空值。"
#: src/wtforms/fields/choices.py:155
msgid "Not a valid choice."
msgstr "不是有效的選擇。"
#: src/wtforms/fields/choices.py:193
msgid "Invalid choice(s): one or more data inputs could not be coerced."
msgstr "無效的選擇:至少有一筆資料無法被強制轉化。"
#: src/wtforms/fields/choices.py:214
#, python-format
msgid "'%(value)s' is not a valid choice for this field."
msgid_plural "'%(value)s' are not valid choices for this field."
msgstr[0] "「%(value)s」不是此欄位的有效選擇。"
#: src/wtforms/fields/datetime.py:51
msgid "Not a valid datetime value."
msgstr "不是有效的日期與時間值。"
#: src/wtforms/fields/datetime.py:77
msgid "Not a valid date value."
msgstr "不是有效的日期值。"
#: src/wtforms/fields/datetime.py:103
msgid "Not a valid time value."
msgstr "不是有效的時間值。"
#: src/wtforms/fields/datetime.py:148
msgid "Not a valid week value."
msgstr "不是有效的週值。"
#: src/wtforms/fields/numeric.py:82 src/wtforms/fields/numeric.py:92
msgid "Not a valid integer value."
msgstr "不是有效的整數值。"
#: src/wtforms/fields/numeric.py:168
msgid "Not a valid decimal value."
msgstr "不是有效的十進位數值。"
#: src/wtforms/fields/numeric.py:197
msgid "Not a valid float value."
msgstr "不是有效的浮點數值。"

View File

@@ -0,0 +1,132 @@
from wtforms import i18n
from wtforms.utils import WebobInputWrapper
from wtforms.widgets.core import clean_key
class DefaultMeta:
"""
This is the default Meta class which defines all the default values and
therefore also the 'API' of the class Meta interface.
"""
# -- Basic form primitives
def bind_field(self, form, unbound_field, options):
"""
bind_field allows potential customization of how fields are bound.
The default implementation simply passes the options to
:meth:`UnboundField.bind`.
:param form: The form.
:param unbound_field: The unbound field.
:param options:
A dictionary of options which are typically passed to the field.
:return: A bound field
"""
return unbound_field.bind(form=form, **options)
def wrap_formdata(self, form, formdata):
"""
wrap_formdata allows doing custom wrappers of WTForms formdata.
The default implementation detects webob-style multidicts and wraps
them, otherwise passes formdata back un-changed.
:param form: The form.
:param formdata: Form data.
:return: A form-input wrapper compatible with WTForms.
"""
if formdata is not None and not hasattr(formdata, "getlist"):
if hasattr(formdata, "getall"):
return WebobInputWrapper(formdata)
else:
raise TypeError(
"formdata should be a multidict-type wrapper that"
" supports the 'getlist' method"
)
return formdata
def render_field(self, field, render_kw):
"""
render_field allows customization of how widget rendering is done.
The default implementation calls ``field.widget(field, **render_kw)``
"""
render_kw = {clean_key(k): v for k, v in render_kw.items()}
other_kw = getattr(field, "render_kw", None)
if other_kw is not None:
other_kw = {clean_key(k): v for k, v in other_kw.items()}
render_kw = dict(other_kw, **render_kw)
return field.widget(field, **render_kw)
# -- CSRF
csrf = False
csrf_field_name = "csrf_token"
csrf_secret = None
csrf_context = None
csrf_class = None
def build_csrf(self, form):
"""
Build a CSRF implementation. This is called once per form instance.
The default implementation builds the class referenced to by
:attr:`csrf_class` with zero arguments. If `csrf_class` is ``None``,
will instead use the default implementation
:class:`wtforms.csrf.session.SessionCSRF`.
:param form: The form.
:return: A CSRF implementation.
"""
if self.csrf_class is not None:
return self.csrf_class()
from wtforms.csrf.session import SessionCSRF
return SessionCSRF()
# -- i18n
locales = False
cache_translations = True
translations_cache = {}
def get_translations(self, form):
"""
Override in subclasses to provide alternate translations factory.
See the i18n documentation for more.
:param form: The form.
:return: An object that provides gettext() and ngettext() methods.
"""
locales = self.locales
if locales is False:
return None
if self.cache_translations:
# Make locales be a hashable value
locales = tuple(locales) if locales else None
translations = self.translations_cache.get(locales)
if translations is None:
translations = self.translations_cache[locales] = i18n.get_translations(
locales
)
return translations
return i18n.get_translations(locales)
# -- General
def update_values(self, values):
"""
Given a dictionary of values, update values on this `Meta` instance.
"""
for key, value in values.items():
setattr(self, key, value)

View File

@@ -0,0 +1,91 @@
import os
import re
_LEADING_SYMBOL = "#" if os.name == "nt" else "-"
# https://docs.python.org/3/library/datetime.html#technical-detail (see NOTE #9)
_DATETIME_STRIP_ZERO_PADDING_FORMATS_RE = re.compile(
f"%{_LEADING_SYMBOL}["
"d" # day of month
"m" # month
"H" # hour (24-hour)
"I" # hour (12-hour)
"M" # minutes
"S" # seconds
"U" # week of year (Sunday first day of week)
"W" # week of year (Monday first day of week)
"V" # week of year (ISO 8601)
"]",
re.MULTILINE,
)
def clean_datetime_format_for_strptime(formats):
"""
Remove dashes used to disable zero-padding with strftime formats (for
compatibility with strptime).
"""
return [
re.sub(
_DATETIME_STRIP_ZERO_PADDING_FORMATS_RE,
lambda m: m[0].replace(_LEADING_SYMBOL, ""),
format,
)
for format in formats
]
class UnsetValue:
"""
An unset value.
This is used in situations where a blank value like `None` is acceptable
usually as the default value of a class variable or function parameter
(iow, usually when `None` is a valid value.)
"""
def __str__(self):
return "<unset value>"
def __repr__(self):
return "<unset value>"
def __bool__(self):
return False
def __nonzero__(self):
return False
unset_value = UnsetValue()
class WebobInputWrapper:
"""
Wrap a webob MultiDict for use as passing as `formdata` to Field.
Since for consistency, we have decided in WTForms to support as input a
small subset of the API provided in common between cgi.FieldStorage,
Django's QueryDict, and Werkzeug's MultiDict, we need to wrap Webob, the
only supported framework whose multidict does not fit this API, but is
nevertheless used by a lot of frameworks.
While we could write a full wrapper to support all the methods, this will
undoubtedly result in bugs due to some subtle differences between the
various wrappers. So we will keep it simple.
"""
def __init__(self, multidict):
self._wrapped = multidict
def __iter__(self):
return iter(self._wrapped)
def __len__(self):
return len(self._wrapped)
def __contains__(self, name):
return name in self._wrapped
def getlist(self, name):
return self._wrapped.getall(name)

View File

@@ -0,0 +1,734 @@
import ipaddress
import math
import re
import uuid
__all__ = (
"DataRequired",
"data_required",
"Email",
"email",
"EqualTo",
"equal_to",
"IPAddress",
"ip_address",
"InputRequired",
"input_required",
"Length",
"length",
"NumberRange",
"number_range",
"Optional",
"optional",
"Regexp",
"regexp",
"URL",
"url",
"AnyOf",
"any_of",
"NoneOf",
"none_of",
"MacAddress",
"mac_address",
"UUID",
"ValidationError",
"StopValidation",
"readonly",
"ReadOnly",
"disabled",
"Disabled",
)
class ValidationError(ValueError):
"""
Raised when a validator fails to validate its input.
"""
def __init__(self, message="", *args, **kwargs):
ValueError.__init__(self, message, *args, **kwargs)
class StopValidation(Exception):
"""
Causes the validation chain to stop.
If StopValidation is raised, no more validators in the validation chain are
called. If raised with a message, the message will be added to the errors
list.
"""
def __init__(self, message="", *args, **kwargs):
Exception.__init__(self, message, *args, **kwargs)
class EqualTo:
"""
Compares the values of two fields.
:param fieldname:
The name of the other field to compare to.
:param message:
Error message to raise in case of a validation error. Can be
interpolated with `%(other_label)s` and `%(other_name)s` to provide a
more helpful error.
"""
def __init__(self, fieldname, message=None):
self.fieldname = fieldname
self.message = message
def __call__(self, form, field):
try:
other = form[self.fieldname]
except KeyError as exc:
raise ValidationError(
field.gettext("Invalid field name '%s'.") % self.fieldname
) from exc
if field.data == other.data:
return
d = {
"other_label": hasattr(other, "label")
and other.label.text
or self.fieldname,
"other_name": self.fieldname,
}
message = self.message
if message is None:
message = field.gettext("Field must be equal to %(other_name)s.")
raise ValidationError(message % d)
class Length:
"""
Validates the length of a string.
:param min:
The minimum required length of the string. If not provided, minimum
length will not be checked.
:param max:
The maximum length of the string. If not provided, maximum length
will not be checked.
:param message:
Error message to raise in case of a validation error. Can be
interpolated using `%(min)d` and `%(max)d` if desired. Useful defaults
are provided depending on the existence of min and max.
When supported, sets the `minlength` and `maxlength` attributes on widgets.
"""
def __init__(self, min=-1, max=-1, message=None):
assert (
min != -1 or max != -1
), "At least one of `min` or `max` must be specified."
assert max == -1 or min <= max, "`min` cannot be more than `max`."
self.min = min
self.max = max
self.message = message
self.field_flags = {}
if self.min != -1:
self.field_flags["minlength"] = self.min
if self.max != -1:
self.field_flags["maxlength"] = self.max
def __call__(self, form, field):
length = field.data and len(field.data) or 0
if length >= self.min and (self.max == -1 or length <= self.max):
return
if self.message is not None:
message = self.message
elif self.max == -1:
message = field.ngettext(
"Field must be at least %(min)d character long.",
"Field must be at least %(min)d characters long.",
self.min,
)
elif self.min == -1:
message = field.ngettext(
"Field cannot be longer than %(max)d character.",
"Field cannot be longer than %(max)d characters.",
self.max,
)
elif self.min == self.max:
message = field.ngettext(
"Field must be exactly %(max)d character long.",
"Field must be exactly %(max)d characters long.",
self.max,
)
else:
message = field.gettext(
"Field must be between %(min)d and %(max)d characters long."
)
raise ValidationError(message % dict(min=self.min, max=self.max, length=length))
class NumberRange:
"""
Validates that a number is of a minimum and/or maximum value, inclusive.
This will work with any comparable number type, such as floats and
decimals, not just integers.
:param min:
The minimum required value of the number. If not provided, minimum
value will not be checked.
:param max:
The maximum value of the number. If not provided, maximum value
will not be checked.
:param message:
Error message to raise in case of a validation error. Can be
interpolated using `%(min)s` and `%(max)s` if desired. Useful defaults
are provided depending on the existence of min and max.
When supported, sets the `min` and `max` attributes on widgets.
"""
def __init__(self, min=None, max=None, message=None):
self.min = min
self.max = max
self.message = message
self.field_flags = {}
if self.min is not None:
self.field_flags["min"] = self.min
if self.max is not None:
self.field_flags["max"] = self.max
def __call__(self, form, field):
data = field.data
if (
data is not None
and not math.isnan(data)
and (self.min is None or data >= self.min)
and (self.max is None or data <= self.max)
):
return
if self.message is not None:
message = self.message
# we use %(min)s interpolation to support floats, None, and
# Decimals without throwing a formatting exception.
elif self.max is None:
message = field.gettext("Number must be at least %(min)s.")
elif self.min is None:
message = field.gettext("Number must be at most %(max)s.")
else:
message = field.gettext("Number must be between %(min)s and %(max)s.")
raise ValidationError(message % dict(min=self.min, max=self.max))
class Optional:
"""
Allows empty input and stops the validation chain from continuing.
If input is empty, also removes prior errors (such as processing errors)
from the field.
:param strip_whitespace:
If True (the default) also stop the validation chain on input which
consists of only whitespace.
Sets the `optional` attribute on widgets.
"""
def __init__(self, strip_whitespace=True):
if strip_whitespace:
self.string_check = lambda s: s.strip()
else:
self.string_check = lambda s: s
self.field_flags = {"optional": True}
def __call__(self, form, field):
if (
not field.raw_data
or isinstance(field.raw_data[0], str)
and not self.string_check(field.raw_data[0])
):
field.errors[:] = []
raise StopValidation()
class DataRequired:
"""
Checks the field's data is 'truthy' otherwise stops the validation chain.
This validator checks that the ``data`` attribute on the field is a 'true'
value (effectively, it does ``if field.data``.) Furthermore, if the data
is a string type, a string containing only whitespace characters is
considered false.
If the data is empty, also removes prior errors (such as processing errors)
from the field.
**NOTE** this validator used to be called `Required` but the way it behaved
(requiring coerced data, not input data) meant it functioned in a way
which was not symmetric to the `Optional` validator and furthermore caused
confusion with certain fields which coerced data to 'falsey' values like
``0``, ``Decimal(0)``, ``time(0)`` etc. Unless a very specific reason
exists, we recommend using the :class:`InputRequired` instead.
:param message:
Error message to raise in case of a validation error.
Sets the `required` attribute on widgets.
"""
def __init__(self, message=None):
self.message = message
self.field_flags = {"required": True}
def __call__(self, form, field):
if field.data and (not isinstance(field.data, str) or field.data.strip()):
return
if self.message is None:
message = field.gettext("This field is required.")
else:
message = self.message
field.errors[:] = []
raise StopValidation(message)
class InputRequired:
"""
Validates that input was provided for this field.
Note there is a distinction between this and DataRequired in that
InputRequired looks that form-input data was provided, and DataRequired
looks at the post-coercion data. This means that this validator only checks
whether non-empty data was sent, not whether non-empty data was coerced
from that data. Initially populated data is not considered sent.
Sets the `required` attribute on widgets.
"""
def __init__(self, message=None):
self.message = message
self.field_flags = {"required": True}
def __call__(self, form, field):
if field.raw_data and field.raw_data[0]:
return
if self.message is None:
message = field.gettext("This field is required.")
else:
message = self.message
field.errors[:] = []
raise StopValidation(message)
class Regexp:
"""
Validates the field against a user provided regexp.
:param regex:
The regular expression string to use. Can also be a compiled regular
expression pattern.
:param flags:
The regexp flags to use, for example re.IGNORECASE. Ignored if
`regex` is not a string.
:param message:
Error message to raise in case of a validation error.
"""
def __init__(self, regex, flags=0, message=None):
if isinstance(regex, str):
regex = re.compile(regex, flags)
self.regex = regex
self.message = message
def __call__(self, form, field, message=None):
match = self.regex.match(field.data or "")
if match:
return match
if message is None:
if self.message is None:
message = field.gettext("Invalid input.")
else:
message = self.message
raise ValidationError(message)
class Email:
"""
Validates an email address. Requires email_validator package to be
installed. For ex: pip install wtforms[email].
:param message:
Error message to raise in case of a validation error.
:param granular_message:
Use validation failed message from email_validator library
(Default False).
:param check_deliverability:
Perform domain name resolution check (Default False).
:param allow_smtputf8:
Fail validation for addresses that would require SMTPUTF8
(Default True).
:param allow_empty_local:
Allow an empty local part (i.e. @example.com), e.g. for validating
Postfix aliases (Default False).
"""
def __init__(
self,
message=None,
granular_message=False,
check_deliverability=False,
allow_smtputf8=True,
allow_empty_local=False,
):
self.message = message
self.granular_message = granular_message
self.check_deliverability = check_deliverability
self.allow_smtputf8 = allow_smtputf8
self.allow_empty_local = allow_empty_local
def __call__(self, form, field):
try:
import email_validator
except ImportError as exc: # pragma: no cover
raise Exception(
"Install 'email_validator' for email validation support."
) from exc
try:
if field.data is None:
raise email_validator.EmailNotValidError()
email_validator.validate_email(
field.data,
check_deliverability=self.check_deliverability,
allow_smtputf8=self.allow_smtputf8,
allow_empty_local=self.allow_empty_local,
)
except email_validator.EmailNotValidError as e:
message = self.message
if message is None:
if self.granular_message:
message = field.gettext(e)
else:
message = field.gettext("Invalid email address.")
raise ValidationError(message) from e
class IPAddress:
"""
Validates an IP address.
:param ipv4:
If True, accept IPv4 addresses as valid (default True)
:param ipv6:
If True, accept IPv6 addresses as valid (default False)
:param message:
Error message to raise in case of a validation error.
"""
def __init__(self, ipv4=True, ipv6=False, message=None):
if not ipv4 and not ipv6:
raise ValueError(
"IP Address Validator must have at least one of ipv4 or ipv6 enabled."
)
self.ipv4 = ipv4
self.ipv6 = ipv6
self.message = message
def __call__(self, form, field):
value = field.data
valid = False
if value:
valid = (self.ipv4 and self.check_ipv4(value)) or (
self.ipv6 and self.check_ipv6(value)
)
if valid:
return
message = self.message
if message is None:
message = field.gettext("Invalid IP address.")
raise ValidationError(message)
@classmethod
def check_ipv4(cls, value):
try:
address = ipaddress.ip_address(value)
except ValueError:
return False
if not isinstance(address, ipaddress.IPv4Address):
return False
return True
@classmethod
def check_ipv6(cls, value):
try:
address = ipaddress.ip_address(value)
except ValueError:
return False
if not isinstance(address, ipaddress.IPv6Address):
return False
return True
class MacAddress(Regexp):
"""
Validates a MAC address.
:param message:
Error message to raise in case of a validation error.
"""
def __init__(self, message=None):
pattern = r"^(?:[0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}$"
super().__init__(pattern, message=message)
def __call__(self, form, field):
message = self.message
if message is None:
message = field.gettext("Invalid Mac address.")
super().__call__(form, field, message)
class URL(Regexp):
"""
Simple regexp based url validation. Much like the email validator, you
probably want to validate the url later by other means if the url must
resolve.
:param require_tld:
If true, then the domain-name portion of the URL must contain a .tld
suffix. Set this to false if you want to allow domains like
`localhost`.
:param allow_ip:
If false, then give ip as host will fail validation
:param message:
Error message to raise in case of a validation error.
"""
def __init__(self, require_tld=True, allow_ip=True, message=None):
regex = (
r"^[a-z]+://"
r"(?P<host>[^\/\?:]+)"
r"(?P<port>:[0-9]+)?"
r"(?P<path>\/.*?)?"
r"(?P<query>\?.*)?$"
)
super().__init__(regex, re.IGNORECASE, message)
self.validate_hostname = HostnameValidation(
require_tld=require_tld, allow_ip=allow_ip
)
def __call__(self, form, field):
message = self.message
if message is None:
message = field.gettext("Invalid URL.")
match = super().__call__(form, field, message)
if not self.validate_hostname(match.group("host")):
raise ValidationError(message)
class UUID:
"""
Validates a UUID.
:param message:
Error message to raise in case of a validation error.
"""
def __init__(self, message=None):
self.message = message
def __call__(self, form, field):
message = self.message
if message is None:
message = field.gettext("Invalid UUID.")
try:
uuid.UUID(field.data)
except ValueError as exc:
raise ValidationError(message) from exc
class AnyOf:
"""
Compares the incoming data to a sequence of valid inputs.
:param values:
A sequence of valid inputs.
:param message:
Error message to raise in case of a validation error. `%(values)s`
contains the list of values.
:param values_formatter:
Function used to format the list of values in the error message.
"""
def __init__(self, values, message=None, values_formatter=None):
self.values = values
self.message = message
if values_formatter is None:
values_formatter = self.default_values_formatter
self.values_formatter = values_formatter
def __call__(self, form, field):
data = field.data if isinstance(field.data, list) else [field.data]
if any(d in self.values for d in data):
return
message = self.message
if message is None:
message = field.gettext("Invalid value, must be one of: %(values)s.")
raise ValidationError(message % dict(values=self.values_formatter(self.values)))
@staticmethod
def default_values_formatter(values):
return ", ".join(str(x) for x in values)
class NoneOf:
"""
Compares the incoming data to a sequence of invalid inputs.
:param values:
A sequence of invalid inputs.
:param message:
Error message to raise in case of a validation error. `%(values)s`
contains the list of values.
:param values_formatter:
Function used to format the list of values in the error message.
"""
def __init__(self, values, message=None, values_formatter=None):
self.values = values
self.message = message
if values_formatter is None:
values_formatter = self.default_values_formatter
self.values_formatter = values_formatter
def __call__(self, form, field):
data = field.data if isinstance(field.data, list) else [field.data]
if not any(d in self.values for d in data):
return
message = self.message
if message is None:
message = field.gettext("Invalid value, can't be any of: %(values)s.")
raise ValidationError(message % dict(values=self.values_formatter(self.values)))
@staticmethod
def default_values_formatter(v):
return ", ".join(str(x) for x in v)
class HostnameValidation:
"""
Helper class for checking hostnames for validation.
This is not a validator in and of itself, and as such is not exported.
"""
hostname_part = re.compile(r"^(xn-|[a-z0-9_]+)(-[a-z0-9_-]+)*$", re.IGNORECASE)
tld_part = re.compile(r"^([a-z]{2,20}|xn--([a-z0-9]+-)*[a-z0-9]+)$", re.IGNORECASE)
def __init__(self, require_tld=True, allow_ip=False):
self.require_tld = require_tld
self.allow_ip = allow_ip
def __call__(self, hostname):
if self.allow_ip and (
IPAddress.check_ipv4(hostname) or IPAddress.check_ipv6(hostname)
):
return True
# Encode out IDNA hostnames. This makes further validation easier.
try:
hostname = hostname.encode("idna")
except UnicodeError:
pass
# Turn back into a string in Python 3x
if not isinstance(hostname, str):
hostname = hostname.decode("ascii")
if len(hostname) > 253:
return False
# Check that all labels in the hostname are valid
parts = hostname.split(".")
for part in parts:
if not part or len(part) > 63:
return False
if not self.hostname_part.match(part):
return False
if self.require_tld and (len(parts) < 2 or not self.tld_part.match(parts[-1])):
return False
return True
class ReadOnly:
"""
Set a field readonly.
Validation fails if the form data is different than the
field object data, or if unset, from the field default data.
"""
def __init__(self):
self.field_flags = {"readonly": True}
def __call__(self, form, field):
if field.data != field.object_data:
raise ValidationError(field.gettext("This field cannot be edited."))
class Disabled:
"""
Set a field disabled.
Validation fails if the form data has any value.
"""
def __init__(self):
self.field_flags = {"disabled": True}
def __call__(self, form, field):
if field.raw_data is not None:
raise ValidationError(
field.gettext("This field is disabled and cannot have a value.")
)
email = Email
equal_to = EqualTo
ip_address = IPAddress
mac_address = MacAddress
length = Length
number_range = NumberRange
optional = Optional
input_required = InputRequired
data_required = DataRequired
regexp = Regexp
url = URL
any_of = AnyOf
none_of = NoneOf
readonly = ReadOnly
disabled = Disabled

Some files were not shown because too many files have changed in this diff Show More