docker setup

This commit is contained in:
AdrienLSH
2023-11-23 16:43:30 +01:00
parent fd19180e1d
commit f29003c66a
5410 changed files with 869440 additions and 0 deletions

View File

@ -0,0 +1,2 @@
from .general import * # NOQA
from .statistics import * # NOQA

View File

@ -0,0 +1,155 @@
import json
import warnings
from django.contrib.postgres.fields import ArrayField
from django.db.models import Aggregate, BooleanField, JSONField, TextField, Value
from django.utils.deprecation import RemovedInDjango50Warning, RemovedInDjango51Warning
from .mixins import OrderableAggMixin
__all__ = [
"ArrayAgg",
"BitAnd",
"BitOr",
"BitXor",
"BoolAnd",
"BoolOr",
"JSONBAgg",
"StringAgg",
]
# RemovedInDjango50Warning
NOT_PROVIDED = object()
class DeprecatedConvertValueMixin:
def __init__(self, *expressions, default=NOT_PROVIDED, **extra):
if default is NOT_PROVIDED:
default = None
self._default_provided = False
else:
self._default_provided = True
super().__init__(*expressions, default=default, **extra)
def resolve_expression(self, *args, **kwargs):
resolved = super().resolve_expression(*args, **kwargs)
if not self._default_provided:
resolved.empty_result_set_value = getattr(
self, "deprecation_empty_result_set_value", self.deprecation_value
)
return resolved
def convert_value(self, value, expression, connection):
if value is None and not self._default_provided:
warnings.warn(self.deprecation_msg, category=RemovedInDjango50Warning)
return self.deprecation_value
return value
class ArrayAgg(DeprecatedConvertValueMixin, OrderableAggMixin, Aggregate):
function = "ARRAY_AGG"
template = "%(function)s(%(distinct)s%(expressions)s %(ordering)s)"
allow_distinct = True
# RemovedInDjango50Warning
deprecation_value = property(lambda self: [])
deprecation_msg = (
"In Django 5.0, ArrayAgg() will return None instead of an empty list "
"if there are no rows. Pass default=None to opt into the new behavior "
"and silence this warning or default=[] to keep the previous behavior."
)
@property
def output_field(self):
return ArrayField(self.source_expressions[0].output_field)
class BitAnd(Aggregate):
function = "BIT_AND"
class BitOr(Aggregate):
function = "BIT_OR"
class BitXor(Aggregate):
function = "BIT_XOR"
class BoolAnd(Aggregate):
function = "BOOL_AND"
output_field = BooleanField()
class BoolOr(Aggregate):
function = "BOOL_OR"
output_field = BooleanField()
class JSONBAgg(DeprecatedConvertValueMixin, OrderableAggMixin, Aggregate):
function = "JSONB_AGG"
template = "%(function)s(%(distinct)s%(expressions)s %(ordering)s)"
allow_distinct = True
output_field = JSONField()
# RemovedInDjango50Warning
deprecation_value = "[]"
deprecation_empty_result_set_value = property(lambda self: [])
deprecation_msg = (
"In Django 5.0, JSONBAgg() will return None instead of an empty list "
"if there are no rows. Pass default=None to opt into the new behavior "
"and silence this warning or default=[] to keep the previous "
"behavior."
)
# RemovedInDjango51Warning: When the deprecation ends, remove __init__().
#
# RemovedInDjango50Warning: When the deprecation ends, replace with:
# def __init__(self, *expressions, default=None, **extra):
def __init__(self, *expressions, default=NOT_PROVIDED, **extra):
super().__init__(*expressions, default=default, **extra)
if (
isinstance(default, Value)
and isinstance(default.value, str)
and not isinstance(default.output_field, JSONField)
):
value = default.value
try:
decoded = json.loads(value)
except json.JSONDecodeError:
warnings.warn(
"Passing a Value() with an output_field that isn't a JSONField as "
"JSONBAgg(default) is deprecated. Pass default="
f"Value({value!r}, output_field=JSONField()) instead.",
stacklevel=2,
category=RemovedInDjango51Warning,
)
self.default.output_field = self.output_field
else:
self.default = Value(decoded, self.output_field)
warnings.warn(
"Passing an encoded JSON string as JSONBAgg(default) is "
f"deprecated. Pass default={decoded!r} instead.",
stacklevel=2,
category=RemovedInDjango51Warning,
)
class StringAgg(DeprecatedConvertValueMixin, OrderableAggMixin, Aggregate):
function = "STRING_AGG"
template = "%(function)s(%(distinct)s%(expressions)s %(ordering)s)"
allow_distinct = True
output_field = TextField()
# RemovedInDjango50Warning
deprecation_value = ""
deprecation_msg = (
"In Django 5.0, StringAgg() will return None instead of an empty "
"string if there are no rows. Pass default=None to opt into the new "
'behavior and silence this warning or default="" to keep the previous behavior.'
)
def __init__(self, expression, delimiter, **extra):
delimiter_expr = Value(str(delimiter))
super().__init__(expression, delimiter_expr, **extra)

View File

@ -0,0 +1,29 @@
from django.db.models.expressions import OrderByList
class OrderableAggMixin:
def __init__(self, *expressions, ordering=(), **extra):
if isinstance(ordering, (list, tuple)):
self.order_by = OrderByList(*ordering)
else:
self.order_by = OrderByList(ordering)
super().__init__(*expressions, **extra)
def resolve_expression(self, *args, **kwargs):
self.order_by = self.order_by.resolve_expression(*args, **kwargs)
return super().resolve_expression(*args, **kwargs)
def get_source_expressions(self):
if self.order_by.source_expressions:
return super().get_source_expressions() + [self.order_by]
return super().get_source_expressions()
def set_source_expressions(self, exprs):
if isinstance(exprs[-1], OrderByList):
*exprs, self.order_by = exprs
return super().set_source_expressions(exprs)
def as_sql(self, compiler, connection):
order_by_sql, order_by_params = compiler.compile(self.order_by)
sql, sql_params = super().as_sql(compiler, connection, ordering=order_by_sql)
return sql, (*sql_params, *order_by_params)

View File

@ -0,0 +1,75 @@
from django.db.models import Aggregate, FloatField, IntegerField
__all__ = [
"CovarPop",
"Corr",
"RegrAvgX",
"RegrAvgY",
"RegrCount",
"RegrIntercept",
"RegrR2",
"RegrSlope",
"RegrSXX",
"RegrSXY",
"RegrSYY",
"StatAggregate",
]
class StatAggregate(Aggregate):
output_field = FloatField()
def __init__(self, y, x, output_field=None, filter=None, default=None):
if not x or not y:
raise ValueError("Both y and x must be provided.")
super().__init__(
y, x, output_field=output_field, filter=filter, default=default
)
class Corr(StatAggregate):
function = "CORR"
class CovarPop(StatAggregate):
def __init__(self, y, x, sample=False, filter=None, default=None):
self.function = "COVAR_SAMP" if sample else "COVAR_POP"
super().__init__(y, x, filter=filter, default=default)
class RegrAvgX(StatAggregate):
function = "REGR_AVGX"
class RegrAvgY(StatAggregate):
function = "REGR_AVGY"
class RegrCount(StatAggregate):
function = "REGR_COUNT"
output_field = IntegerField()
empty_result_set_value = 0
class RegrIntercept(StatAggregate):
function = "REGR_INTERCEPT"
class RegrR2(StatAggregate):
function = "REGR_R2"
class RegrSlope(StatAggregate):
function = "REGR_SLOPE"
class RegrSXX(StatAggregate):
function = "REGR_SXX"
class RegrSXY(StatAggregate):
function = "REGR_SXY"
class RegrSYY(StatAggregate):
function = "REGR_SYY"

View File

@ -0,0 +1,84 @@
from django.apps import AppConfig
from django.core.signals import setting_changed
from django.db import connections
from django.db.backends.postgresql.psycopg_any import RANGE_TYPES
from django.db.backends.signals import connection_created
from django.db.migrations.writer import MigrationWriter
from django.db.models import CharField, OrderBy, TextField
from django.db.models.functions import Collate
from django.db.models.indexes import IndexExpression
from django.utils.translation import gettext_lazy as _
from .indexes import OpClass
from .lookups import (
SearchLookup,
TrigramSimilar,
TrigramStrictWordSimilar,
TrigramWordSimilar,
Unaccent,
)
from .serializers import RangeSerializer
from .signals import register_type_handlers
def uninstall_if_needed(setting, value, enter, **kwargs):
"""
Undo the effects of PostgresConfig.ready() when django.contrib.postgres
is "uninstalled" by override_settings().
"""
if (
not enter
and setting == "INSTALLED_APPS"
and "django.contrib.postgres" not in set(value)
):
connection_created.disconnect(register_type_handlers)
CharField._unregister_lookup(Unaccent)
TextField._unregister_lookup(Unaccent)
CharField._unregister_lookup(SearchLookup)
TextField._unregister_lookup(SearchLookup)
CharField._unregister_lookup(TrigramSimilar)
TextField._unregister_lookup(TrigramSimilar)
CharField._unregister_lookup(TrigramWordSimilar)
TextField._unregister_lookup(TrigramWordSimilar)
CharField._unregister_lookup(TrigramStrictWordSimilar)
TextField._unregister_lookup(TrigramStrictWordSimilar)
# Disconnect this receiver until the next time this app is installed
# and ready() connects it again to prevent unnecessary processing on
# each setting change.
setting_changed.disconnect(uninstall_if_needed)
MigrationWriter.unregister_serializer(RANGE_TYPES)
class PostgresConfig(AppConfig):
name = "django.contrib.postgres"
verbose_name = _("PostgreSQL extensions")
def ready(self):
setting_changed.connect(uninstall_if_needed)
# Connections may already exist before we are called.
for conn in connections.all(initialized_only=True):
if conn.vendor == "postgresql":
conn.introspection.data_types_reverse.update(
{
3904: "django.contrib.postgres.fields.IntegerRangeField",
3906: "django.contrib.postgres.fields.DecimalRangeField",
3910: "django.contrib.postgres.fields.DateTimeRangeField",
3912: "django.contrib.postgres.fields.DateRangeField",
3926: "django.contrib.postgres.fields.BigIntegerRangeField",
}
)
if conn.connection is not None:
register_type_handlers(conn)
connection_created.connect(register_type_handlers)
CharField.register_lookup(Unaccent)
TextField.register_lookup(Unaccent)
CharField.register_lookup(SearchLookup)
TextField.register_lookup(SearchLookup)
CharField.register_lookup(TrigramSimilar)
TextField.register_lookup(TrigramSimilar)
CharField.register_lookup(TrigramWordSimilar)
TextField.register_lookup(TrigramWordSimilar)
CharField.register_lookup(TrigramStrictWordSimilar)
TextField.register_lookup(TrigramStrictWordSimilar)
MigrationWriter.register_serializer(RANGE_TYPES, RangeSerializer)
IndexExpression.register_wrappers(OrderBy, OpClass, Collate)

View File

@ -0,0 +1,233 @@
import warnings
from django.contrib.postgres.indexes import OpClass
from django.core.exceptions import ValidationError
from django.db import DEFAULT_DB_ALIAS, NotSupportedError
from django.db.backends.ddl_references import Expressions, Statement, Table
from django.db.models import BaseConstraint, Deferrable, F, Q
from django.db.models.expressions import Exists, ExpressionList
from django.db.models.indexes import IndexExpression
from django.db.models.lookups import PostgresOperatorLookup
from django.db.models.sql import Query
from django.utils.deprecation import RemovedInDjango50Warning
__all__ = ["ExclusionConstraint"]
class ExclusionConstraintExpression(IndexExpression):
template = "%(expressions)s WITH %(operator)s"
class ExclusionConstraint(BaseConstraint):
template = (
"CONSTRAINT %(name)s EXCLUDE USING %(index_type)s "
"(%(expressions)s)%(include)s%(where)s%(deferrable)s"
)
def __init__(
self,
*,
name,
expressions,
index_type=None,
condition=None,
deferrable=None,
include=None,
opclasses=(),
violation_error_message=None,
):
if index_type and index_type.lower() not in {"gist", "spgist"}:
raise ValueError(
"Exclusion constraints only support GiST or SP-GiST indexes."
)
if not expressions:
raise ValueError(
"At least one expression is required to define an exclusion "
"constraint."
)
if not all(
isinstance(expr, (list, tuple)) and len(expr) == 2 for expr in expressions
):
raise ValueError("The expressions must be a list of 2-tuples.")
if not isinstance(condition, (type(None), Q)):
raise ValueError("ExclusionConstraint.condition must be a Q instance.")
if not isinstance(deferrable, (type(None), Deferrable)):
raise ValueError(
"ExclusionConstraint.deferrable must be a Deferrable instance."
)
if not isinstance(include, (type(None), list, tuple)):
raise ValueError("ExclusionConstraint.include must be a list or tuple.")
if not isinstance(opclasses, (list, tuple)):
raise ValueError("ExclusionConstraint.opclasses must be a list or tuple.")
if opclasses and len(expressions) != len(opclasses):
raise ValueError(
"ExclusionConstraint.expressions and "
"ExclusionConstraint.opclasses must have the same number of "
"elements."
)
self.expressions = expressions
self.index_type = index_type or "GIST"
self.condition = condition
self.deferrable = deferrable
self.include = tuple(include) if include else ()
self.opclasses = opclasses
if self.opclasses:
warnings.warn(
"The opclasses argument is deprecated in favor of using "
"django.contrib.postgres.indexes.OpClass in "
"ExclusionConstraint.expressions.",
category=RemovedInDjango50Warning,
stacklevel=2,
)
super().__init__(name=name, violation_error_message=violation_error_message)
def _get_expressions(self, schema_editor, query):
expressions = []
for idx, (expression, operator) in enumerate(self.expressions):
if isinstance(expression, str):
expression = F(expression)
try:
expression = OpClass(expression, self.opclasses[idx])
except IndexError:
pass
expression = ExclusionConstraintExpression(expression, operator=operator)
expression.set_wrapper_classes(schema_editor.connection)
expressions.append(expression)
return ExpressionList(*expressions).resolve_expression(query)
def _get_condition_sql(self, compiler, schema_editor, query):
if self.condition is None:
return None
where = query.build_where(self.condition)
sql, params = where.as_sql(compiler, schema_editor.connection)
return sql % tuple(schema_editor.quote_value(p) for p in params)
def constraint_sql(self, model, schema_editor):
query = Query(model, alias_cols=False)
compiler = query.get_compiler(connection=schema_editor.connection)
expressions = self._get_expressions(schema_editor, query)
table = model._meta.db_table
condition = self._get_condition_sql(compiler, schema_editor, query)
include = [
model._meta.get_field(field_name).column for field_name in self.include
]
return Statement(
self.template,
table=Table(table, schema_editor.quote_name),
name=schema_editor.quote_name(self.name),
index_type=self.index_type,
expressions=Expressions(
table, expressions, compiler, schema_editor.quote_value
),
where=" WHERE (%s)" % condition if condition else "",
include=schema_editor._index_include_sql(model, include),
deferrable=schema_editor._deferrable_constraint_sql(self.deferrable),
)
def create_sql(self, model, schema_editor):
self.check_supported(schema_editor)
return Statement(
"ALTER TABLE %(table)s ADD %(constraint)s",
table=Table(model._meta.db_table, schema_editor.quote_name),
constraint=self.constraint_sql(model, schema_editor),
)
def remove_sql(self, model, schema_editor):
return schema_editor._delete_constraint_sql(
schema_editor.sql_delete_check,
model,
schema_editor.quote_name(self.name),
)
def check_supported(self, schema_editor):
if (
self.include
and self.index_type.lower() == "spgist"
and not schema_editor.connection.features.supports_covering_spgist_indexes
):
raise NotSupportedError(
"Covering exclusion constraints using an SP-GiST index "
"require PostgreSQL 14+."
)
def deconstruct(self):
path, args, kwargs = super().deconstruct()
kwargs["expressions"] = self.expressions
if self.condition is not None:
kwargs["condition"] = self.condition
if self.index_type.lower() != "gist":
kwargs["index_type"] = self.index_type
if self.deferrable:
kwargs["deferrable"] = self.deferrable
if self.include:
kwargs["include"] = self.include
if self.opclasses:
kwargs["opclasses"] = self.opclasses
return path, args, kwargs
def __eq__(self, other):
if isinstance(other, self.__class__):
return (
self.name == other.name
and self.index_type == other.index_type
and self.expressions == other.expressions
and self.condition == other.condition
and self.deferrable == other.deferrable
and self.include == other.include
and self.opclasses == other.opclasses
and self.violation_error_message == other.violation_error_message
)
return super().__eq__(other)
def __repr__(self):
return "<%s: index_type=%s expressions=%s name=%s%s%s%s%s>" % (
self.__class__.__qualname__,
repr(self.index_type),
repr(self.expressions),
repr(self.name),
"" if self.condition is None else " condition=%s" % self.condition,
"" if self.deferrable is None else " deferrable=%r" % self.deferrable,
"" if not self.include else " include=%s" % repr(self.include),
"" if not self.opclasses else " opclasses=%s" % repr(self.opclasses),
)
def validate(self, model, instance, exclude=None, using=DEFAULT_DB_ALIAS):
queryset = model._default_manager.using(using)
replacement_map = instance._get_field_value_map(
meta=model._meta, exclude=exclude
)
replacements = {F(field): value for field, value in replacement_map.items()}
lookups = []
for idx, (expression, operator) in enumerate(self.expressions):
if isinstance(expression, str):
expression = F(expression)
if exclude:
if isinstance(expression, F):
if expression.name in exclude:
return
else:
for expr in expression.flatten():
if isinstance(expr, F) and expr.name in exclude:
return
rhs_expression = expression.replace_expressions(replacements)
# Remove OpClass because it only has sense during the constraint
# creation.
if isinstance(expression, OpClass):
expression = expression.get_source_expressions()[0]
if isinstance(rhs_expression, OpClass):
rhs_expression = rhs_expression.get_source_expressions()[0]
lookup = PostgresOperatorLookup(lhs=expression, rhs=rhs_expression)
lookup.postgres_operator = operator
lookups.append(lookup)
queryset = queryset.filter(*lookups)
model_class_pk = instance._get_pk_val(model._meta)
if not instance._state.adding and model_class_pk is not None:
queryset = queryset.exclude(pk=model_class_pk)
if not self.condition:
if queryset.exists():
raise ValidationError(self.get_violation_error_message())
else:
if (self.condition & Exists(queryset.filter(self.condition))).check(
replacement_map, using=using
):
raise ValidationError(self.get_violation_error_message())

View File

@ -0,0 +1,14 @@
from django.contrib.postgres.fields import ArrayField
from django.db.models import Subquery
from django.utils.functional import cached_property
class ArraySubquery(Subquery):
template = "ARRAY(%(subquery)s)"
def __init__(self, queryset, **kwargs):
super().__init__(queryset, **kwargs)
@cached_property
def output_field(self):
return ArrayField(self.query.output_field)

View File

@ -0,0 +1,5 @@
from .array import * # NOQA
from .citext import * # NOQA
from .hstore import * # NOQA
from .jsonb import * # NOQA
from .ranges import * # NOQA

View File

@ -0,0 +1,365 @@
import json
from django.contrib.postgres import lookups
from django.contrib.postgres.forms import SimpleArrayField
from django.contrib.postgres.validators import ArrayMaxLengthValidator
from django.core import checks, exceptions
from django.db.models import Field, Func, IntegerField, Transform, Value
from django.db.models.fields.mixins import CheckFieldDefaultMixin
from django.db.models.lookups import Exact, In
from django.utils.translation import gettext_lazy as _
from ..utils import prefix_validation_error
from .utils import AttributeSetter
__all__ = ["ArrayField"]
class ArrayField(CheckFieldDefaultMixin, Field):
empty_strings_allowed = False
default_error_messages = {
"item_invalid": _("Item %(nth)s in the array did not validate:"),
"nested_array_mismatch": _("Nested arrays must have the same length."),
}
_default_hint = ("list", "[]")
def __init__(self, base_field, size=None, **kwargs):
self.base_field = base_field
self.db_collation = getattr(self.base_field, "db_collation", None)
self.size = size
if self.size:
self.default_validators = [
*self.default_validators,
ArrayMaxLengthValidator(self.size),
]
# For performance, only add a from_db_value() method if the base field
# implements it.
if hasattr(self.base_field, "from_db_value"):
self.from_db_value = self._from_db_value
super().__init__(**kwargs)
@property
def model(self):
try:
return self.__dict__["model"]
except KeyError:
raise AttributeError(
"'%s' object has no attribute 'model'" % self.__class__.__name__
)
@model.setter
def model(self, model):
self.__dict__["model"] = model
self.base_field.model = model
@classmethod
def _choices_is_value(cls, value):
return isinstance(value, (list, tuple)) or super()._choices_is_value(value)
def check(self, **kwargs):
errors = super().check(**kwargs)
if self.base_field.remote_field:
errors.append(
checks.Error(
"Base field for array cannot be a related field.",
obj=self,
id="postgres.E002",
)
)
else:
# Remove the field name checks as they are not needed here.
base_checks = self.base_field.check()
if base_checks:
error_messages = "\n ".join(
"%s (%s)" % (base_check.msg, base_check.id)
for base_check in base_checks
if isinstance(base_check, checks.Error)
)
if error_messages:
errors.append(
checks.Error(
"Base field for array has errors:\n %s" % error_messages,
obj=self,
id="postgres.E001",
)
)
warning_messages = "\n ".join(
"%s (%s)" % (base_check.msg, base_check.id)
for base_check in base_checks
if isinstance(base_check, checks.Warning)
)
if warning_messages:
errors.append(
checks.Warning(
"Base field for array has warnings:\n %s"
% warning_messages,
obj=self,
id="postgres.W004",
)
)
return errors
def set_attributes_from_name(self, name):
super().set_attributes_from_name(name)
self.base_field.set_attributes_from_name(name)
@property
def description(self):
return "Array of %s" % self.base_field.description
def db_type(self, connection):
size = self.size or ""
return "%s[%s]" % (self.base_field.db_type(connection), size)
def cast_db_type(self, connection):
size = self.size or ""
return "%s[%s]" % (self.base_field.cast_db_type(connection), size)
def db_parameters(self, connection):
db_params = super().db_parameters(connection)
db_params["collation"] = self.db_collation
return db_params
def get_placeholder(self, value, compiler, connection):
return "%s::{}".format(self.db_type(connection))
def get_db_prep_value(self, value, connection, prepared=False):
if isinstance(value, (list, tuple)):
return [
self.base_field.get_db_prep_value(i, connection, prepared=False)
for i in value
]
return value
def deconstruct(self):
name, path, args, kwargs = super().deconstruct()
if path == "django.contrib.postgres.fields.array.ArrayField":
path = "django.contrib.postgres.fields.ArrayField"
kwargs.update(
{
"base_field": self.base_field.clone(),
"size": self.size,
}
)
return name, path, args, kwargs
def to_python(self, value):
if isinstance(value, str):
# Assume we're deserializing
vals = json.loads(value)
value = [self.base_field.to_python(val) for val in vals]
return value
def _from_db_value(self, value, expression, connection):
if value is None:
return value
return [
self.base_field.from_db_value(item, expression, connection)
for item in value
]
def value_to_string(self, obj):
values = []
vals = self.value_from_object(obj)
base_field = self.base_field
for val in vals:
if val is None:
values.append(None)
else:
obj = AttributeSetter(base_field.attname, val)
values.append(base_field.value_to_string(obj))
return json.dumps(values)
def get_transform(self, name):
transform = super().get_transform(name)
if transform:
return transform
if "_" not in name:
try:
index = int(name)
except ValueError:
pass
else:
index += 1 # postgres uses 1-indexing
return IndexTransformFactory(index, self.base_field)
try:
start, end = name.split("_")
start = int(start) + 1
end = int(end) # don't add one here because postgres slices are weird
except ValueError:
pass
else:
return SliceTransformFactory(start, end)
def validate(self, value, model_instance):
super().validate(value, model_instance)
for index, part in enumerate(value):
try:
self.base_field.validate(part, model_instance)
except exceptions.ValidationError as error:
raise prefix_validation_error(
error,
prefix=self.error_messages["item_invalid"],
code="item_invalid",
params={"nth": index + 1},
)
if isinstance(self.base_field, ArrayField):
if len({len(i) for i in value}) > 1:
raise exceptions.ValidationError(
self.error_messages["nested_array_mismatch"],
code="nested_array_mismatch",
)
def run_validators(self, value):
super().run_validators(value)
for index, part in enumerate(value):
try:
self.base_field.run_validators(part)
except exceptions.ValidationError as error:
raise prefix_validation_error(
error,
prefix=self.error_messages["item_invalid"],
code="item_invalid",
params={"nth": index + 1},
)
def formfield(self, **kwargs):
return super().formfield(
**{
"form_class": SimpleArrayField,
"base_field": self.base_field.formfield(),
"max_length": self.size,
**kwargs,
}
)
class ArrayRHSMixin:
def __init__(self, lhs, rhs):
# Don't wrap arrays that contains only None values, psycopg doesn't
# allow this.
if isinstance(rhs, (tuple, list)) and any(self._rhs_not_none_values(rhs)):
expressions = []
for value in rhs:
if not hasattr(value, "resolve_expression"):
field = lhs.output_field
value = Value(field.base_field.get_prep_value(value))
expressions.append(value)
rhs = Func(
*expressions,
function="ARRAY",
template="%(function)s[%(expressions)s]",
)
super().__init__(lhs, rhs)
def process_rhs(self, compiler, connection):
rhs, rhs_params = super().process_rhs(compiler, connection)
cast_type = self.lhs.output_field.cast_db_type(connection)
return "%s::%s" % (rhs, cast_type), rhs_params
def _rhs_not_none_values(self, rhs):
for x in rhs:
if isinstance(x, (list, tuple)):
yield from self._rhs_not_none_values(x)
elif x is not None:
yield True
@ArrayField.register_lookup
class ArrayContains(ArrayRHSMixin, lookups.DataContains):
pass
@ArrayField.register_lookup
class ArrayContainedBy(ArrayRHSMixin, lookups.ContainedBy):
pass
@ArrayField.register_lookup
class ArrayExact(ArrayRHSMixin, Exact):
pass
@ArrayField.register_lookup
class ArrayOverlap(ArrayRHSMixin, lookups.Overlap):
pass
@ArrayField.register_lookup
class ArrayLenTransform(Transform):
lookup_name = "len"
output_field = IntegerField()
def as_sql(self, compiler, connection):
lhs, params = compiler.compile(self.lhs)
# Distinguish NULL and empty arrays
return (
"CASE WHEN %(lhs)s IS NULL THEN NULL ELSE "
"coalesce(array_length(%(lhs)s, 1), 0) END"
) % {"lhs": lhs}, params * 2
@ArrayField.register_lookup
class ArrayInLookup(In):
def get_prep_lookup(self):
values = super().get_prep_lookup()
if hasattr(values, "resolve_expression"):
return values
# In.process_rhs() expects values to be hashable, so convert lists
# to tuples.
prepared_values = []
for value in values:
if hasattr(value, "resolve_expression"):
prepared_values.append(value)
else:
prepared_values.append(tuple(value))
return prepared_values
class IndexTransform(Transform):
def __init__(self, index, base_field, *args, **kwargs):
super().__init__(*args, **kwargs)
self.index = index
self.base_field = base_field
def as_sql(self, compiler, connection):
lhs, params = compiler.compile(self.lhs)
if not lhs.endswith("]"):
lhs = "(%s)" % lhs
return "%s[%%s]" % lhs, (*params, self.index)
@property
def output_field(self):
return self.base_field
class IndexTransformFactory:
def __init__(self, index, base_field):
self.index = index
self.base_field = base_field
def __call__(self, *args, **kwargs):
return IndexTransform(self.index, self.base_field, *args, **kwargs)
class SliceTransform(Transform):
def __init__(self, start, end, *args, **kwargs):
super().__init__(*args, **kwargs)
self.start = start
self.end = end
def as_sql(self, compiler, connection):
lhs, params = compiler.compile(self.lhs)
if not lhs.endswith("]"):
lhs = "(%s)" % lhs
return "%s[%%s:%%s]" % lhs, (*params, self.start, self.end)
class SliceTransformFactory:
def __init__(self, start, end):
self.start = start
self.end = end
def __call__(self, *args, **kwargs):
return SliceTransform(self.start, self.end, *args, **kwargs)

View File

@ -0,0 +1,78 @@
import warnings
from django.db.models import CharField, EmailField, TextField
from django.test.utils import ignore_warnings
from django.utils.deprecation import RemovedInDjango51Warning
__all__ = ["CICharField", "CIEmailField", "CIText", "CITextField"]
# RemovedInDjango51Warning.
class CIText:
def __init__(self, *args, **kwargs):
warnings.warn(
"django.contrib.postgres.fields.CIText mixin is deprecated.",
RemovedInDjango51Warning,
stacklevel=2,
)
super().__init__(*args, **kwargs)
def get_internal_type(self):
return "CI" + super().get_internal_type()
def db_type(self, connection):
return "citext"
class CICharField(CIText, CharField):
system_check_deprecated_details = {
"msg": (
"django.contrib.postgres.fields.CICharField is deprecated. Support for it "
"(except in historical migrations) will be removed in Django 5.1."
),
"hint": (
'Use CharField(db_collation="") with a case-insensitive non-deterministic '
"collation instead."
),
"id": "fields.W905",
}
def __init__(self, *args, **kwargs):
with ignore_warnings(category=RemovedInDjango51Warning):
super().__init__(*args, **kwargs)
class CIEmailField(CIText, EmailField):
system_check_deprecated_details = {
"msg": (
"django.contrib.postgres.fields.CIEmailField is deprecated. Support for it "
"(except in historical migrations) will be removed in Django 5.1."
),
"hint": (
'Use EmailField(db_collation="") with a case-insensitive '
"non-deterministic collation instead."
),
"id": "fields.W906",
}
def __init__(self, *args, **kwargs):
with ignore_warnings(category=RemovedInDjango51Warning):
super().__init__(*args, **kwargs)
class CITextField(CIText, TextField):
system_check_deprecated_details = {
"msg": (
"django.contrib.postgres.fields.CITextField is deprecated. Support for it "
"(except in historical migrations) will be removed in Django 5.1."
),
"hint": (
'Use TextField(db_collation="") with a case-insensitive non-deterministic '
"collation instead."
),
"id": "fields.W907",
}
def __init__(self, *args, **kwargs):
with ignore_warnings(category=RemovedInDjango51Warning):
super().__init__(*args, **kwargs)

View File

@ -0,0 +1,112 @@
import json
from django.contrib.postgres import forms, lookups
from django.contrib.postgres.fields.array import ArrayField
from django.core import exceptions
from django.db.models import Field, TextField, Transform
from django.db.models.fields.mixins import CheckFieldDefaultMixin
from django.utils.translation import gettext_lazy as _
__all__ = ["HStoreField"]
class HStoreField(CheckFieldDefaultMixin, Field):
empty_strings_allowed = False
description = _("Map of strings to strings/nulls")
default_error_messages = {
"not_a_string": _("The value of “%(key)s” is not a string or null."),
}
_default_hint = ("dict", "{}")
def db_type(self, connection):
return "hstore"
def get_transform(self, name):
transform = super().get_transform(name)
if transform:
return transform
return KeyTransformFactory(name)
def validate(self, value, model_instance):
super().validate(value, model_instance)
for key, val in value.items():
if not isinstance(val, str) and val is not None:
raise exceptions.ValidationError(
self.error_messages["not_a_string"],
code="not_a_string",
params={"key": key},
)
def to_python(self, value):
if isinstance(value, str):
value = json.loads(value)
return value
def value_to_string(self, obj):
return json.dumps(self.value_from_object(obj))
def formfield(self, **kwargs):
return super().formfield(
**{
"form_class": forms.HStoreField,
**kwargs,
}
)
def get_prep_value(self, value):
value = super().get_prep_value(value)
if isinstance(value, dict):
prep_value = {}
for key, val in value.items():
key = str(key)
if val is not None:
val = str(val)
prep_value[key] = val
value = prep_value
if isinstance(value, list):
value = [str(item) for item in value]
return value
HStoreField.register_lookup(lookups.DataContains)
HStoreField.register_lookup(lookups.ContainedBy)
HStoreField.register_lookup(lookups.HasKey)
HStoreField.register_lookup(lookups.HasKeys)
HStoreField.register_lookup(lookups.HasAnyKeys)
class KeyTransform(Transform):
output_field = TextField()
def __init__(self, key_name, *args, **kwargs):
super().__init__(*args, **kwargs)
self.key_name = key_name
def as_sql(self, compiler, connection):
lhs, params = compiler.compile(self.lhs)
return "(%s -> %%s)" % lhs, tuple(params) + (self.key_name,)
class KeyTransformFactory:
def __init__(self, key_name):
self.key_name = key_name
def __call__(self, *args, **kwargs):
return KeyTransform(self.key_name, *args, **kwargs)
@HStoreField.register_lookup
class KeysTransform(Transform):
lookup_name = "keys"
function = "akeys"
output_field = ArrayField(TextField())
@HStoreField.register_lookup
class ValuesTransform(Transform):
lookup_name = "values"
function = "avals"
output_field = ArrayField(TextField())

View File

@ -0,0 +1,14 @@
from django.db.models import JSONField as BuiltinJSONField
__all__ = ["JSONField"]
class JSONField(BuiltinJSONField):
system_check_removed_details = {
"msg": (
"django.contrib.postgres.fields.JSONField is removed except for "
"support in historical migrations."
),
"hint": "Use django.db.models.JSONField instead.",
"id": "fields.E904",
}

View File

@ -0,0 +1,383 @@
import datetime
import json
from django.contrib.postgres import forms, lookups
from django.db import models
from django.db.backends.postgresql.psycopg_any import (
DateRange,
DateTimeTZRange,
NumericRange,
Range,
)
from django.db.models.functions import Cast
from django.db.models.lookups import PostgresOperatorLookup
from .utils import AttributeSetter
__all__ = [
"RangeField",
"IntegerRangeField",
"BigIntegerRangeField",
"DecimalRangeField",
"DateTimeRangeField",
"DateRangeField",
"RangeBoundary",
"RangeOperators",
]
class RangeBoundary(models.Expression):
"""A class that represents range boundaries."""
def __init__(self, inclusive_lower=True, inclusive_upper=False):
self.lower = "[" if inclusive_lower else "("
self.upper = "]" if inclusive_upper else ")"
def as_sql(self, compiler, connection):
return "'%s%s'" % (self.lower, self.upper), []
class RangeOperators:
# https://www.postgresql.org/docs/current/functions-range.html#RANGE-OPERATORS-TABLE
EQUAL = "="
NOT_EQUAL = "<>"
CONTAINS = "@>"
CONTAINED_BY = "<@"
OVERLAPS = "&&"
FULLY_LT = "<<"
FULLY_GT = ">>"
NOT_LT = "&>"
NOT_GT = "&<"
ADJACENT_TO = "-|-"
class RangeField(models.Field):
empty_strings_allowed = False
def __init__(self, *args, **kwargs):
if "default_bounds" in kwargs:
raise TypeError(
f"Cannot use 'default_bounds' with {self.__class__.__name__}."
)
# Initializing base_field here ensures that its model matches the model
# for self.
if hasattr(self, "base_field"):
self.base_field = self.base_field()
super().__init__(*args, **kwargs)
@property
def model(self):
try:
return self.__dict__["model"]
except KeyError:
raise AttributeError(
"'%s' object has no attribute 'model'" % self.__class__.__name__
)
@model.setter
def model(self, model):
self.__dict__["model"] = model
self.base_field.model = model
@classmethod
def _choices_is_value(cls, value):
return isinstance(value, (list, tuple)) or super()._choices_is_value(value)
def get_placeholder(self, value, compiler, connection):
return "%s::{}".format(self.db_type(connection))
def get_prep_value(self, value):
if value is None:
return None
elif isinstance(value, Range):
return value
elif isinstance(value, (list, tuple)):
return self.range_type(value[0], value[1])
return value
def to_python(self, value):
if isinstance(value, str):
# Assume we're deserializing
vals = json.loads(value)
for end in ("lower", "upper"):
if end in vals:
vals[end] = self.base_field.to_python(vals[end])
value = self.range_type(**vals)
elif isinstance(value, (list, tuple)):
value = self.range_type(value[0], value[1])
return value
def set_attributes_from_name(self, name):
super().set_attributes_from_name(name)
self.base_field.set_attributes_from_name(name)
def value_to_string(self, obj):
value = self.value_from_object(obj)
if value is None:
return None
if value.isempty:
return json.dumps({"empty": True})
base_field = self.base_field
result = {"bounds": value._bounds}
for end in ("lower", "upper"):
val = getattr(value, end)
if val is None:
result[end] = None
else:
obj = AttributeSetter(base_field.attname, val)
result[end] = base_field.value_to_string(obj)
return json.dumps(result)
def formfield(self, **kwargs):
kwargs.setdefault("form_class", self.form_field)
return super().formfield(**kwargs)
CANONICAL_RANGE_BOUNDS = "[)"
class ContinuousRangeField(RangeField):
"""
Continuous range field. It allows specifying default bounds for list and
tuple inputs.
"""
def __init__(self, *args, default_bounds=CANONICAL_RANGE_BOUNDS, **kwargs):
if default_bounds not in ("[)", "(]", "()", "[]"):
raise ValueError("default_bounds must be one of '[)', '(]', '()', or '[]'.")
self.default_bounds = default_bounds
super().__init__(*args, **kwargs)
def get_prep_value(self, value):
if isinstance(value, (list, tuple)):
return self.range_type(value[0], value[1], self.default_bounds)
return super().get_prep_value(value)
def formfield(self, **kwargs):
kwargs.setdefault("default_bounds", self.default_bounds)
return super().formfield(**kwargs)
def deconstruct(self):
name, path, args, kwargs = super().deconstruct()
if self.default_bounds and self.default_bounds != CANONICAL_RANGE_BOUNDS:
kwargs["default_bounds"] = self.default_bounds
return name, path, args, kwargs
class IntegerRangeField(RangeField):
base_field = models.IntegerField
range_type = NumericRange
form_field = forms.IntegerRangeField
def db_type(self, connection):
return "int4range"
class BigIntegerRangeField(RangeField):
base_field = models.BigIntegerField
range_type = NumericRange
form_field = forms.IntegerRangeField
def db_type(self, connection):
return "int8range"
class DecimalRangeField(ContinuousRangeField):
base_field = models.DecimalField
range_type = NumericRange
form_field = forms.DecimalRangeField
def db_type(self, connection):
return "numrange"
class DateTimeRangeField(ContinuousRangeField):
base_field = models.DateTimeField
range_type = DateTimeTZRange
form_field = forms.DateTimeRangeField
def db_type(self, connection):
return "tstzrange"
class DateRangeField(RangeField):
base_field = models.DateField
range_type = DateRange
form_field = forms.DateRangeField
def db_type(self, connection):
return "daterange"
class RangeContains(lookups.DataContains):
def get_prep_lookup(self):
if not isinstance(self.rhs, (list, tuple, Range)):
return Cast(self.rhs, self.lhs.field.base_field)
return super().get_prep_lookup()
RangeField.register_lookup(RangeContains)
RangeField.register_lookup(lookups.ContainedBy)
RangeField.register_lookup(lookups.Overlap)
class DateTimeRangeContains(PostgresOperatorLookup):
"""
Lookup for Date/DateTimeRange containment to cast the rhs to the correct
type.
"""
lookup_name = "contains"
postgres_operator = RangeOperators.CONTAINS
def process_rhs(self, compiler, connection):
# Transform rhs value for db lookup.
if isinstance(self.rhs, datetime.date):
value = models.Value(self.rhs)
self.rhs = value.resolve_expression(compiler.query)
return super().process_rhs(compiler, connection)
def as_postgresql(self, compiler, connection):
sql, params = super().as_postgresql(compiler, connection)
# Cast the rhs if needed.
cast_sql = ""
if (
isinstance(self.rhs, models.Expression)
and self.rhs._output_field_or_none
and
# Skip cast if rhs has a matching range type.
not isinstance(
self.rhs._output_field_or_none, self.lhs.output_field.__class__
)
):
cast_internal_type = self.lhs.output_field.base_field.get_internal_type()
cast_sql = "::{}".format(connection.data_types.get(cast_internal_type))
return "%s%s" % (sql, cast_sql), params
DateRangeField.register_lookup(DateTimeRangeContains)
DateTimeRangeField.register_lookup(DateTimeRangeContains)
class RangeContainedBy(PostgresOperatorLookup):
lookup_name = "contained_by"
type_mapping = {
"smallint": "int4range",
"integer": "int4range",
"bigint": "int8range",
"double precision": "numrange",
"numeric": "numrange",
"date": "daterange",
"timestamp with time zone": "tstzrange",
}
postgres_operator = RangeOperators.CONTAINED_BY
def process_rhs(self, compiler, connection):
rhs, rhs_params = super().process_rhs(compiler, connection)
# Ignore precision for DecimalFields.
db_type = self.lhs.output_field.cast_db_type(connection).split("(")[0]
cast_type = self.type_mapping[db_type]
return "%s::%s" % (rhs, cast_type), rhs_params
def process_lhs(self, compiler, connection):
lhs, lhs_params = super().process_lhs(compiler, connection)
if isinstance(self.lhs.output_field, models.FloatField):
lhs = "%s::numeric" % lhs
elif isinstance(self.lhs.output_field, models.SmallIntegerField):
lhs = "%s::integer" % lhs
return lhs, lhs_params
def get_prep_lookup(self):
return RangeField().get_prep_value(self.rhs)
models.DateField.register_lookup(RangeContainedBy)
models.DateTimeField.register_lookup(RangeContainedBy)
models.IntegerField.register_lookup(RangeContainedBy)
models.FloatField.register_lookup(RangeContainedBy)
models.DecimalField.register_lookup(RangeContainedBy)
@RangeField.register_lookup
class FullyLessThan(PostgresOperatorLookup):
lookup_name = "fully_lt"
postgres_operator = RangeOperators.FULLY_LT
@RangeField.register_lookup
class FullGreaterThan(PostgresOperatorLookup):
lookup_name = "fully_gt"
postgres_operator = RangeOperators.FULLY_GT
@RangeField.register_lookup
class NotLessThan(PostgresOperatorLookup):
lookup_name = "not_lt"
postgres_operator = RangeOperators.NOT_LT
@RangeField.register_lookup
class NotGreaterThan(PostgresOperatorLookup):
lookup_name = "not_gt"
postgres_operator = RangeOperators.NOT_GT
@RangeField.register_lookup
class AdjacentToLookup(PostgresOperatorLookup):
lookup_name = "adjacent_to"
postgres_operator = RangeOperators.ADJACENT_TO
@RangeField.register_lookup
class RangeStartsWith(models.Transform):
lookup_name = "startswith"
function = "lower"
@property
def output_field(self):
return self.lhs.output_field.base_field
@RangeField.register_lookup
class RangeEndsWith(models.Transform):
lookup_name = "endswith"
function = "upper"
@property
def output_field(self):
return self.lhs.output_field.base_field
@RangeField.register_lookup
class IsEmpty(models.Transform):
lookup_name = "isempty"
function = "isempty"
output_field = models.BooleanField()
@RangeField.register_lookup
class LowerInclusive(models.Transform):
lookup_name = "lower_inc"
function = "LOWER_INC"
output_field = models.BooleanField()
@RangeField.register_lookup
class LowerInfinite(models.Transform):
lookup_name = "lower_inf"
function = "LOWER_INF"
output_field = models.BooleanField()
@RangeField.register_lookup
class UpperInclusive(models.Transform):
lookup_name = "upper_inc"
function = "UPPER_INC"
output_field = models.BooleanField()
@RangeField.register_lookup
class UpperInfinite(models.Transform):
lookup_name = "upper_inf"
function = "UPPER_INF"
output_field = models.BooleanField()

View File

@ -0,0 +1,3 @@
class AttributeSetter:
def __init__(self, name, value):
setattr(self, name, value)

View File

@ -0,0 +1,3 @@
from .array import * # NOQA
from .hstore import * # NOQA
from .ranges import * # NOQA

View File

@ -0,0 +1,251 @@
import copy
from itertools import chain
from django import forms
from django.contrib.postgres.validators import (
ArrayMaxLengthValidator,
ArrayMinLengthValidator,
)
from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _
from ..utils import prefix_validation_error
class SimpleArrayField(forms.CharField):
default_error_messages = {
"item_invalid": _("Item %(nth)s in the array did not validate:"),
}
def __init__(
self, base_field, *, delimiter=",", max_length=None, min_length=None, **kwargs
):
self.base_field = base_field
self.delimiter = delimiter
super().__init__(**kwargs)
if min_length is not None:
self.min_length = min_length
self.validators.append(ArrayMinLengthValidator(int(min_length)))
if max_length is not None:
self.max_length = max_length
self.validators.append(ArrayMaxLengthValidator(int(max_length)))
def clean(self, value):
value = super().clean(value)
return [self.base_field.clean(val) for val in value]
def prepare_value(self, value):
if isinstance(value, list):
return self.delimiter.join(
str(self.base_field.prepare_value(v)) for v in value
)
return value
def to_python(self, value):
if isinstance(value, list):
items = value
elif value:
items = value.split(self.delimiter)
else:
items = []
errors = []
values = []
for index, item in enumerate(items):
try:
values.append(self.base_field.to_python(item))
except ValidationError as error:
errors.append(
prefix_validation_error(
error,
prefix=self.error_messages["item_invalid"],
code="item_invalid",
params={"nth": index + 1},
)
)
if errors:
raise ValidationError(errors)
return values
def validate(self, value):
super().validate(value)
errors = []
for index, item in enumerate(value):
try:
self.base_field.validate(item)
except ValidationError as error:
errors.append(
prefix_validation_error(
error,
prefix=self.error_messages["item_invalid"],
code="item_invalid",
params={"nth": index + 1},
)
)
if errors:
raise ValidationError(errors)
def run_validators(self, value):
super().run_validators(value)
errors = []
for index, item in enumerate(value):
try:
self.base_field.run_validators(item)
except ValidationError as error:
errors.append(
prefix_validation_error(
error,
prefix=self.error_messages["item_invalid"],
code="item_invalid",
params={"nth": index + 1},
)
)
if errors:
raise ValidationError(errors)
def has_changed(self, initial, data):
try:
value = self.to_python(data)
except ValidationError:
pass
else:
if initial in self.empty_values and value in self.empty_values:
return False
return super().has_changed(initial, data)
class SplitArrayWidget(forms.Widget):
template_name = "postgres/widgets/split_array.html"
def __init__(self, widget, size, **kwargs):
self.widget = widget() if isinstance(widget, type) else widget
self.size = size
super().__init__(**kwargs)
@property
def is_hidden(self):
return self.widget.is_hidden
def value_from_datadict(self, data, files, name):
return [
self.widget.value_from_datadict(data, files, "%s_%s" % (name, index))
for index in range(self.size)
]
def value_omitted_from_data(self, data, files, name):
return all(
self.widget.value_omitted_from_data(data, files, "%s_%s" % (name, index))
for index in range(self.size)
)
def id_for_label(self, id_):
# See the comment for RadioSelect.id_for_label()
if id_:
id_ += "_0"
return id_
def get_context(self, name, value, attrs=None):
attrs = {} if attrs is None else attrs
context = super().get_context(name, value, attrs)
if self.is_localized:
self.widget.is_localized = self.is_localized
value = value or []
context["widget"]["subwidgets"] = []
final_attrs = self.build_attrs(attrs)
id_ = final_attrs.get("id")
for i in range(max(len(value), self.size)):
try:
widget_value = value[i]
except IndexError:
widget_value = None
if id_:
final_attrs = {**final_attrs, "id": "%s_%s" % (id_, i)}
context["widget"]["subwidgets"].append(
self.widget.get_context(name + "_%s" % i, widget_value, final_attrs)[
"widget"
]
)
return context
@property
def media(self):
return self.widget.media
def __deepcopy__(self, memo):
obj = super().__deepcopy__(memo)
obj.widget = copy.deepcopy(self.widget)
return obj
@property
def needs_multipart_form(self):
return self.widget.needs_multipart_form
class SplitArrayField(forms.Field):
default_error_messages = {
"item_invalid": _("Item %(nth)s in the array did not validate:"),
}
def __init__(self, base_field, size, *, remove_trailing_nulls=False, **kwargs):
self.base_field = base_field
self.size = size
self.remove_trailing_nulls = remove_trailing_nulls
widget = SplitArrayWidget(widget=base_field.widget, size=size)
kwargs.setdefault("widget", widget)
super().__init__(**kwargs)
def _remove_trailing_nulls(self, values):
index = None
if self.remove_trailing_nulls:
for i, value in reversed(list(enumerate(values))):
if value in self.base_field.empty_values:
index = i
else:
break
if index is not None:
values = values[:index]
return values, index
def to_python(self, value):
value = super().to_python(value)
return [self.base_field.to_python(item) for item in value]
def clean(self, value):
cleaned_data = []
errors = []
if not any(value) and self.required:
raise ValidationError(self.error_messages["required"])
max_size = max(self.size, len(value))
for index in range(max_size):
item = value[index]
try:
cleaned_data.append(self.base_field.clean(item))
except ValidationError as error:
errors.append(
prefix_validation_error(
error,
self.error_messages["item_invalid"],
code="item_invalid",
params={"nth": index + 1},
)
)
cleaned_data.append(None)
else:
errors.append(None)
cleaned_data, null_index = self._remove_trailing_nulls(cleaned_data)
if null_index is not None:
errors = errors[:null_index]
errors = list(filter(None, errors))
if errors:
raise ValidationError(list(chain.from_iterable(errors)))
return cleaned_data
def has_changed(self, initial, data):
try:
data = self.to_python(data)
except ValidationError:
pass
else:
data, _ = self._remove_trailing_nulls(data)
if initial in self.empty_values and data in self.empty_values:
return False
return super().has_changed(initial, data)

View File

@ -0,0 +1,59 @@
import json
from django import forms
from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _
__all__ = ["HStoreField"]
class HStoreField(forms.CharField):
"""
A field for HStore data which accepts dictionary JSON input.
"""
widget = forms.Textarea
default_error_messages = {
"invalid_json": _("Could not load JSON data."),
"invalid_format": _("Input must be a JSON dictionary."),
}
def prepare_value(self, value):
if isinstance(value, dict):
return json.dumps(value)
return value
def to_python(self, value):
if not value:
return {}
if not isinstance(value, dict):
try:
value = json.loads(value)
except json.JSONDecodeError:
raise ValidationError(
self.error_messages["invalid_json"],
code="invalid_json",
)
if not isinstance(value, dict):
raise ValidationError(
self.error_messages["invalid_format"],
code="invalid_format",
)
# Cast everything to strings for ease.
for key, val in value.items():
if val is not None:
val = str(val)
value[key] = val
return value
def has_changed(self, initial, data):
"""
Return True if data differs from initial.
"""
# For purposes of seeing whether something has changed, None is
# the same as an empty dict, if the data or initial value we get
# is None, replace it w/ {}.
initial_value = self.to_python(initial)
return super().has_changed(initial_value, data)

View File

@ -0,0 +1,119 @@
from django import forms
from django.core import exceptions
from django.db.backends.postgresql.psycopg_any import (
DateRange,
DateTimeTZRange,
NumericRange,
)
from django.forms.widgets import HiddenInput, MultiWidget
from django.utils.translation import gettext_lazy as _
__all__ = [
"BaseRangeField",
"IntegerRangeField",
"DecimalRangeField",
"DateTimeRangeField",
"DateRangeField",
"HiddenRangeWidget",
"RangeWidget",
]
class RangeWidget(MultiWidget):
def __init__(self, base_widget, attrs=None):
widgets = (base_widget, base_widget)
super().__init__(widgets, attrs)
def decompress(self, value):
if value:
return (value.lower, value.upper)
return (None, None)
class HiddenRangeWidget(RangeWidget):
"""A widget that splits input into two <input type="hidden"> inputs."""
def __init__(self, attrs=None):
super().__init__(HiddenInput, attrs)
class BaseRangeField(forms.MultiValueField):
default_error_messages = {
"invalid": _("Enter two valid values."),
"bound_ordering": _(
"The start of the range must not exceed the end of the range."
),
}
hidden_widget = HiddenRangeWidget
def __init__(self, **kwargs):
if "widget" not in kwargs:
kwargs["widget"] = RangeWidget(self.base_field.widget)
if "fields" not in kwargs:
kwargs["fields"] = [
self.base_field(required=False),
self.base_field(required=False),
]
kwargs.setdefault("required", False)
kwargs.setdefault("require_all_fields", False)
self.range_kwargs = {}
if default_bounds := kwargs.pop("default_bounds", None):
self.range_kwargs = {"bounds": default_bounds}
super().__init__(**kwargs)
def prepare_value(self, value):
lower_base, upper_base = self.fields
if isinstance(value, self.range_type):
return [
lower_base.prepare_value(value.lower),
upper_base.prepare_value(value.upper),
]
if value is None:
return [
lower_base.prepare_value(None),
upper_base.prepare_value(None),
]
return value
def compress(self, values):
if not values:
return None
lower, upper = values
if lower is not None and upper is not None and lower > upper:
raise exceptions.ValidationError(
self.error_messages["bound_ordering"],
code="bound_ordering",
)
try:
range_value = self.range_type(lower, upper, **self.range_kwargs)
except TypeError:
raise exceptions.ValidationError(
self.error_messages["invalid"],
code="invalid",
)
else:
return range_value
class IntegerRangeField(BaseRangeField):
default_error_messages = {"invalid": _("Enter two whole numbers.")}
base_field = forms.IntegerField
range_type = NumericRange
class DecimalRangeField(BaseRangeField):
default_error_messages = {"invalid": _("Enter two numbers.")}
base_field = forms.DecimalField
range_type = NumericRange
class DateTimeRangeField(BaseRangeField):
default_error_messages = {"invalid": _("Enter two valid date/times.")}
base_field = forms.DateTimeField
range_type = DateTimeTZRange
class DateRangeField(BaseRangeField):
default_error_messages = {"invalid": _("Enter two valid dates.")}
base_field = forms.DateField
range_type = DateRange

View File

@ -0,0 +1,11 @@
from django.db.models import DateTimeField, Func, UUIDField
class RandomUUID(Func):
template = "GEN_RANDOM_UUID()"
output_field = UUIDField()
class TransactionNow(Func):
template = "CURRENT_TIMESTAMP"
output_field = DateTimeField()

View File

@ -0,0 +1,242 @@
from django.db import NotSupportedError
from django.db.models import Func, Index
from django.utils.functional import cached_property
__all__ = [
"BloomIndex",
"BrinIndex",
"BTreeIndex",
"GinIndex",
"GistIndex",
"HashIndex",
"SpGistIndex",
]
class PostgresIndex(Index):
@cached_property
def max_name_length(self):
# Allow an index name longer than 30 characters when the suffix is
# longer than the usual 3 character limit. The 30 character limit for
# cross-database compatibility isn't applicable to PostgreSQL-specific
# indexes.
return Index.max_name_length - len(Index.suffix) + len(self.suffix)
def create_sql(self, model, schema_editor, using="", **kwargs):
self.check_supported(schema_editor)
statement = super().create_sql(
model, schema_editor, using=" USING %s" % (using or self.suffix), **kwargs
)
with_params = self.get_with_params()
if with_params:
statement.parts["extra"] = " WITH (%s)%s" % (
", ".join(with_params),
statement.parts["extra"],
)
return statement
def check_supported(self, schema_editor):
pass
def get_with_params(self):
return []
class BloomIndex(PostgresIndex):
suffix = "bloom"
def __init__(self, *expressions, length=None, columns=(), **kwargs):
super().__init__(*expressions, **kwargs)
if len(self.fields) > 32:
raise ValueError("Bloom indexes support a maximum of 32 fields.")
if not isinstance(columns, (list, tuple)):
raise ValueError("BloomIndex.columns must be a list or tuple.")
if len(columns) > len(self.fields):
raise ValueError("BloomIndex.columns cannot have more values than fields.")
if not all(0 < col <= 4095 for col in columns):
raise ValueError(
"BloomIndex.columns must contain integers from 1 to 4095.",
)
if length is not None and not 0 < length <= 4096:
raise ValueError(
"BloomIndex.length must be None or an integer from 1 to 4096.",
)
self.length = length
self.columns = columns
def deconstruct(self):
path, args, kwargs = super().deconstruct()
if self.length is not None:
kwargs["length"] = self.length
if self.columns:
kwargs["columns"] = self.columns
return path, args, kwargs
def get_with_params(self):
with_params = []
if self.length is not None:
with_params.append("length = %d" % self.length)
if self.columns:
with_params.extend(
"col%d = %d" % (i, v) for i, v in enumerate(self.columns, start=1)
)
return with_params
class BrinIndex(PostgresIndex):
suffix = "brin"
def __init__(
self, *expressions, autosummarize=None, pages_per_range=None, **kwargs
):
if pages_per_range is not None and pages_per_range <= 0:
raise ValueError("pages_per_range must be None or a positive integer")
self.autosummarize = autosummarize
self.pages_per_range = pages_per_range
super().__init__(*expressions, **kwargs)
def deconstruct(self):
path, args, kwargs = super().deconstruct()
if self.autosummarize is not None:
kwargs["autosummarize"] = self.autosummarize
if self.pages_per_range is not None:
kwargs["pages_per_range"] = self.pages_per_range
return path, args, kwargs
def get_with_params(self):
with_params = []
if self.autosummarize is not None:
with_params.append(
"autosummarize = %s" % ("on" if self.autosummarize else "off")
)
if self.pages_per_range is not None:
with_params.append("pages_per_range = %d" % self.pages_per_range)
return with_params
class BTreeIndex(PostgresIndex):
suffix = "btree"
def __init__(self, *expressions, fillfactor=None, **kwargs):
self.fillfactor = fillfactor
super().__init__(*expressions, **kwargs)
def deconstruct(self):
path, args, kwargs = super().deconstruct()
if self.fillfactor is not None:
kwargs["fillfactor"] = self.fillfactor
return path, args, kwargs
def get_with_params(self):
with_params = []
if self.fillfactor is not None:
with_params.append("fillfactor = %d" % self.fillfactor)
return with_params
class GinIndex(PostgresIndex):
suffix = "gin"
def __init__(
self, *expressions, fastupdate=None, gin_pending_list_limit=None, **kwargs
):
self.fastupdate = fastupdate
self.gin_pending_list_limit = gin_pending_list_limit
super().__init__(*expressions, **kwargs)
def deconstruct(self):
path, args, kwargs = super().deconstruct()
if self.fastupdate is not None:
kwargs["fastupdate"] = self.fastupdate
if self.gin_pending_list_limit is not None:
kwargs["gin_pending_list_limit"] = self.gin_pending_list_limit
return path, args, kwargs
def get_with_params(self):
with_params = []
if self.gin_pending_list_limit is not None:
with_params.append(
"gin_pending_list_limit = %d" % self.gin_pending_list_limit
)
if self.fastupdate is not None:
with_params.append("fastupdate = %s" % ("on" if self.fastupdate else "off"))
return with_params
class GistIndex(PostgresIndex):
suffix = "gist"
def __init__(self, *expressions, buffering=None, fillfactor=None, **kwargs):
self.buffering = buffering
self.fillfactor = fillfactor
super().__init__(*expressions, **kwargs)
def deconstruct(self):
path, args, kwargs = super().deconstruct()
if self.buffering is not None:
kwargs["buffering"] = self.buffering
if self.fillfactor is not None:
kwargs["fillfactor"] = self.fillfactor
return path, args, kwargs
def get_with_params(self):
with_params = []
if self.buffering is not None:
with_params.append("buffering = %s" % ("on" if self.buffering else "off"))
if self.fillfactor is not None:
with_params.append("fillfactor = %d" % self.fillfactor)
return with_params
class HashIndex(PostgresIndex):
suffix = "hash"
def __init__(self, *expressions, fillfactor=None, **kwargs):
self.fillfactor = fillfactor
super().__init__(*expressions, **kwargs)
def deconstruct(self):
path, args, kwargs = super().deconstruct()
if self.fillfactor is not None:
kwargs["fillfactor"] = self.fillfactor
return path, args, kwargs
def get_with_params(self):
with_params = []
if self.fillfactor is not None:
with_params.append("fillfactor = %d" % self.fillfactor)
return with_params
class SpGistIndex(PostgresIndex):
suffix = "spgist"
def __init__(self, *expressions, fillfactor=None, **kwargs):
self.fillfactor = fillfactor
super().__init__(*expressions, **kwargs)
def deconstruct(self):
path, args, kwargs = super().deconstruct()
if self.fillfactor is not None:
kwargs["fillfactor"] = self.fillfactor
return path, args, kwargs
def get_with_params(self):
with_params = []
if self.fillfactor is not None:
with_params.append("fillfactor = %d" % self.fillfactor)
return with_params
def check_supported(self, schema_editor):
if (
self.include
and not schema_editor.connection.features.supports_covering_spgist_indexes
):
raise NotSupportedError("Covering SP-GiST indexes require PostgreSQL 14+.")
class OpClass(Func):
template = "%(expressions)s %(name)s"
def __init__(self, expression, name):
super().__init__(expression, name=name)

View File

@ -0,0 +1 @@
{% include 'django/forms/widgets/multiwidget.html' %}

View File

@ -0,0 +1,104 @@
# This file is distributed under the same license as the Django package.
#
# Translators:
# F Wolff <friedel@translate.org.za>, 2019-2020
msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-11 20:56+0200\n"
"PO-Revision-Date: 2020-05-12 20:01+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Afrikaans (http://www.transifex.com/django/django/language/"
"af/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: af\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgid "PostgreSQL extensions"
msgstr "PostgreSQL-uitbreidings"
#, python-format
msgid "Item %(nth)s in the array did not validate:"
msgstr "Item %(nth)s in die skikking kon nie valideer nie:"
msgid "Nested arrays must have the same length."
msgstr "Geneste skikkings moet dieselfde lengte hê."
msgid "Map of strings to strings/nulls"
msgstr "Woordeboek van stringe na stringe/nulls"
#, python-format
msgid "The value of “%(key)s” is not a string or null."
msgstr "Die waarde “%(key)s” is nie 'n string of null nie."
msgid "Could not load JSON data."
msgstr "Kon nie JSON-data laai nie."
msgid "Input must be a JSON dictionary."
msgstr "Toevoer moet 'n JSON-woordeboek wees."
msgid "Enter two valid values."
msgstr "Gee twee geldige waardes."
msgid "The start of the range must not exceed the end of the range."
msgstr "Die begin van die omvang mag nie die einde van die omvang oorskry nie."
msgid "Enter two whole numbers."
msgstr "Tik twee heelgetalle in."
msgid "Enter two numbers."
msgstr "Tik twee getalle in."
msgid "Enter two valid date/times."
msgstr "Tik twee geldige datum/tydwaardes in."
msgid "Enter two valid dates."
msgstr "Tik twee geldige datums in."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no more than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no more than "
"%(limit_value)d."
msgstr[0] ""
"Lys bevat %(show_value)d item, maar moet hoogstens %(limit_value)d bevat."
msgstr[1] ""
"Lys bevat %(show_value)d items, maar moet hoogstens %(limit_value)d bevat."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no fewer than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no fewer than "
"%(limit_value)d."
msgstr[0] ""
"Lys bevat %(show_value)d item, maar moet minstens %(limit_value)d bevat."
msgstr[1] ""
"Lys bevat %(show_value)d items, maar moet minstens %(limit_value)d bevat."
#, python-format
msgid "Some keys were missing: %(keys)s"
msgstr "Sommige sleutels het ontbreek: %(keys)s"
#, python-format
msgid "Some unknown keys were provided: %(keys)s"
msgstr "Sommige onbekende sleutels is voorsien: %(keys)s"
#, python-format
msgid ""
"Ensure that this range is completely less than or equal to %(limit_value)s."
msgstr ""
"Maak seker dat dié omvang heeltemal kleiner of gelyk is aan %(limit_value)s."
#, python-format
msgid ""
"Ensure that this range is completely greater than or equal to "
"%(limit_value)s."
msgstr ""
"Maak seker dat dié omvang heeltemal groter of gelyk is aan %(limit_value)s."

View File

@ -0,0 +1,131 @@
# This file is distributed under the same license as the Django package.
#
# Translators:
# Bashar Al-Abdulhadi, 2015-2017
# Muaaz Alsaied, 2020
msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-11 20:56+0200\n"
"PO-Revision-Date: 2020-05-12 20:01+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Arabic (http://www.transifex.com/django/django/language/ar/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ar\n"
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
msgid "PostgreSQL extensions"
msgstr "ملحقات PostgreSQL"
#, python-format
msgid "Item %(nth)s in the array did not validate:"
msgstr "العنصر %(nth)s في المتسلسلة لم يحقق التالي: "
msgid "Nested arrays must have the same length."
msgstr "يجب أن تكون المجموعات المتداخلة بنفس الطول."
msgid "Map of strings to strings/nulls"
msgstr "ترابط strings بـ strings/nulls"
#, python-format
msgid "The value of “%(key)s” is not a string or null."
msgstr "قيمة \"%(key)s\" ليست string أو null."
msgid "Could not load JSON data."
msgstr "لا يمكن عرض بيانات JSON."
msgid "Input must be a JSON dictionary."
msgstr "المُدخل يجب أن يكون بصيغة بصيغة قاموس JSON."
msgid "Enter two valid values."
msgstr "إدخال قيمتين صالحتين."
msgid "The start of the range must not exceed the end of the range."
msgstr "بداية المدى يجب ألا تتجاوز نهاية المدى."
msgid "Enter two whole numbers."
msgstr "أدخل رقمين كاملين."
msgid "Enter two numbers."
msgstr "أدخل رقمين."
msgid "Enter two valid date/times."
msgstr "أدخل تاريخين/وقتين صحيحين."
msgid "Enter two valid dates."
msgstr "أدخل تاريخين صحيحين."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no more than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no more than "
"%(limit_value)d."
msgstr[0] ""
"القائمة تحتوي على %(show_value)d عنصر, يجب أن لا تحتوي على أكثر من "
"%(limit_value)d."
msgstr[1] ""
"القائمة تحتوي على %(show_value)d عنصر, يجب أن لا تحتوي على أكثر من "
"%(limit_value)d."
msgstr[2] ""
"القائمة تحتوي على %(show_value)d عنصرين, يجب أن لا تحتوي على أكثر من "
"%(limit_value)d."
msgstr[3] ""
"القائمة تحتوي على %(show_value)d عناصر, يجب أن لا تحتوي على أكثر من "
"%(limit_value)d."
msgstr[4] ""
"القائمة تحتوي على %(show_value)d عنصر, يجب أن لا تحتوي على أكثر من "
"%(limit_value)d."
msgstr[5] ""
"القائمة تحتوي على %(show_value)d عنصر, يجب أن لا تحتوي على أكثر من "
"%(limit_value)d."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no fewer than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no fewer than "
"%(limit_value)d."
msgstr[0] ""
"القائمة تحتوي على %(show_value)d عنصر, يجب أن لا تحتوي على أقل من "
"%(limit_value)d."
msgstr[1] ""
"القائمة تحتوي على %(show_value)d عنصر, يجب أن لا تحتوي على أقل من "
"%(limit_value)d."
msgstr[2] ""
"القائمة تحتوي على %(show_value)d عنصرين, يجب أن لا تحتوي على أقل من "
"%(limit_value)d."
msgstr[3] ""
"القائمة تحتوي على %(show_value)d عناصر, يجب أن لا تحتوي على أقل من "
"%(limit_value)d."
msgstr[4] ""
"القائمة تحتوي على %(show_value)d عنصر, يجب أن لا تحتوي على أقل من "
"%(limit_value)d."
msgstr[5] ""
"القائمة تحتوي على %(show_value)d عنصر, يجب أن لا تحتوي على أقل من "
"%(limit_value)d."
#, python-format
msgid "Some keys were missing: %(keys)s"
msgstr "بعض المفاتيح مفقودة: %(keys)s"
#, python-format
msgid "Some unknown keys were provided: %(keys)s"
msgstr "بعض المفاتيح المزوّدة غير معرّفه: %(keys)s"
#, python-format
msgid ""
"Ensure that this range is completely less than or equal to %(limit_value)s."
msgstr "تأكد من أن هذا المدى أقل من أو يساوي %(limit_value)s."
#, python-format
msgid ""
"Ensure that this range is completely greater than or equal to "
"%(limit_value)s."
msgstr "تأكد من أن هذا المدى أكثر من أو يساوي %(limit_value)s."

View File

@ -0,0 +1,131 @@
# This file is distributed under the same license as the Django package.
#
# Translators:
# Riterix <infosrabah@gmail.com>, 2019
msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-11 20:56+0200\n"
"PO-Revision-Date: 2020-05-12 20:01+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Arabic (Algeria) (http://www.transifex.com/django/django/"
"language/ar_DZ/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ar_DZ\n"
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n"
msgid "PostgreSQL extensions"
msgstr "ملحقات PostgreSQL"
#, python-format
msgid "Item %(nth)s in the array did not validate:"
msgstr "العنصر %(nth)s في المجموعة لم يتم التحقق منه: "
msgid "Nested arrays must have the same length."
msgstr "يجب أن تكون المجموعات المتداخلة بنفس الطول."
msgid "Map of strings to strings/nulls"
msgstr "خريطة السلاسل إلى سلاسل / بلا قيم"
#, python-format
msgid "The value of “%(key)s” is not a string or null."
msgstr "قيمة \\\"%(key)s\\\" ليست سلسلة أو بلا قيمة."
msgid "Could not load JSON data."
msgstr "لا يمكن عرض بيانات JSON."
msgid "Input must be a JSON dictionary."
msgstr "المُدخل يجب أن يكون بصيغة بصيغة قاموس JSON."
msgid "Enter two valid values."
msgstr "إدخال قيمتين صالحتين."
msgid "The start of the range must not exceed the end of the range."
msgstr "بداية المدى يجب ألا تتجاوز نهاية المدى."
msgid "Enter two whole numbers."
msgstr "أدخل رقمين كاملين."
msgid "Enter two numbers."
msgstr "أدخل رقمين."
msgid "Enter two valid date/times."
msgstr "أدخل تاريخين/وقتين صحيحين."
msgid "Enter two valid dates."
msgstr "أدخل تاريخين صحيحين."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no more than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no more than "
"%(limit_value)d."
msgstr[0] ""
"القائمة تحتوي على %(show_value)d عنصر, يجب أن لا تحتوي على أكثر من "
"%(limit_value)d."
msgstr[1] ""
"القائمة تحتوي على %(show_value)d عنصر, يجب أن لا تحتوي على أكثر من "
"%(limit_value)d."
msgstr[2] ""
"القائمة تحتوي على %(show_value)d عنصرين, يجب أن لا تحتوي على أكثر من "
"%(limit_value)d."
msgstr[3] ""
"القائمة تحتوي على %(show_value)d عناصر, يجب أن لا تحتوي على أكثر من "
"%(limit_value)d."
msgstr[4] ""
"القائمة تحتوي على %(show_value)d عنصر, يجب أن لا تحتوي على أكثر من "
"%(limit_value)d."
msgstr[5] ""
"القائمة تحتوي على %(show_value)d عنصر, يجب أن لا تحتوي على أكثر من "
"%(limit_value)d."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no fewer than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no fewer than "
"%(limit_value)d."
msgstr[0] ""
"القائمة تحتوي على %(show_value)d عنصر, يجب أن لا تحتوي على أقل من "
"%(limit_value)d."
msgstr[1] ""
"القائمة تحتوي على %(show_value)d عنصر, يجب أن لا تحتوي على أقل من "
"%(limit_value)d."
msgstr[2] ""
"القائمة تحتوي على %(show_value)d عنصرين, يجب أن لا تحتوي على أقل من "
"%(limit_value)d."
msgstr[3] ""
"القائمة تحتوي على %(show_value)d عناصر, يجب أن لا تحتوي على أقل من "
"%(limit_value)d."
msgstr[4] ""
"القائمة تحتوي على %(show_value)d عنصر, يجب أن لا تحتوي على أقل من "
"%(limit_value)d."
msgstr[5] ""
"القائمة تحتوي على %(show_value)d عنصر, يجب أن لا تحتوي على أقل من "
"%(limit_value)d."
#, python-format
msgid "Some keys were missing: %(keys)s"
msgstr "بعض المفاتيح مفقودة: %(keys)s"
#, python-format
msgid "Some unknown keys were provided: %(keys)s"
msgstr "بعض المفاتيح المزوّدة غير معرّفه: %(keys)s"
#, python-format
msgid ""
"Ensure that this range is completely less than or equal to %(limit_value)s."
msgstr "تأكد من أن هذا المدى أقل من أو يساوي %(limit_value)s."
#, python-format
msgid ""
"Ensure that this range is completely greater than or equal to "
"%(limit_value)s."
msgstr "تأكد من أن هذا المدى أكثر من أو يساوي %(limit_value)s."

View File

@ -0,0 +1,102 @@
# This file is distributed under the same license as the Django package.
#
# Translators:
# Emin Mastizada <emin@linux.com>, 2018,2020
msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-11 20:56+0200\n"
"PO-Revision-Date: 2020-05-12 20:01+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Azerbaijani (http://www.transifex.com/django/django/language/"
"az/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: az\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgid "PostgreSQL extensions"
msgstr "PostgreSQL uzantıları"
#, python-format
msgid "Item %(nth)s in the array did not validate:"
msgstr "Array-dəki %(nth)s element təsdiqlənə bilmir:"
msgid "Nested arrays must have the same length."
msgstr "İç-içə array-lərin uzunluğu eyni olmalıdır."
msgid "Map of strings to strings/nulls"
msgstr "String-lərin string/null-lara xəritələnmə cədvəli"
#, python-format
msgid "The value of “%(key)s” is not a string or null."
msgstr "“%(key)s” dəyəri string və ya null deyil."
msgid "Could not load JSON data."
msgstr "JSON məlumat yüklənə bilmir."
msgid "Input must be a JSON dictionary."
msgstr "Giriş JSON lüğət olmalıdır."
msgid "Enter two valid values."
msgstr "İki düzgün dəyər daxil edin."
msgid "The start of the range must not exceed the end of the range."
msgstr "Aralığın başlanğıcı bitişindən böyük ola bilməz."
msgid "Enter two whole numbers."
msgstr "İki tam rəqəm daxil edin."
msgid "Enter two numbers."
msgstr "İki rəqəm daxil edin."
msgid "Enter two valid date/times."
msgstr "İki düzgün tarix/vaxt daxil edin."
msgid "Enter two valid dates."
msgstr "İki düzgün tarix daxil edin."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no more than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no more than "
"%(limit_value)d."
msgstr[0] ""
"Siyahıda %(show_value)d element var, ən çox %(limit_value)d ola bilər."
msgstr[1] ""
"Siyahıda %(show_value)d element var, ən çox %(limit_value)d ola bilər."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no fewer than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no fewer than "
"%(limit_value)d."
msgstr[0] ""
"Siyahıda %(show_value)d element var, ən az %(limit_value)d ola bilər."
msgstr[1] ""
"Siyahıda %(show_value)d element var, ən az %(limit_value)d ola bilər."
#, python-format
msgid "Some keys were missing: %(keys)s"
msgstr "Bəzi açarlar əksikdir: %(keys)s"
#, python-format
msgid "Some unknown keys were provided: %(keys)s"
msgstr "Bəzi bilinməyən açarlar təchiz edilib: %(keys)s"
#, python-format
msgid ""
"Ensure that this range is completely less than or equal to %(limit_value)s."
msgstr "Bu aralığın %(limit_value)s və ya daha az olduğuna əmin olun."
#, python-format
msgid ""
"Ensure that this range is completely greater than or equal to "
"%(limit_value)s."
msgstr "Bu aralığın %(limit_value)s və ya daha böyük olduğuna əmin olun."

View File

@ -0,0 +1,120 @@
# This file is distributed under the same license as the Django package.
#
# Translators:
# Viktar Palstsiuk <vipals@gmail.com>, 2015
# znotdead <zhirafchik@gmail.com>, 2016-2017,2019,2023
msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-01-17 02:13-0600\n"
"PO-Revision-Date: 2023-04-19 09:22+0000\n"
"Last-Translator: znotdead <zhirafchik@gmail.com>, 2016-2017,2019,2023\n"
"Language-Team: Belarusian (http://www.transifex.com/django/django/language/"
"be/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: be\n"
"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || "
"(n%100>=11 && n%100<=14)? 2 : 3);\n"
msgid "PostgreSQL extensions"
msgstr "Пашырэнні PostgreSQL"
#, python-format
msgid "Item %(nth)s in the array did not validate:"
msgstr "Элемент масіву нумар %(nth)s не прайшоў праверкі:"
msgid "Nested arrays must have the same length."
msgstr "Укладзенныя масівы павінны мець аднолькавую даўжыню."
msgid "Map of strings to strings/nulls"
msgstr "Адпаведнасць радкоў у радкі/нулі"
#, python-format
msgid "The value of “%(key)s” is not a string or null."
msgstr "Значэнне “%(key)s” не з'яўляецца радком ці null."
msgid "Could not load JSON data."
msgstr "Не атрымалася загрузіць дадзеныя JSON."
msgid "Input must be a JSON dictionary."
msgstr "Значэнне павінна быць JSON слоўнікам. "
msgid "Enter two valid values."
msgstr "Увядзіце два сапраўдных значэнні."
msgid "The start of the range must not exceed the end of the range."
msgstr "Пачатак дыяпазону не павінен перавышаць канец дыяпазону."
msgid "Enter two whole numbers."
msgstr "Увядзіце два цэлых лікі."
msgid "Enter two numbers."
msgstr "Увядзіце два лікі."
msgid "Enter two valid date/times."
msgstr "Увядзіце дзве/два сапраўдных даты/часу."
msgid "Enter two valid dates."
msgstr "Увядзіце дзве сапраўдных даты."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no more than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no more than "
"%(limit_value)d."
msgstr[0] ""
"Спіс мае %(show_value)d элемент, ён павінен мець не болей чым "
"%(limit_value)d."
msgstr[1] ""
"Спіс мае %(show_value)d элемента, ён павінен мець не болей чым "
"%(limit_value)d."
msgstr[2] ""
"Спіс мае %(show_value)d элементаў, ён павінен мець не болей чым "
"%(limit_value)d."
msgstr[3] ""
"Спіс мае %(show_value)d элементаў, ён павінен мець не болей чым "
"%(limit_value)d."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no fewer than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no fewer than "
"%(limit_value)d."
msgstr[0] ""
"Спіс мае %(show_value)d элемент, ён павінен мець не менш чым %(limit_value)d."
msgstr[1] ""
"Спіс мае %(show_value)d элемента, ён павінен мець не менш чым "
"%(limit_value)d."
msgstr[2] ""
"Спіс мае %(show_value)d элементаў, ён павінен мець не менш чым "
"%(limit_value)d."
msgstr[3] ""
"Спіс мае %(show_value)d элементаў, ён павінен мець не менш чым "
"%(limit_value)d."
#, python-format
msgid "Some keys were missing: %(keys)s"
msgstr "Не хапае нейкіх ключоў: %(keys)s"
#, python-format
msgid "Some unknown keys were provided: %(keys)s"
msgstr "Дадзены нейкія невядомыя ключы: %(keys)s"
#, python-format
msgid ""
"Ensure that the upper bound of the range is not greater than %(limit_value)s."
msgstr ""
"Пераканайцеся, што верхняя мяжа дыяпазону не перавышае %(limit_value)s."
#, python-format
msgid ""
"Ensure that the lower bound of the range is not less than %(limit_value)s."
msgstr "Пераканайцеся, што ніжняя мяжа дыяпазону не менш за %(limit_value)s."

View File

@ -0,0 +1,110 @@
# This file is distributed under the same license as the Django package.
#
# Translators:
# arneatec <arneatec@gmail.com>, 2022
# Todor Lubenov <tlubenov@gmail.com>, 2015
# Venelin Stoykov <vkstoykov@gmail.com>, 2015
msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-11 20:56+0200\n"
"PO-Revision-Date: 2022-01-14 11:54+0000\n"
"Last-Translator: arneatec <arneatec@gmail.com>\n"
"Language-Team: Bulgarian (http://www.transifex.com/django/django/language/"
"bg/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: bg\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgid "PostgreSQL extensions"
msgstr "PostgreSQL разширения"
#, python-format
msgid "Item %(nth)s in the array did not validate:"
msgstr "Елемент %(nth)s в масива не се валидира:"
msgid "Nested arrays must have the same length."
msgstr "Вложените масиви трябва да имат еднаква дължина."
msgid "Map of strings to strings/nulls"
msgstr "Мап от стрингове към стрингове/null-ове"
#, python-format
msgid "The value of “%(key)s” is not a string or null."
msgstr "Стойността на “%(key)s” не е стринг или null."
msgid "Could not load JSON data."
msgstr "Не можа да зареди JSON данни."
msgid "Input must be a JSON dictionary."
msgstr "Входните данни трябва да са JSON речник."
msgid "Enter two valid values."
msgstr "Въведете две валидни стойности."
msgid "The start of the range must not exceed the end of the range."
msgstr "Началото на обхвата не трябва да превишава края му."
msgid "Enter two whole numbers."
msgstr "Въведете две цели числа."
msgid "Enter two numbers."
msgstr "Въведете две числа."
msgid "Enter two valid date/times."
msgstr "Въведете две валидни дати/времена."
msgid "Enter two valid dates."
msgstr "Въведете две коректни дати."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no more than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no more than "
"%(limit_value)d."
msgstr[0] ""
"Списъкът съдържа %(show_value)d елемент, а трябва да има не повече от "
"%(limit_value)d."
msgstr[1] ""
"Списъкът съдържа %(show_value)d елемента, а трябва да има не повече от "
"%(limit_value)d."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no fewer than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no fewer than "
"%(limit_value)d."
msgstr[0] ""
"Списъкът съдържа %(show_value)d елемент, а трябва да има поне "
"%(limit_value)d."
msgstr[1] ""
"Списъкът съдържа %(show_value)d елемента, а трябва да има поне "
"%(limit_value)d."
#, python-format
msgid "Some keys were missing: %(keys)s"
msgstr "Някои ключове липсват: %(keys)s"
#, python-format
msgid "Some unknown keys were provided: %(keys)s"
msgstr "Бяха предоставени някои неизвестни ключове: %(keys)s"
#, python-format
msgid ""
"Ensure that this range is completely less than or equal to %(limit_value)s."
msgstr ""
"Уверете се, че този обхват е изцяло по-малък от или равен на %(limit_value)s."
#, python-format
msgid ""
"Ensure that this range is completely greater than or equal to "
"%(limit_value)s."
msgstr ""
"Уверете се, че интервалът е изцяло по-голям от или равен на %(limit_value)s."

View File

@ -0,0 +1,112 @@
# This file is distributed under the same license as the Django package.
#
# Translators:
# Antoni Aloy <aaloy@apsl.net>, 2015,2017
# duub qnnp, 2015
# Gil Obradors Via <gil.obradors@gmail.com>, 2019
# Manel Clos <manelclos@gmail.com>, 2020
# Roger Pons <rogerpons@gmail.com>, 2015
msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-11 20:56+0200\n"
"PO-Revision-Date: 2020-05-12 20:01+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Catalan (http://www.transifex.com/django/django/language/"
"ca/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ca\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgid "PostgreSQL extensions"
msgstr "Extensions de PostgreSQL"
#, python-format
msgid "Item %(nth)s in the array did not validate:"
msgstr "L'element %(nth)s de la matriu no s'ha pogut validar:"
msgid "Nested arrays must have the same length."
msgstr "Les matrius niades han de tenir la mateixa longitud."
msgid "Map of strings to strings/nulls"
msgstr "Mapa de cadenes a cadenes/nuls"
#, python-format
msgid "The value of “%(key)s” is not a string or null."
msgstr "El valor de \"%(key)s\" no és ni una cadena ni un nul."
msgid "Could not load JSON data."
msgstr "No es poden carregar les dades JSON"
msgid "Input must be a JSON dictionary."
msgstr "L'entrada ha de ser un diccionari JSON"
msgid "Enter two valid values."
msgstr "Introdueixi dos valors vàlids."
msgid "The start of the range must not exceed the end of the range."
msgstr "L'inici del rang no pot excedir el seu final."
msgid "Enter two whole numbers."
msgstr "Introduïu dos números enters positius."
msgid "Enter two numbers."
msgstr "Introduïu dos números."
msgid "Enter two valid date/times."
msgstr "Introduïu dues data/hora vàlides."
msgid "Enter two valid dates."
msgstr "Introduïu dos dates vàlides."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no more than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no more than "
"%(limit_value)d."
msgstr[0] ""
"La llista conté %(show_value)d element, no n'hauria de tenir més de "
"%(limit_value)d."
msgstr[1] ""
"La llista conté %(show_value)d elements, no n'hauria de tenir més de "
"%(limit_value)d."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no fewer than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no fewer than "
"%(limit_value)d."
msgstr[0] ""
"La llista conté %(show_value)d element, no n'hauria de contenir menys de "
"%(limit_value)d."
msgstr[1] ""
"La llista conté %(show_value)d elements, no n'hauria de contenir menys de "
"%(limit_value)d."
#, python-format
msgid "Some keys were missing: %(keys)s"
msgstr "Algunes claus no hi són: %(keys)s"
#, python-format
msgid "Some unknown keys were provided: %(keys)s"
msgstr "S'han facilitat claus desconegudes: %(keys)s"
#, python-format
msgid ""
"Ensure that this range is completely less than or equal to %(limit_value)s."
msgstr ""
"Asseguri's que aquest rang és completament menor o igual a %(limit_value)s."
#, python-format
msgid ""
"Ensure that this range is completely greater than or equal to "
"%(limit_value)s."
msgstr ""
"Asseguri's que aquest rang és completament major o igual a %(limit_value)s."

View File

@ -0,0 +1,101 @@
# This file is distributed under the same license as the Django package.
#
# Translators:
# Swara <swara09@gmail.com>, 2022
msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-01-17 02:13-0600\n"
"PO-Revision-Date: 2023-04-19 09:22+0000\n"
"Last-Translator: Swara <swara09@gmail.com>, 2022\n"
"Language-Team: Central Kurdish (http://www.transifex.com/django/django/"
"language/ckb/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ckb\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgid "PostgreSQL extensions"
msgstr "پێوەکراوەکانی PostgreSQL"
#, python-format
msgid "Item %(nth)s in the array did not validate:"
msgstr "بڕگەی%(nth)s لەناو ڕیزەکەدا پشتڕاست نەکراوەتەوە:"
msgid "Nested arrays must have the same length."
msgstr "ڕیزی هێلانەکراو دەبێت هەمان درێژی هەبێت."
msgid "Map of strings to strings/nulls"
msgstr "نەخشەی ده‌قه‌ڕیزبه‌ندەکان بۆ دەقەڕیزبەندەکان/بەتاڵەکان"
#, python-format
msgid "The value of “%(key)s” is not a string or null."
msgstr "بەهای “%(key)s” نە دەقەڕیزبەندە نە بەتاڵ."
msgid "Could not load JSON data."
msgstr "نەتوانرا داتاکانی JSON باربکرێت."
msgid "Input must be a JSON dictionary."
msgstr "دەرخواردە دەبێت فەرهەنگی JSON بێت."
msgid "Enter two valid values."
msgstr "دوو بەهای دروست بنوسە."
msgid "The start of the range must not exceed the end of the range."
msgstr "نابێت سەرەتای ڕێژەکە لە کۆتایی ڕێژەکە زیاتر بێت."
msgid "Enter two whole numbers."
msgstr "دوو ژمارەی تەواو بنوسە."
msgid "Enter two numbers."
msgstr "دوو ژمارە بنوسە."
msgid "Enter two valid date/times."
msgstr "دوو بەروار/کاتی دروست بنوسە."
msgid "Enter two valid dates."
msgstr "دوو بەرواری دروست بنوسە."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no more than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no more than "
"%(limit_value)d."
msgstr[0] ""
"لیست پێکدێت لە %(show_value)d بڕگە، دەبێت زیاتر نەبێت لە %(limit_value)d."
msgstr[1] ""
"لیست پێکدێت لە %(show_value)d بڕگە، دەبێت زیاتر نەبێت لە %(limit_value)d."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no fewer than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no fewer than "
"%(limit_value)d."
msgstr[0] ""
"لیست پێکدێت لە %(show_value)d بڕگە، دەبێت کەمتر نەبێت لە %(limit_value)d."
msgstr[1] ""
"لیست پێکدێت لە %(show_value)d بڕگە، دەبێت کەمتر نەبێت لە %(limit_value)d."
#, python-format
msgid "Some keys were missing: %(keys)s"
msgstr "هەندێک کلیل نەمابوون: %(keys)s"
#, python-format
msgid "Some unknown keys were provided: %(keys)s"
msgstr "هەندێک کلیلی نەناسراو دابین کران: %(keys)s"
#, python-format
msgid ""
"Ensure that the upper bound of the range is not greater than %(limit_value)s."
msgstr ""
#, python-format
msgid ""
"Ensure that the lower bound of the range is not less than %(limit_value)s."
msgstr ""

View File

@ -0,0 +1,119 @@
# This file is distributed under the same license as the Django package.
#
# Translators:
# Tomáš Ehrlich <tomas.ehrlich@gmail.com>, 2015
# Vláďa Macek <macek@sandbox.cz>, 2015-2019
msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-11 20:56+0200\n"
"PO-Revision-Date: 2020-05-12 20:01+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Czech (http://www.transifex.com/django/django/language/cs/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: cs\n"
"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n "
"<= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n"
msgid "PostgreSQL extensions"
msgstr "Rozšíření pro PostgreSQL"
#, python-format
msgid "Item %(nth)s in the array did not validate:"
msgstr "Položka č. %(nth)s v seznamu je neplatná:"
msgid "Nested arrays must have the same length."
msgstr "Vnořená pole musejí mít stejnou délku."
msgid "Map of strings to strings/nulls"
msgstr "Mapování řetězců na řetězce či hodnoty NULL"
#, python-format
msgid "The value of “%(key)s” is not a string or null."
msgstr "Hodnota s klíčem \"%(key)s\" není řetězec ani NULL."
msgid "Could not load JSON data."
msgstr "Data typu JSON nelze načíst."
msgid "Input must be a JSON dictionary."
msgstr "Vstup musí být slovník formátu JSON."
msgid "Enter two valid values."
msgstr "Zadejte dvě platné hodnoty."
msgid "The start of the range must not exceed the end of the range."
msgstr "Počáteční hodnota rozsahu nemůže být vyšší než koncová hodnota."
msgid "Enter two whole numbers."
msgstr "Zadejte dvě celá čísla."
msgid "Enter two numbers."
msgstr "Zadejte dvě čísla."
msgid "Enter two valid date/times."
msgstr "Zadejte dvě platné hodnoty data nebo času."
msgid "Enter two valid dates."
msgstr "Zadejte dvě platná data."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no more than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no more than "
"%(limit_value)d."
msgstr[0] ""
"Seznam obsahuje %(show_value)d položku, ale neměl by obsahovat více než "
"%(limit_value)d."
msgstr[1] ""
"Seznam obsahuje %(show_value)d položky, ale neměl by obsahovat více než "
"%(limit_value)d."
msgstr[2] ""
"Seznam obsahuje %(show_value)d položek, ale neměl by obsahovat více než "
"%(limit_value)d."
msgstr[3] ""
"Seznam obsahuje %(show_value)d položek, ale neměl by obsahovat více než "
"%(limit_value)d."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no fewer than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no fewer than "
"%(limit_value)d."
msgstr[0] ""
"Seznam obsahuje %(show_value)d položku, ale neměl by obsahovat méně než "
"%(limit_value)d."
msgstr[1] ""
"Seznam obsahuje %(show_value)d položky, ale neměl by obsahovat méně než "
"%(limit_value)d."
msgstr[2] ""
"Seznam obsahuje %(show_value)d položek, ale neměl by obsahovat méně než "
"%(limit_value)d."
msgstr[3] ""
"Seznam obsahuje %(show_value)d položek, ale neměl by obsahovat méně než "
"%(limit_value)d."
#, python-format
msgid "Some keys were missing: %(keys)s"
msgstr "Některé klíče chybí: %(keys)s"
#, python-format
msgid "Some unknown keys were provided: %(keys)s"
msgstr "Byly zadány neznámé klíče: %(keys)s"
#, python-format
msgid ""
"Ensure that this range is completely less than or equal to %(limit_value)s."
msgstr "Nejvyšší hodnota rozsahu musí být menší nebo rovna %(limit_value)s."
#, python-format
msgid ""
"Ensure that this range is completely greater than or equal to "
"%(limit_value)s."
msgstr "Nejnižší hodnota rozsahu musí být větší nebo rovna %(limit_value)s."

View File

@ -0,0 +1,106 @@
# This file is distributed under the same license as the Django package.
#
# Translators:
# Erik Ramsgaard Wognsen <r4mses@gmail.com>, 2023
# Erik Ramsgaard Wognsen <r4mses@gmail.com>, 2015-2020
# valberg <valberg@orn.li>, 2015
msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-01-17 02:13-0600\n"
"PO-Revision-Date: 2023-04-19 09:22+0000\n"
"Last-Translator: Erik Ramsgaard Wognsen <r4mses@gmail.com>, 2023\n"
"Language-Team: Danish (http://www.transifex.com/django/django/language/da/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: da\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgid "PostgreSQL extensions"
msgstr "PostgreSQL-udvidelser"
#, python-format
msgid "Item %(nth)s in the array did not validate:"
msgstr "Element %(nth)s i array'et blev ikke valideret:"
msgid "Nested arrays must have the same length."
msgstr "Indlejrede arrays skal have den samme længde."
msgid "Map of strings to strings/nulls"
msgstr "Afbildning fra strenge til strenge/nulls"
#, python-format
msgid "The value of “%(key)s” is not a string or null."
msgstr "Værdien af “%(key)s” er ikke en streng eller null."
msgid "Could not load JSON data."
msgstr "Kunne ikke indlæse JSON-data."
msgid "Input must be a JSON dictionary."
msgstr "Input skal være et JSON-dictionary."
msgid "Enter two valid values."
msgstr "Indtast to gyldige værdier."
msgid "The start of the range must not exceed the end of the range."
msgstr "Starten af intervallet kan ikke overstige slutningen af intervallet."
msgid "Enter two whole numbers."
msgstr "Indtast to heltal."
msgid "Enter two numbers."
msgstr "Indtast to tal."
msgid "Enter two valid date/times."
msgstr "Indtast to gyldige dato/tider."
msgid "Enter two valid dates."
msgstr "Indtast to gyldige datoer."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no more than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no more than "
"%(limit_value)d."
msgstr[0] ""
"Listen indeholder %(show_value)d element, en bør ikke indeholde mere end "
"%(limit_value)d."
msgstr[1] ""
"Listen indeholder %(show_value)d elementer, den bør ikke indeholde mere end "
"%(limit_value)d."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no fewer than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no fewer than "
"%(limit_value)d."
msgstr[0] ""
"Listen indeholder %(show_value)d element, den bør ikke indeholde mindre end "
"%(limit_value)d."
msgstr[1] ""
"Listen indeholder %(show_value)d elementer, den bør ikke indeholde mindre "
"end %(limit_value)d."
#, python-format
msgid "Some keys were missing: %(keys)s"
msgstr "Nøgler mangler: %(keys)s"
#, python-format
msgid "Some unknown keys were provided: %(keys)s"
msgstr "Ukendte nøgler angivet: %(keys)s"
#, python-format
msgid ""
"Ensure that the upper bound of the range is not greater than %(limit_value)s."
msgstr "Intervallets øvre grænse må ikke være større end %(limit_value)s."
#, python-format
msgid ""
"Ensure that the lower bound of the range is not less than %(limit_value)s."
msgstr "Intervallets nedre grænse må ikke være mindre end %(limit_value)s."

View File

@ -0,0 +1,111 @@
# This file is distributed under the same license as the Django package.
#
# Translators:
# Florian Apolloner <florian@apolloner.eu>, 2023
# Jannis Leidel <jannis@leidel.info>, 2015-2018,2020
# Jens Neuhaus <kontakt@jensneuhaus.de>, 2016
# Markus Holtermann <info@markusholtermann.eu>, 2017
msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-01-17 02:13-0600\n"
"PO-Revision-Date: 2023-04-19 09:22+0000\n"
"Last-Translator: Florian Apolloner <florian@apolloner.eu>, 2023\n"
"Language-Team: German (http://www.transifex.com/django/django/language/de/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: de\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgid "PostgreSQL extensions"
msgstr "PostgreSQL-Erweiterungen"
#, python-format
msgid "Item %(nth)s in the array did not validate:"
msgstr "Element %(nth)s im Array konnte nicht validiert werden:"
msgid "Nested arrays must have the same length."
msgstr "Verschachtelte Arrays müssen die gleiche Länge haben."
msgid "Map of strings to strings/nulls"
msgstr "Zuordnung von Zeichenketten zu Zeichenketten/NULLs"
#, python-format
msgid "The value of “%(key)s” is not a string or null."
msgstr "Der Wert für „%(key)s“ ist keine Zeichenkette oder NULL."
msgid "Could not load JSON data."
msgstr "Konnte JSON-Daten nicht laden."
msgid "Input must be a JSON dictionary."
msgstr "Eingabe muss ein JSON-Dictionary sein."
msgid "Enter two valid values."
msgstr "Bitte zwei gültige Werte eingeben."
msgid "The start of the range must not exceed the end of the range."
msgstr "Der Anfang des Wertbereichs darf nicht das Ende überschreiten."
msgid "Enter two whole numbers."
msgstr "Bitte zwei ganze Zahlen eingeben."
msgid "Enter two numbers."
msgstr "Bitte zwei Zahlen eingeben."
msgid "Enter two valid date/times."
msgstr "Bitte zwei gültige Datum/Uhrzeit-Werte eingeben."
msgid "Enter two valid dates."
msgstr "Bitte zwei gültige Kalenderdaten eingeben."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no more than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no more than "
"%(limit_value)d."
msgstr[0] ""
"Liste enthält %(show_value)d Element, es sollte aber nicht mehr als "
"%(limit_value)d enthalten."
msgstr[1] ""
"Liste enthält %(show_value)d Elemente, es sollte aber nicht mehr als "
"%(limit_value)d enthalten."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no fewer than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no fewer than "
"%(limit_value)d."
msgstr[0] ""
"Liste enthält %(show_value)d Element, es sollte aber nicht weniger als "
"%(limit_value)d enthalten."
msgstr[1] ""
"Liste enthält %(show_value)d Elemente, es sollte aber nicht weniger als "
"%(limit_value)d enthalten."
#, python-format
msgid "Some keys were missing: %(keys)s"
msgstr "Einige Werte fehlen: %(keys)s"
#, python-format
msgid "Some unknown keys were provided: %(keys)s"
msgstr "Einige unbekannte Werte wurden eingegeben: %(keys)s"
#, python-format
msgid ""
"Ensure that the upper bound of the range is not greater than %(limit_value)s."
msgstr ""
"Bitte sicherstellen, dass die obere Grenze des Bereichs nicht größer als "
"%(limit_value)s ist."
#, python-format
msgid ""
"Ensure that the lower bound of the range is not less than %(limit_value)s."
msgstr ""
"Bitte sicherstellen, dass die untere Grenze des Bereichs nicht kleiner als "
"%(limit_value)s ist."

View File

@ -0,0 +1,118 @@
# This file is distributed under the same license as the Django package.
#
# Translators:
# Michael Wolf <milupo@sorbzilla.de>, 2016-2018,2020,2023
msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-01-17 02:13-0600\n"
"PO-Revision-Date: 2023-04-19 09:22+0000\n"
"Last-Translator: Michael Wolf <milupo@sorbzilla.de>, 2016-2018,2020,2023\n"
"Language-Team: Lower Sorbian (http://www.transifex.com/django/django/"
"language/dsb/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: dsb\n"
"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || "
"n%100==4 ? 2 : 3);\n"
msgid "PostgreSQL extensions"
msgstr "Rozšyrjenja PostgreSQL"
#, python-format
msgid "Item %(nth)s in the array did not validate:"
msgstr "Zapisk %(nth)sw pólnej wariabli njejo se wobkšuśił:"
msgid "Nested arrays must have the same length."
msgstr "Zakašćikowane pólne wariable muse tu samsku dłujkosć měś."
msgid "Map of strings to strings/nulls"
msgstr "Konwertěrowanje znamuškowych rjeśazkow do znamuškowych rjeśazkow/nulow"
#, python-format
msgid "The value of “%(key)s” is not a string or null."
msgstr "Gódnota „%(key)s“ njejo znamuškowy rjeśazk abo null."
msgid "Could not load JSON data."
msgstr "JSON-daty njejsu se zacytowaś dali."
msgid "Input must be a JSON dictionary."
msgstr "Zapódaśe musy JSON-słownik byś."
msgid "Enter two valid values."
msgstr "Zapódajśo dwě płaśiwej gódnośe."
msgid "The start of the range must not exceed the end of the range."
msgstr "Zachopjeńk wobcerka njesmějo kóńc wobcerka pśekšocyś."
msgid "Enter two whole numbers."
msgstr "Zapódajśo dwě cełej licbje."
msgid "Enter two numbers."
msgstr "Zapódajśo dwě licbje."
msgid "Enter two valid date/times."
msgstr "Zapódajśo dwě płaśiwej datowej/casowej pódaśi."
msgid "Enter two valid dates."
msgstr "Zapódajśo dwě płaśiwej datowej pódaśi."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no more than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no more than "
"%(limit_value)d."
msgstr[0] ""
"Lisćina wopśimujo %(show_value)d element, wóna njeby dejała wěcej ako "
"%(limit_value)d wopśimowaś."
msgstr[1] ""
"Lisćina wopśimujo %(show_value)d elementa, wóna njeby dejała wěcej ako "
"%(limit_value)d wopśimowaś."
msgstr[2] ""
"Lisćina wopśimujo %(show_value)d elementy, wóna njeby dejała wěcej ako "
"%(limit_value)d wopśimowaś."
msgstr[3] ""
"Lisćina wopśimujo %(show_value)d elementow, wóna njeby dejała wěcej ako "
"%(limit_value)d wopśimowaś."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no fewer than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no fewer than "
"%(limit_value)d."
msgstr[0] ""
"Lisćina wopśimujo %(show_value)d element, wóna njeby dejała mjenjej ako "
"%(limit_value)d wopśimowaś."
msgstr[1] ""
"Lisćina wopśimujo %(show_value)d elementa, wóna njeby dejała mjenjej ako "
"%(limit_value)d wopśimowaś."
msgstr[2] ""
"Lisćina wopśimujo %(show_value)d elementy, wóna njeby dejała mjenjej ako "
"%(limit_value)d wopśimowaś."
msgstr[3] ""
"Lisćina wopśimujo %(show_value)d elementow, wóna njeby dejała mjenjej ako "
"%(limit_value)d wopśimowaś."
#, python-format
msgid "Some keys were missing: %(keys)s"
msgstr "Někotare kluce feluju: %(keys)s"
#, python-format
msgid "Some unknown keys were provided: %(keys)s"
msgstr "Někotare njeznate kluce su se pódali: %(keys)s"
#, python-format
msgid ""
"Ensure that the upper bound of the range is not greater than %(limit_value)s."
msgstr "Zawěsććo, až górna granica wobceŕka njejo wětša ako %(limit_value)s."
#, python-format
msgid ""
"Ensure that the lower bound of the range is not less than %(limit_value)s."
msgstr "Zawěsććo, až dolna granica wobceŕka njejo mjeńša ako %(limit_value)s."

View File

@ -0,0 +1,111 @@
# This file is distributed under the same license as the Django package.
#
# Translators:
# Fotis Athineos <fotis@transifex.com>, 2021
# Giannis Meletakis <meletakis@gmail.com>, 2015
# Nick Mavrakis <mavrakis.n@gmail.com>, 2017-2018
# Nick Mavrakis <mavrakis.n@gmail.com>, 2016
# Pãnoș <panos.laganakos@gmail.com>, 2016
msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-11 20:56+0200\n"
"PO-Revision-Date: 2021-08-04 06:26+0000\n"
"Last-Translator: Fotis Athineos <fotis@transifex.com>\n"
"Language-Team: Greek (http://www.transifex.com/django/django/language/el/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: el\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgid "PostgreSQL extensions"
msgstr "Επεκτάσεις της PostgreSQL"
#, python-format
msgid "Item %(nth)s in the array did not validate:"
msgstr "To στοιχείο %(nth)s στον πίνακα δεν είναι έγκυρο:"
msgid "Nested arrays must have the same length."
msgstr "Οι ένθετοι πίνακες πρέπει να έχουν το ίδιο μήκος."
msgid "Map of strings to strings/nulls"
msgstr "Αντιστοίχιση strings σε strings/nulls"
#, python-format
msgid "The value of “%(key)s” is not a string or null."
msgstr "Η τιμή του “%(key)s“ δεν είναι string ή null."
msgid "Could not load JSON data."
msgstr "Αδύνατη η φόρτωση των δεδομένων JSON."
msgid "Input must be a JSON dictionary."
msgstr "Το input πρέπει να είναι ένα έγκυρο JSON dictionary."
msgid "Enter two valid values."
msgstr "Εισάγετε δύο έγκυρες τιμές."
msgid "The start of the range must not exceed the end of the range."
msgstr "Η αρχή του range δεν πρέπει να ξεπερνά το τέλος του range."
msgid "Enter two whole numbers."
msgstr "Εισάγετε δυο ολόκληρους αριθμούς."
msgid "Enter two numbers."
msgstr "Εισάγετε δυο αριθμούς."
msgid "Enter two valid date/times."
msgstr "Εισάγετε δύο έγκυρες ημερομηνίες/ώρες."
msgid "Enter two valid dates."
msgstr "Εισάγετε δυο έγκυρες ημερομηνίες."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no more than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no more than "
"%(limit_value)d."
msgstr[0] ""
"Η λίστα περιέχει %(show_value)d στοιχείο και δεν πρέπει να περιέχει πάνω από "
"%(limit_value)d."
msgstr[1] ""
"List contains %(show_value)d items, it should contain no more than "
"%(limit_value)d."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no fewer than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no fewer than "
"%(limit_value)d."
msgstr[0] ""
"Η λίστα περιέχει %(show_value)d στοιχεία και δεν πρέπει να περιέχει λιγότερα "
"από %(limit_value)d."
msgstr[1] ""
"Η λίστα περιέχει %(show_value)d στοιχεία και δεν πρέπει να περιέχει λιγότερα "
"από %(limit_value)d."
#, python-format
msgid "Some keys were missing: %(keys)s"
msgstr "Έλειπαν μερικά κλειδιά: %(keys)s"
#, python-format
msgid "Some unknown keys were provided: %(keys)s"
msgstr "Δόθηκαν μέρικά άγνωστα κλειδιά: %(keys)s"
#, python-format
msgid ""
"Ensure that this range is completely less than or equal to %(limit_value)s."
msgstr ""
"Βεβαιωθείτε ότι το range είναι αυστηρά μικρότερο ή ίσο από %(limit_value)s."
#, python-format
msgid ""
"Ensure that this range is completely greater than or equal to "
"%(limit_value)s."
msgstr ""
"Βεβαιωθείτε ότι το range είναι αυστηρά μεγαλύτερο ή ίσο από %(limit_value)s."

View File

@ -0,0 +1,114 @@
# This file is distributed under the same license as the Django package.
#
msgid ""
msgstr ""
"Project-Id-Version: Django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-01-17 02:13-0600\n"
"PO-Revision-Date: 2015-01-18 20:56+0100\n"
"Last-Translator: Django team\n"
"Language-Team: English <en@li.org>\n"
"Language: en\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: contrib/postgres/apps.py:54
msgid "PostgreSQL extensions"
msgstr ""
#: contrib/postgres/fields/array.py:21 contrib/postgres/forms/array.py:17
#: contrib/postgres/forms/array.py:185
#, python-format
msgid "Item %(nth)s in the array did not validate:"
msgstr ""
#: contrib/postgres/fields/array.py:22
msgid "Nested arrays must have the same length."
msgstr ""
#: contrib/postgres/fields/hstore.py:15
msgid "Map of strings to strings/nulls"
msgstr ""
#: contrib/postgres/fields/hstore.py:17
#, python-format
msgid "The value of “%(key)s” is not a string or null."
msgstr ""
#: contrib/postgres/forms/hstore.py:17
msgid "Could not load JSON data."
msgstr ""
#: contrib/postgres/forms/hstore.py:18
msgid "Input must be a JSON dictionary."
msgstr ""
#: contrib/postgres/forms/ranges.py:42
msgid "Enter two valid values."
msgstr ""
#: contrib/postgres/forms/ranges.py:44
msgid "The start of the range must not exceed the end of the range."
msgstr ""
#: contrib/postgres/forms/ranges.py:99
msgid "Enter two whole numbers."
msgstr ""
#: contrib/postgres/forms/ranges.py:105
msgid "Enter two numbers."
msgstr ""
#: contrib/postgres/forms/ranges.py:111
msgid "Enter two valid date/times."
msgstr ""
#: contrib/postgres/forms/ranges.py:117
msgid "Enter two valid dates."
msgstr ""
#: contrib/postgres/validators.py:15
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no more than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no more than "
"%(limit_value)d."
msgstr[0] ""
msgstr[1] ""
#: contrib/postgres/validators.py:25
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no fewer than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no fewer than "
"%(limit_value)d."
msgstr[0] ""
msgstr[1] ""
#: contrib/postgres/validators.py:38
#, python-format
msgid "Some keys were missing: %(keys)s"
msgstr ""
#: contrib/postgres/validators.py:39
#, python-format
msgid "Some unknown keys were provided: %(keys)s"
msgstr ""
#: contrib/postgres/validators.py:81
#, python-format
msgid ""
"Ensure that the upper bound of the range is not greater than %(limit_value)s."
msgstr ""
#: contrib/postgres/validators.py:90
#, python-format
msgid ""
"Ensure that the lower bound of the range is not less than %(limit_value)s."
msgstr ""

View File

@ -0,0 +1,109 @@
# This file is distributed under the same license as the Django package.
#
# Translators:
# Tom Fifield <tom@tomfifield.net>, 2021
msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-11 20:56+0200\n"
"PO-Revision-Date: 2021-04-11 13:16+0000\n"
"Last-Translator: Tom Fifield <tom@tomfifield.net>\n"
"Language-Team: English (Australia) (http://www.transifex.com/django/django/"
"language/en_AU/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: en_AU\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgid "PostgreSQL extensions"
msgstr "PostgreSQL extensions"
#, python-format
msgid "Item %(nth)s in the array did not validate:"
msgstr "Item %(nth)s in the array did not validate:"
msgid "Nested arrays must have the same length."
msgstr "Nested arrays must have the same length."
msgid "Map of strings to strings/nulls"
msgstr "Map of strings to strings/nulls"
#, python-format
msgid "The value of “%(key)s” is not a string or null."
msgstr "The value of “%(key)s” is not a string or null."
msgid "Could not load JSON data."
msgstr "Could not load JSON data."
msgid "Input must be a JSON dictionary."
msgstr "Input must be a JSON dictionary."
msgid "Enter two valid values."
msgstr "Enter two valid values."
msgid "The start of the range must not exceed the end of the range."
msgstr "The start of the range must not exceed the end of the range."
msgid "Enter two whole numbers."
msgstr "Enter two whole numbers."
msgid "Enter two numbers."
msgstr "Enter two numbers."
msgid "Enter two valid date/times."
msgstr "Enter two valid date/times."
msgid "Enter two valid dates."
msgstr "Enter two valid dates."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no more than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no more than "
"%(limit_value)d."
msgstr[0] ""
"List contains %(show_value)d item, it should contain no more than "
"%(limit_value)d."
msgstr[1] ""
"List contains %(show_value)d items, it should contain no more than "
"%(limit_value)d."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no fewer than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no fewer than "
"%(limit_value)d."
msgstr[0] ""
"List contains %(show_value)d item, it should contain no fewer than "
"%(limit_value)d."
msgstr[1] ""
"List contains %(show_value)d items, it should contain no fewer than "
"%(limit_value)d."
#, python-format
msgid "Some keys were missing: %(keys)s"
msgstr "Some keys were missing: %(keys)s"
#, python-format
msgid "Some unknown keys were provided: %(keys)s"
msgstr "Some unknown keys were provided: %(keys)s"
#, python-format
msgid ""
"Ensure that this range is completely less than or equal to %(limit_value)s."
msgstr ""
"Ensure that this range is completely less than or equal to %(limit_value)s."
#, python-format
msgid ""
"Ensure that this range is completely greater than or equal to "
"%(limit_value)s."
msgstr ""
"Ensure that this range is completely greater than or equal to "
"%(limit_value)s."

View File

@ -0,0 +1,109 @@
# This file is distributed under the same license as the Django package.
#
# Translators:
# Baptiste Darthenay <baptiste+transifex@darthenay.fr>, 2015-2017,2019
msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-11 20:56+0200\n"
"PO-Revision-Date: 2020-05-12 20:01+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Esperanto (http://www.transifex.com/django/django/language/"
"eo/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: eo\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgid "PostgreSQL extensions"
msgstr "PostgreSQL kromaĵoj"
#, python-format
msgid "Item %(nth)s in the array did not validate:"
msgstr "Elemento %(nth)s en la tabelo ne estas valida:"
msgid "Nested arrays must have the same length."
msgstr "Ingitaj tabeloj devas havi la saman grandon."
msgid "Map of strings to strings/nulls"
msgstr "Kongruo de signoĉenoj al signoĉenoj/nulvaloroj"
#, python-format
msgid "The value of “%(key)s” is not a string or null."
msgstr ""
msgid "Could not load JSON data."
msgstr "Malsukcesis ŝarĝi la JSON datumojn."
msgid "Input must be a JSON dictionary."
msgstr "La enigo devas esti JSON vortaro."
msgid "Enter two valid values."
msgstr "Enigu du validajn valorojn."
msgid "The start of the range must not exceed the end of the range."
msgstr "La komenco de la intervalo ne devas superi la finon de la intervalo."
msgid "Enter two whole numbers."
msgstr "Enigu du entjeroj."
msgid "Enter two numbers."
msgstr "Enigu du nombroj."
msgid "Enter two valid date/times."
msgstr "Enigu du validajn dato/horojn."
msgid "Enter two valid dates."
msgstr "Enigu du validajn datojn."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no more than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no more than "
"%(limit_value)d."
msgstr[0] ""
"La listo enhavas %(show_value)d eron, kaj ne devas enhavi pli ol "
"%(limit_value)d."
msgstr[1] ""
"La listo enhavas %(show_value)d erojn, kaj ne devas enhavi pli ol "
"%(limit_value)d."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no fewer than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no fewer than "
"%(limit_value)d."
msgstr[0] ""
"La listo enhavas %(show_value)d erojn, kaj devas enhavi pli ol "
"%(limit_value)d."
msgstr[1] ""
"La listo enhavas %(show_value)d erojn, kaj devas enhavi pli ol "
"%(limit_value)d."
#, python-format
msgid "Some keys were missing: %(keys)s"
msgstr "Kelkaj ŝlosiloj mankas: %(keys)s"
#, python-format
msgid "Some unknown keys were provided: %(keys)s"
msgstr "Kelkaj nekonataj ŝlosiloj estis provizitaj: %(keys)s"
#, python-format
msgid ""
"Ensure that this range is completely less than or equal to %(limit_value)s."
msgstr ""
"Bv kontroli, ke la tuta intervalo estas malpli alta aŭ egala al "
"%(limit_value)s."
#, python-format
msgid ""
"Ensure that this range is completely greater than or equal to "
"%(limit_value)s."
msgstr ""
"Bv kontroli, ke la tuta intervalo estas pli alta aŭ egala al %(limit_value)s."

View File

@ -0,0 +1,121 @@
# This file is distributed under the same license as the Django package.
#
# Translators:
# Antoni Aloy <aaloy@apsl.net>, 2015,2017
# e4db27214f7e7544f2022c647b585925_bb0e321, 2015
# Ignacio José Lizarán Rus <ilizaran@gmail.com>, 2019
# Igor Támara <igor@tamarapatino.org>, 2015
# Pablo, 2015
# Uriel Medina <urimeba511@gmail.com>, 2020,2023
# Veronicabh <vero.blazher@gmail.com>, 2015
msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-01-17 02:13-0600\n"
"PO-Revision-Date: 2023-04-19 09:22+0000\n"
"Last-Translator: Uriel Medina <urimeba511@gmail.com>, 2020,2023\n"
"Language-Team: Spanish (http://www.transifex.com/django/django/language/"
"es/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: es\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgid "PostgreSQL extensions"
msgstr "Extensiones de PostgreSQL"
#, python-format
msgid "Item %(nth)s in the array did not validate:"
msgstr "El elemento %(nth)s del arreglo no se pudo validar:"
msgid "Nested arrays must have the same length."
msgstr "Los arreglos anidados deben tener la misma longitud."
msgid "Map of strings to strings/nulls"
msgstr "Mapa de cadenas a cadenas/nulos"
#, python-format
msgid "The value of “%(key)s” is not a string or null."
msgstr "El valor de “%(key)s” no es una cadena ni es nulo."
msgid "Could not load JSON data."
msgstr "No se pududieron cargar los datos JSON."
msgid "Input must be a JSON dictionary."
msgstr "La entrada debe ser un diccionario JSON"
msgid "Enter two valid values."
msgstr "Introduzca dos valores válidos."
msgid "The start of the range must not exceed the end of the range."
msgstr "El comienzo del rango no puede exceder su final."
msgid "Enter two whole numbers."
msgstr "Ingrese dos números enteros."
msgid "Enter two numbers."
msgstr "Ingrese dos números."
msgid "Enter two valid date/times."
msgstr "Ingrese dos fechas/horas válidas."
msgid "Enter two valid dates."
msgstr "Ingrese dos fechas válidas."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no more than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no more than "
"%(limit_value)d."
msgstr[0] ""
"La lista contiene %(show_value)d elemento, no debería contener más de "
"%(limit_value)d."
msgstr[1] ""
"La lista contiene %(show_value)d elementos, no debería contener más de "
"%(limit_value)d."
msgstr[2] ""
"La lista contiene %(show_value)d elementos, no debería contener más de "
"%(limit_value)d."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no fewer than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no fewer than "
"%(limit_value)d."
msgstr[0] ""
"La lista contiene %(show_value)d elemento, no debería contener menos de "
"%(limit_value)d."
msgstr[1] ""
"La lista contiene %(show_value)d elementos, no debería contener menos de "
"%(limit_value)d."
msgstr[2] ""
"La lista contiene %(show_value)d elementos, no debería contener menos de "
"%(limit_value)d."
#, python-format
msgid "Some keys were missing: %(keys)s"
msgstr "Faltan algunas claves: %(keys)s"
#, python-format
msgid "Some unknown keys were provided: %(keys)s"
msgstr "Se facilitaron algunas claves desconocidas: %(keys)s"
#, python-format
msgid ""
"Ensure that the upper bound of the range is not greater than %(limit_value)s."
msgstr ""
"Asegúrese de que el límite superior del rango no sea mayor que "
"%(limit_value)s."
#, python-format
msgid ""
"Ensure that the lower bound of the range is not less than %(limit_value)s."
msgstr ""
"Asegúrese de que el límite inferior del rango no sea inferior a "
"%(limit_value)s."

View File

@ -0,0 +1,108 @@
# This file is distributed under the same license as the Django package.
#
# Translators:
# Ramiro Morales, 2015-2019
msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-11 20:56+0200\n"
"PO-Revision-Date: 2020-05-12 20:01+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Spanish (Argentina) (http://www.transifex.com/django/django/"
"language/es_AR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: es_AR\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgid "PostgreSQL extensions"
msgstr "Extensiones PostgreSQL"
#, python-format
msgid "Item %(nth)s in the array did not validate:"
msgstr "La validación del ítem %(nth)s del arreglo falló:"
msgid "Nested arrays must have the same length."
msgstr "Los arreglos anidados deben ser de la misma longitud."
msgid "Map of strings to strings/nulls"
msgstr "Mapa de cadenas a cadenas/nulos"
#, python-format
msgid "The value of “%(key)s” is not a string or null."
msgstr "El valor de \"%(key)s” no es una cadena o nulo."
msgid "Could not load JSON data."
msgstr "No se han podido cargar los datos JSON."
msgid "Input must be a JSON dictionary."
msgstr "debe ser un diccionario JSON."
msgid "Enter two valid values."
msgstr "Introduzca dos valores válidos."
msgid "The start of the range must not exceed the end of the range."
msgstr "El inicio del rango no debe ser mayor que el fin del rango."
msgid "Enter two whole numbers."
msgstr "Introduzca dos números enteros."
msgid "Enter two numbers."
msgstr "Introduzca dos números."
msgid "Enter two valid date/times."
msgstr "Introduzca dos fechas/horas válidas."
msgid "Enter two valid dates."
msgstr "Introduzca dos fechas válidas."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no more than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no more than "
"%(limit_value)d."
msgstr[0] ""
"La lista contiene %(show_value)d ítem, debe contener no mas de "
"%(limit_value)d."
msgstr[1] ""
"La lista contiene %(show_value)d ítems, debe contener no mas de "
"%(limit_value)d."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no fewer than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no fewer than "
"%(limit_value)d."
msgstr[0] ""
"La lista contiene %(show_value)d ítem, debe contener no mas de "
"%(limit_value)d."
msgstr[1] ""
"La lista contiene %(show_value)d ítems, debe contener no menos de "
"%(limit_value)d."
#, python-format
msgid "Some keys were missing: %(keys)s"
msgstr "No se encontraron algunas llaves: %(keys)s"
#, python-format
msgid "Some unknown keys were provided: %(keys)s"
msgstr "Algunas de las llaves provistas son desconocidas: %(keys)s"
#, python-format
msgid ""
"Ensure that this range is completely less than or equal to %(limit_value)s."
msgstr ""
"Asegúrese de que este rango es completamente menor o igual a %(limit_value)s."
#, python-format
msgid ""
"Ensure that this range is completely greater than or equal to "
"%(limit_value)s."
msgstr ""
"Asegúrese de que este rango es completamente mayor o igual a %(limit_value)s."

View File

@ -0,0 +1,112 @@
# This file is distributed under the same license as the Django package.
#
# Translators:
# Antoni Aloy <aaloy@apsl.net>, 2015
# Ernesto Avilés, 2015
# Igor Támara <igor@tamarapatino.org>, 2015
# Pablo, 2015
# Veronicabh <vero.blazher@gmail.com>, 2015
msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-11 20:56+0200\n"
"PO-Revision-Date: 2020-05-12 20:01+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Spanish (Colombia) (http://www.transifex.com/django/django/"
"language/es_CO/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: es_CO\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgid "PostgreSQL extensions"
msgstr "Extensiones de PostgreSQL"
#, python-format
msgid "Item %(nth)s in the array did not validate:"
msgstr ""
msgid "Nested arrays must have the same length."
msgstr "Los arreglos anidados deben tener la misma longitud."
msgid "Map of strings to strings/nulls"
msgstr ""
#, python-format
msgid "The value of “%(key)s” is not a string or null."
msgstr ""
msgid "Could not load JSON data."
msgstr "No se pududieron cargar los datos JSON."
msgid "Input must be a JSON dictionary."
msgstr ""
msgid "Enter two valid values."
msgstr "Ingrese dos valores válidos."
msgid "The start of the range must not exceed the end of the range."
msgstr "El comienzo del rango no puede exceder su final."
msgid "Enter two whole numbers."
msgstr "Ingrese dos números enteros."
msgid "Enter two numbers."
msgstr "Ingrese dos números."
msgid "Enter two valid date/times."
msgstr "Ingrese dos fechas/horas válidas."
msgid "Enter two valid dates."
msgstr "Ingrese dos fechas válidas."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no more than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no more than "
"%(limit_value)d."
msgstr[0] ""
"La lista contiene %(show_value)d elemento, no debería contener más de "
"%(limit_value)d."
msgstr[1] ""
"La lista contiene %(show_value)d elementos, no debería contener más de "
"%(limit_value)d."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no fewer than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no fewer than "
"%(limit_value)d."
msgstr[0] ""
"La lista contiene %(show_value)d elemento, no debería contener menos de "
"%(limit_value)d."
msgstr[1] ""
"La lista contiene %(show_value)d elementos, no debería contener menos de "
"%(limit_value)d."
#, python-format
msgid "Some keys were missing: %(keys)s"
msgstr "Faltan algunas claves: %(keys)s"
#, python-format
msgid "Some unknown keys were provided: %(keys)s"
msgstr "Se facilitaron algunas claves desconocidas: %(keys)s"
#, python-format
msgid ""
"Ensure that this range is completely less than or equal to %(limit_value)s."
msgstr "Asegúrese de que este rango es menor o igual que %(limit_value)s."
#, python-format
msgid ""
"Ensure that this range is completely greater than or equal to "
"%(limit_value)s."
msgstr ""
"Asegúrese de que este rango es efectivamente mayor o igual que "
"%(limit_value)s."

View File

@ -0,0 +1,98 @@
# This file is distributed under the same license as the Django package.
#
# Translators:
# Alex Dzul <alexexc2@gmail.com>, 2015
msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-11 20:56+0200\n"
"PO-Revision-Date: 2020-05-12 20:01+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Spanish (Mexico) (http://www.transifex.com/django/django/"
"language/es_MX/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: es_MX\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgid "PostgreSQL extensions"
msgstr "Extensiones PostgreSQL"
#, python-format
msgid "Item %(nth)s in the array did not validate:"
msgstr ""
msgid "Nested arrays must have the same length."
msgstr ""
msgid "Map of strings to strings/nulls"
msgstr ""
#, python-format
msgid "The value of “%(key)s” is not a string or null."
msgstr ""
msgid "Could not load JSON data."
msgstr ""
msgid "Input must be a JSON dictionary."
msgstr ""
msgid "Enter two valid values."
msgstr "Ingrese dos valores válidos"
msgid "The start of the range must not exceed the end of the range."
msgstr ""
msgid "Enter two whole numbers."
msgstr ""
msgid "Enter two numbers."
msgstr "Ingrese dos números"
msgid "Enter two valid date/times."
msgstr ""
msgid "Enter two valid dates."
msgstr "Ingrese dos fechas válidas"
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no more than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no more than "
"%(limit_value)d."
msgstr[0] ""
msgstr[1] ""
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no fewer than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no fewer than "
"%(limit_value)d."
msgstr[0] ""
msgstr[1] ""
#, python-format
msgid "Some keys were missing: %(keys)s"
msgstr ""
#, python-format
msgid "Some unknown keys were provided: %(keys)s"
msgstr ""
#, python-format
msgid ""
"Ensure that this range is completely less than or equal to %(limit_value)s."
msgstr ""
#, python-format
msgid ""
"Ensure that this range is completely greater than or equal to "
"%(limit_value)s."
msgstr ""

View File

@ -0,0 +1,111 @@
# This file is distributed under the same license as the Django package.
#
# Translators:
# Martin Pajuste <martinpajuste@gmail.com>, 2015
# Martin Pajuste <martinpajuste@gmail.com>, 2017
# Marti Raudsepp <marti@juffo.org>, 2015-2016
# Ragnar Rebase <rrebase@gmail.com>, 2019
msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-11 20:56+0200\n"
"PO-Revision-Date: 2020-05-12 20:01+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Estonian (http://www.transifex.com/django/django/language/"
"et/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: et\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgid "PostgreSQL extensions"
msgstr "PostgreSQL laiendused"
#, python-format
msgid "Item %(nth)s in the array did not validate:"
msgstr "Element %(nth)s massiivis pole korrektne:"
msgid "Nested arrays must have the same length."
msgstr "Mitmemõõtmelised massiivid peavad olema sama pikad."
msgid "Map of strings to strings/nulls"
msgstr "Teisendus sõnedest sõnedeks/tühjadeks"
#, python-format
msgid "The value of “%(key)s” is not a string or null."
msgstr "Võtme “%(key)s” väärtus ei ole sõne ega tühi."
msgid "Could not load JSON data."
msgstr "Ei saanud laadida JSON andmeid."
msgid "Input must be a JSON dictionary."
msgstr "Sisend peab olema JSON sõnastik."
msgid "Enter two valid values."
msgstr "Sisesta kaks korrektset väärtust."
msgid "The start of the range must not exceed the end of the range."
msgstr "Vahemiku algus ei või olla suurem kui vahemiku lõpp."
msgid "Enter two whole numbers."
msgstr "Sisesta kaks täisarvu."
msgid "Enter two numbers."
msgstr "Sisesta kaks arvu."
msgid "Enter two valid date/times."
msgstr "Sisesta kaks korrektset kuupäeva ja kellaaega."
msgid "Enter two valid dates."
msgstr "Sisesta kaks korrektset kuupäeva."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no more than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no more than "
"%(limit_value)d."
msgstr[0] ""
"Nimekiri sisaldab %(show_value)d elementi, ei tohiks olla rohkem kui "
"%(limit_value)d."
msgstr[1] ""
"Nimekiri sisaldab %(show_value)d elementi, ei tohiks olla rohkem kui "
"%(limit_value)d."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no fewer than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no fewer than "
"%(limit_value)d."
msgstr[0] ""
"Nimekiri sisaldab %(show_value)d elementi, ei tohiks olla vähem kui "
"%(limit_value)d."
msgstr[1] ""
"Nimekiri sisaldab %(show_value)d elementi, ei tohiks olla vähem kui "
"%(limit_value)d."
#, python-format
msgid "Some keys were missing: %(keys)s"
msgstr "Puuduvad võtmeväärtused: %(keys)s"
#, python-format
msgid "Some unknown keys were provided: %(keys)s"
msgstr "Tundmatud võtmeväärtused: %(keys)s"
#, python-format
msgid ""
"Ensure that this range is completely less than or equal to %(limit_value)s."
msgstr ""
"Veendu, et see vahemik on täielikult väiksem või võrdne kui %(limit_value)s."
#, python-format
msgid ""
"Ensure that this range is completely greater than or equal to "
"%(limit_value)s."
msgstr ""
"Veendu, et see vahemik on täielikult suurem või võrdne kui %(limit_value)s."

View File

@ -0,0 +1,108 @@
# This file is distributed under the same license as the Django package.
#
# Translators:
# Eneko Illarramendi <eneko@illarra.com>, 2017-2018
# Urtzi Odriozola <urtzi.odriozola@gmail.com>, 2017,2021
msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-11 20:56+0200\n"
"PO-Revision-Date: 2021-03-18 15:48+0000\n"
"Last-Translator: Urtzi Odriozola <urtzi.odriozola@gmail.com>\n"
"Language-Team: Basque (http://www.transifex.com/django/django/language/eu/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: eu\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgid "PostgreSQL extensions"
msgstr "PostgreSQL hedapenak"
#, python-format
msgid "Item %(nth)s in the array did not validate:"
msgstr "Array-ko %(nth)s elementua ez da balekoa:"
msgid "Nested arrays must have the same length."
msgstr "Array habiaratuek luzera bera izan behar dute."
msgid "Map of strings to strings/nulls"
msgstr "String-etik string/null-era mapa"
#, python-format
msgid "The value of “%(key)s” is not a string or null."
msgstr "”%(key)s”-ren balioa ez da string bat, edo null."
msgid "Could not load JSON data."
msgstr "Ezin izan dira JSON datuak kargatu."
msgid "Input must be a JSON dictionary."
msgstr "Sarrera JSON hiztegi bat izan behar da."
msgid "Enter two valid values."
msgstr "Idatzi bi baleko balio."
msgid "The start of the range must not exceed the end of the range."
msgstr "Tartearen hasierak ezin du amaierako tartearen balioa gainditu."
msgid "Enter two whole numbers."
msgstr "Idatzi bi zenbaki oso."
msgid "Enter two numbers."
msgstr "Idatzi bi zenbaki."
msgid "Enter two valid date/times."
msgstr "Idatzi bi baleko data/ordu."
msgid "Enter two valid dates."
msgstr "Idatzi bi baleko data."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no more than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no more than "
"%(limit_value)d."
msgstr[0] ""
"Zerrendak elementu %(show_value)d du, ez lituzke %(limit_value)dbaino "
"gehiago izan behar."
msgstr[1] ""
"Zerrendak %(show_value)d elementu ditu, ez lituzke %(limit_value)d baino "
"gehiago izan behar."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no fewer than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no fewer than "
"%(limit_value)d."
msgstr[0] ""
"Zerrendak elementu %(show_value)d du, ez lituzke %(limit_value)d baino "
"gutxiago izan behar."
msgstr[1] ""
"Zerrendak %(show_value)d elementu ditu, ez lituzke %(limit_value)d baino "
"gutxiago izan behar."
#, python-format
msgid "Some keys were missing: %(keys)s"
msgstr "Gako batzuk falta dira: %(keys)s"
#, python-format
msgid "Some unknown keys were provided: %(keys)s"
msgstr "Gako ezezagun batzuk eman dira: %(keys)s"
#, python-format
msgid ""
"Ensure that this range is completely less than or equal to %(limit_value)s."
msgstr ""
"Ziurtatu guztiz tarte hau %(limit_value)s baino txikiagoa edo berdina dela."
#, python-format
msgid ""
"Ensure that this range is completely greater than or equal to "
"%(limit_value)s."
msgstr ""
"Ziurtatu guztiz tarte hau %(limit_value)s baino handiagoa edo berdina dela."

View File

@ -0,0 +1,108 @@
# This file is distributed under the same license as the Django package.
#
# Translators:
# Ali Nikneshan <ali@nikneshan.com>, 2015
# MJafar Mashhadi <raindigital2007@gmail.com>, 2018
# Mohammad Hossein Mojtahedi <Mhm5000@gmail.com>, 2016
# Pouya Abbassi, 2016
# rahim agh <rahim.aghareb@gmail.com>, 2020
msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-11 20:56+0200\n"
"PO-Revision-Date: 2020-05-27 09:32+0000\n"
"Last-Translator: rahim agh <rahim.aghareb@gmail.com>\n"
"Language-Team: Persian (http://www.transifex.com/django/django/language/"
"fa/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: fa\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
msgid "PostgreSQL extensions"
msgstr "ملحقات Postgres"
#, python-format
msgid "Item %(nth)s in the array did not validate:"
msgstr "عضو %(nth)sم آرایه معتبر نیست:"
msgid "Nested arrays must have the same length."
msgstr "آرایه های تو در تو باید هم سایز باشند"
msgid "Map of strings to strings/nulls"
msgstr "نگاشتی از رشته به رشته/هیچمقدار"
#, python-format
msgid "The value of “%(key)s” is not a string or null."
msgstr "مقدار \"%(key)s\" یک رشته حرفی یا null نیست."
msgid "Could not load JSON data."
msgstr "امکان بارگزاری داده های JSON نیست."
msgid "Input must be a JSON dictionary."
msgstr "مقدار ورودی باید یک دیکشنری JSON باشد."
msgid "Enter two valid values."
msgstr "دو مقدار معتبر وارد کنید"
msgid "The start of the range must not exceed the end of the range."
msgstr "مقدار شروع بازه باید از پایان کوچکتر باشد"
msgid "Enter two whole numbers."
msgstr "دو عدد کامل وارد کنید"
msgid "Enter two numbers."
msgstr "دو عدد وارد کنید"
msgid "Enter two valid date/times."
msgstr "دو تاریخ/ساعت معتبر وارد کنید"
msgid "Enter two valid dates."
msgstr "دو تاریخ معتبر وارد کنید"
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no more than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no more than "
"%(limit_value)d."
msgstr[0] ""
"لیست شامل %(show_value)d مورد است. ولی باید حداکثر شامل %(limit_value)d مورد "
"باشد."
msgstr[1] ""
"لیست شامل %(show_value)d مورد است. ولی باید حداکثر شامل %(limit_value)d مورد "
"باشد."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no fewer than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no fewer than "
"%(limit_value)d."
msgstr[0] ""
"لیست شامل %(show_value)d است، نباید کمتر از %(limit_value)d را شامل شود."
msgstr[1] ""
"لیست شامل %(show_value)d است، نباید کمتر از %(limit_value)d را شامل شود."
#, python-format
msgid "Some keys were missing: %(keys)s"
msgstr "برخی کلیدها یافت نشدند: %(keys)s"
#, python-format
msgid "Some unknown keys were provided: %(keys)s"
msgstr "برخی کلیدهای ارائه شده ناشناخته‌اند: %(keys)s"
#, python-format
msgid ""
"Ensure that this range is completely less than or equal to %(limit_value)s."
msgstr "اطمیمنان حاصل کنید که این رنج، کوچکتر یا برابر با %(limit_value)s است."
#, python-format
msgid ""
"Ensure that this range is completely greater than or equal to "
"%(limit_value)s."
msgstr "اطمینان حاصل کنید که رنج، بزرگتر یا برابر با %(limit_value)s است."

View File

@ -0,0 +1,110 @@
# This file is distributed under the same license as the Django package.
#
# Translators:
# Aarni Koskela, 2015,2017,2020
msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-11 20:56+0200\n"
"PO-Revision-Date: 2020-12-09 06:30+0000\n"
"Last-Translator: Aarni Koskela\n"
"Language-Team: Finnish (http://www.transifex.com/django/django/language/"
"fi/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: fi\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgid "PostgreSQL extensions"
msgstr "PostgreSQL-laajennukset"
#, python-format
msgid "Item %(nth)s in the array did not validate:"
msgstr "Taulukon %(nth)s alkio ei ole kelvollinen:"
msgid "Nested arrays must have the same length."
msgstr "Sisäkkäisillä taulukoilla tulee olla sama pituus."
msgid "Map of strings to strings/nulls"
msgstr "Kartta merkkijonoista merkkijonoihin tai tyhjiin (null)"
#, python-format
msgid "The value of “%(key)s” is not a string or null."
msgstr "Avaimen \"%(key)s\" arvo ei ole merkkijono tai tyhjä (null)."
msgid "Could not load JSON data."
msgstr "JSON-dataa ei voitu ladata."
msgid "Input must be a JSON dictionary."
msgstr "Syötteen tulee olla JSON-sanakirja."
msgid "Enter two valid values."
msgstr "Anna kaksi oikeaa arvoa."
msgid "The start of the range must not exceed the end of the range."
msgstr "Alueen alku pitää olla pienempi kuin alueen loppu."
msgid "Enter two whole numbers."
msgstr "Anna kaksi kokonaislukua."
msgid "Enter two numbers."
msgstr "Anna kaksi lukua."
msgid "Enter two valid date/times."
msgstr "Anna kaksi oikeaa päivämäärää/kellonaikaa."
msgid "Enter two valid dates."
msgstr "Anna kaksi oikeaa päivämäärää."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no more than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no more than "
"%(limit_value)d."
msgstr[0] ""
"Listassa on %(show_value)d arvo, mutta siinä ei saa olla enempää kuin "
"%(limit_value)d."
msgstr[1] ""
"Listassa on %(show_value)d arvoa, mutta siinä ei saa olla enempää kuin "
"%(limit_value)d."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no fewer than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no fewer than "
"%(limit_value)d."
msgstr[0] ""
"Listassa on %(show_value)d arvo, mutta siinä ei saa olla vähempää kuin "
"%(limit_value)d arvoa."
msgstr[1] ""
"Listassa on %(show_value)d arvoa, mutta siinä ei saa olla vähempää kuin "
"%(limit_value)d."
#, python-format
msgid "Some keys were missing: %(keys)s"
msgstr "Joitain avaimia puuttuu: %(keys)s"
#, python-format
msgid "Some unknown keys were provided: %(keys)s"
msgstr "Tuntemattomia avaimia annettiin: %(keys)s"
#, python-format
msgid ""
"Ensure that this range is completely less than or equal to %(limit_value)s."
msgstr ""
"Tämän alueen tulee olla kokonaisuudessaan yhtäsuuri tai pienempi kuin "
"%(limit_value)s."
#, python-format
msgid ""
"Ensure that this range is completely greater than or equal to "
"%(limit_value)s."
msgstr ""
"Tämän alueen tulee olla kokonaisuudessaan yhtäsuuri tai suurempi kuin "
"%(limit_value)s."

View File

@ -0,0 +1,114 @@
# This file is distributed under the same license as the Django package.
#
# Translators:
# Claude Paroz <claude@2xlibre.net>, 2015-2019,2023
msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-01-17 02:13-0600\n"
"PO-Revision-Date: 2023-04-19 09:22+0000\n"
"Last-Translator: Claude Paroz <claude@2xlibre.net>, 2015-2019,2023\n"
"Language-Team: French (http://www.transifex.com/django/django/language/fr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: fr\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
msgid "PostgreSQL extensions"
msgstr "Extensions PostgreSQL"
#, python-format
msgid "Item %(nth)s in the array did not validate:"
msgstr "L'élément n°%(nth)s du tableau nest pas valide :"
msgid "Nested arrays must have the same length."
msgstr "Les tableaux imbriqués doivent être de même longueur."
msgid "Map of strings to strings/nulls"
msgstr "Correspondances clé/valeur (chaînes ou valeurs nulles)"
#, python-format
msgid "The value of “%(key)s” is not a string or null."
msgstr "La valeur de « %(key)s » nest pas une chaîne, ni une valeur nulle."
msgid "Could not load JSON data."
msgstr "Impossible de charger les données JSON."
msgid "Input must be a JSON dictionary."
msgstr "Le contenu saisi doit être un dictionnaire JSON."
msgid "Enter two valid values."
msgstr "Saisissez deux valeurs valides."
msgid "The start of the range must not exceed the end of the range."
msgstr "Le début de lintervalle ne peut pas dépasser la fin de l'intervalle."
msgid "Enter two whole numbers."
msgstr "Saisissez deux nombres entiers."
msgid "Enter two numbers."
msgstr "Saisissez deux nombres."
msgid "Enter two valid date/times."
msgstr "Saisissez deux dates/heures valides."
msgid "Enter two valid dates."
msgstr "Saisissez deux dates valides."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no more than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no more than "
"%(limit_value)d."
msgstr[0] ""
"La liste contient %(show_value)d élément, mais elle ne devrait pas en "
"contenir plus de %(limit_value)d."
msgstr[1] ""
"La liste contient %(show_value)d éléments, mais elle ne devrait pas en "
"contenir plus de %(limit_value)d."
msgstr[2] ""
"La liste contient %(show_value)d éléments, mais elle ne devrait pas en "
"contenir plus de %(limit_value)d."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no fewer than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no fewer than "
"%(limit_value)d."
msgstr[0] ""
"La liste contient %(show_value)d élément, mais elle doit en contenir au "
"moins %(limit_value)d."
msgstr[1] ""
"La liste contient %(show_value)d éléments, mais elle doit en contenir au "
"moins %(limit_value)d."
msgstr[2] ""
"La liste contient %(show_value)d éléments, mais elle doit en contenir au "
"moins %(limit_value)d."
#, python-format
msgid "Some keys were missing: %(keys)s"
msgstr "Certaines clés sont manquantes : %(keys)s"
#, python-format
msgid "Some unknown keys were provided: %(keys)s"
msgstr "Certaines clés inconnues ont été fournies : %(keys)s"
#, python-format
msgid ""
"Ensure that the upper bound of the range is not greater than %(limit_value)s."
msgstr ""
"Sassure que la limite supérieure de lintervalle nest pas plus grande que "
"%(limit_value)s."
#, python-format
msgid ""
"Ensure that the lower bound of the range is not less than %(limit_value)s."
msgstr ""
"Sassure que la limite inférieure de lintervalle nest pas plus petite que "
"%(limit_value)s."

View File

@ -0,0 +1,125 @@
# This file is distributed under the same license as the Django package.
#
# Translators:
# GunChleoc, 2016-2017
# GunChleoc, 2015
# GunChleoc, 2015
msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-11 20:56+0200\n"
"PO-Revision-Date: 2020-05-12 20:01+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Gaelic, Scottish (http://www.transifex.com/django/django/"
"language/gd/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: gd\n"
"Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : "
"(n > 2 && n < 20) ? 2 : 3;\n"
msgid "PostgreSQL extensions"
msgstr "Leudachain PostgreSQL"
#, python-format
msgid "Item %(nth)s in the array did not validate:"
msgstr "Cha deach le dearbhadh an nì %(nth)s san arraigh:"
msgid "Nested arrays must have the same length."
msgstr "Feumaidh an aon fhaid a bhith aig a h-uile arraigh neadaichte."
msgid "Map of strings to strings/nulls"
msgstr "Mapaichean de shreangan gu sreangan/luachan null"
#, python-format
msgid "The value of “%(key)s” is not a string or null."
msgstr "Chan eil an luach air %(key)s na shreang no null."
msgid "Could not load JSON data."
msgstr "Cha deach leinn dàta JSON a luchdadh."
msgid "Input must be a JSON dictionary."
msgstr "Feumaidh an t-ion-chur a bhith 'na fhaclair JSON."
msgid "Enter two valid values."
msgstr "Cuir a-steach dà luach dligheach."
msgid "The start of the range must not exceed the end of the range."
msgstr "Chan fhaod toiseach na rainse a bith nas motha na deireadh na rainse."
msgid "Enter two whole numbers."
msgstr "Cuir a-steach dà àireamh shlàn."
msgid "Enter two numbers."
msgstr "Cuir a-steach dà àireamh."
msgid "Enter two valid date/times."
msgstr "Cuir a-steach dà cheann-là s àm dligheach."
msgid "Enter two valid dates."
msgstr "Cuir a-steach dà cheann-là dligheach."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no more than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no more than "
"%(limit_value)d."
msgstr[0] ""
"Tha %(show_value)d nì air an liosta ach cha bu chòir corr is %(limit_value)d "
"a bhith oirre."
msgstr[1] ""
"Tha %(show_value)d nì air an liosta ach cha bu chòir corr is %(limit_value)d "
"a bhith oirre."
msgstr[2] ""
"Tha %(show_value)d nithean air an liosta ach cha bu chòir corr is "
"%(limit_value)d a bhith oirre."
msgstr[3] ""
"Tha %(show_value)d nì air an liosta ach cha bu chòir corr is %(limit_value)d "
"a bhith oirre."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no fewer than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no fewer than "
"%(limit_value)d."
msgstr[0] ""
"Tha %(show_value)d nì air an liosta ach cha bu chòir nas lugha na "
"%(limit_value)d a bhith oirre."
msgstr[1] ""
"Tha %(show_value)d nì air an liosta ach cha bu chòir nas lugha na "
"%(limit_value)d a bhith oirre."
msgstr[2] ""
"Tha %(show_value)d nithean air an liosta ach cha bu chòir nas lugha na "
"%(limit_value)d a bhith oirre."
msgstr[3] ""
"Tha %(show_value)d nì air an liosta ach cha bu chòir nas lugha na "
"%(limit_value)d a bhith oirre."
#, python-format
msgid "Some keys were missing: %(keys)s"
msgstr "Bha cuid a dhiuchraichean a dhìth: %(keys)s"
#, python-format
msgid "Some unknown keys were provided: %(keys)s"
msgstr "Chaidh iuchraichean nach aithne dhuinn a shònrachadh: %(keys)s"
#, python-format
msgid ""
"Ensure that this range is completely less than or equal to %(limit_value)s."
msgstr ""
"Dèan cinnteach gu bheil an rainse seo nas lugha na no co-ionnan ri "
"%(limit_value)s air fad."
#, python-format
msgid ""
"Ensure that this range is completely greater than or equal to "
"%(limit_value)s."
msgstr ""
"Dèan cinnteach gu bheil an rainse seo nas motha na no co-ionnan ri "
"%(limit_value)s air fad."

View File

@ -0,0 +1,108 @@
# This file is distributed under the same license as the Django package.
#
# Translators:
# fasouto <fsoutomoure@gmail.com>, 2017
# X Bello <xbello@gmail.com>, 2023
msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-01-17 02:13-0600\n"
"PO-Revision-Date: 2023-04-19 09:22+0000\n"
"Last-Translator: X Bello <xbello@gmail.com>, 2023\n"
"Language-Team: Galician (http://www.transifex.com/django/django/language/"
"gl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: gl\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgid "PostgreSQL extensions"
msgstr "Extensión de PostgreSQL"
#, python-format
msgid "Item %(nth)s in the array did not validate:"
msgstr "O %(nth)s elemento do array non validóu:"
msgid "Nested arrays must have the same length."
msgstr "Os arrais aniñados teñen que ter a mesma lonxitude."
msgid "Map of strings to strings/nulls"
msgstr "Mapeo de strings a strings/nulos"
#, python-format
msgid "The value of “%(key)s” is not a string or null."
msgstr "O valor de “%(key)s” non é un string ou nulo."
msgid "Could not load JSON data."
msgstr "Non se puderon cargar os datos JSON."
msgid "Input must be a JSON dictionary."
msgstr "A entrada ten que ser un diccionario JSON."
msgid "Enter two valid values."
msgstr "Introduza dous valores válidos."
msgid "The start of the range must not exceed the end of the range."
msgstr "O comezo do rango non pode superar o fin do rango."
msgid "Enter two whole numbers."
msgstr "Introduza dous números completos."
msgid "Enter two numbers."
msgstr "Insira dous números."
msgid "Enter two valid date/times."
msgstr "Insira dúas datas/horas válidas."
msgid "Enter two valid dates."
msgstr "Insira dúas datas válidas."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no more than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no more than "
"%(limit_value)d."
msgstr[0] ""
"A lista contén %(show_value)d elemento, non debería conter máis de "
"%(limit_value)d."
msgstr[1] ""
"A lista contén %(show_value)d elementos, non debería conter máis de "
"%(limit_value)d."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no fewer than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no fewer than "
"%(limit_value)d."
msgstr[0] ""
"A lista contén %(show_value)d elemento, non debería conter menos de "
"%(limit_value)d."
msgstr[1] ""
"A lista contén %(show_value)d elementos, non debería conter menos de "
"%(limit_value)d."
#, python-format
msgid "Some keys were missing: %(keys)s"
msgstr "Faltan algunhas chaves: %(keys)s"
#, python-format
msgid "Some unknown keys were provided: %(keys)s"
msgstr "Facilitáronse algunhas chaves descoñecidas: %(keys)s"
#, python-format
msgid ""
"Ensure that the upper bound of the range is not greater than %(limit_value)s."
msgstr ""
"Asegúrese de que o límite superior do rango non é maior que %(limit_value)s."
#, python-format
msgid ""
"Ensure that the lower bound of the range is not less than %(limit_value)s."
msgstr ""
"Asegúrese de que o límite inferior do rango non é menor que %(limit_value)s."

View File

@ -0,0 +1,111 @@
# This file is distributed under the same license as the Django package.
#
# Translators:
# Meir Kriheli <mkriheli@gmail.com>, 2015,2017,2019
# אורי רודברג <uri@speedy.net>, 2020
msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-11 20:56+0200\n"
"PO-Revision-Date: 2020-05-12 20:01+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Hebrew (http://www.transifex.com/django/django/language/he/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: he\n"
"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % "
"1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;\n"
msgid "PostgreSQL extensions"
msgstr "הרחבות PostgreSQL"
#, python-format
msgid "Item %(nth)s in the array did not validate:"
msgstr "פריט %(nth)s במערך לא עבר בדיקת חוקיות: "
msgid "Nested arrays must have the same length."
msgstr "מערכים מקוננים חייבים להיות באותו האורך."
msgid "Map of strings to strings/nulls"
msgstr "מיפוי מחרוזות אל מחרוזות/nulls."
#, python-format
msgid "The value of “%(key)s” is not a string or null."
msgstr "הערך של \"%(key)s\" אינו מחרוזת או null."
msgid "Could not load JSON data."
msgstr "לא ניתן לטעון מידע JSON."
msgid "Input must be a JSON dictionary."
msgstr "הקלט חייב להיות מילון JSON."
msgid "Enter two valid values."
msgstr "נא להזין שני ערכים חוקיים."
msgid "The start of the range must not exceed the end of the range."
msgstr "התחלת טווח אינה יכולה גדולה יותר מסופו."
msgid "Enter two whole numbers."
msgstr "נא להזין שני מספרים שלמים."
msgid "Enter two numbers."
msgstr "נא להזין שני מספרים."
msgid "Enter two valid date/times."
msgstr "נא להזין שני תאריך/שעה חוקיים."
msgid "Enter two valid dates."
msgstr "נא להזין שני תאריכים חוקיים."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no more than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no more than "
"%(limit_value)d."
msgstr[0] ""
"הרשימה מכילה פריט %(show_value)d, עליה להכיל לא יותר מ-%(limit_value)d."
msgstr[1] ""
"הרשימה מכילה %(show_value)d פריטים, עליה להכיל לא יותר מ-%(limit_value)d."
msgstr[2] ""
"הרשימה מכילה %(show_value)d פריטים, עליה להכיל לא יותר מ-%(limit_value)d."
msgstr[3] ""
"הרשימה מכילה %(show_value)d פריטים, עליה להכיל לא יותר מ-%(limit_value)d."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no fewer than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no fewer than "
"%(limit_value)d."
msgstr[0] ""
"הרשימה מכילה פריט %(show_value)d, עליה להכיל לא פחות מ-%(limit_value)d."
msgstr[1] ""
"הרשימה מכילה %(show_value)d פריטים, עליה להכיל לא פחות מ-%(limit_value)d."
msgstr[2] ""
"הרשימה מכילה %(show_value)d פריטים, עליה להכיל לא פחות מ-%(limit_value)d."
msgstr[3] ""
"הרשימה מכילה %(show_value)d פריטים, עליה להכיל לא פחות מ-%(limit_value)d."
#, python-format
msgid "Some keys were missing: %(keys)s"
msgstr "חלק מהמפתחות חסרים: %(keys)s"
#, python-format
msgid "Some unknown keys were provided: %(keys)s"
msgstr "סופקו מספר מפתחות לא ידועים: %(keys)s"
#, python-format
msgid ""
"Ensure that this range is completely less than or equal to %(limit_value)s."
msgstr "יש לוודא שטווח זה קטן מ או שווה ל-%(limit_value)s בשלמותו."
#, python-format
msgid ""
"Ensure that this range is completely greater than or equal to "
"%(limit_value)s."
msgstr "יש לוודא שטווח זה גדול מ או שווה ל-%(limit_value)s בשלמותו."

View File

@ -0,0 +1,102 @@
# This file is distributed under the same license as the Django package.
#
# Translators:
# Filip Cuk <filipcuk2@gmail.com>, 2016
# Mislav Cimperšak <mislav.cimpersak@gmail.com>, 2016
msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-11 20:56+0200\n"
"PO-Revision-Date: 2020-05-12 20:01+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Croatian (http://www.transifex.com/django/django/language/"
"hr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: hr\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"
msgid "PostgreSQL extensions"
msgstr ""
#, python-format
msgid "Item %(nth)s in the array did not validate:"
msgstr ""
msgid "Nested arrays must have the same length."
msgstr ""
msgid "Map of strings to strings/nulls"
msgstr ""
#, python-format
msgid "The value of “%(key)s” is not a string or null."
msgstr ""
msgid "Could not load JSON data."
msgstr "JSON podatci neuspješno učitani."
msgid "Input must be a JSON dictionary."
msgstr ""
msgid "Enter two valid values."
msgstr "Unesite 2 ispravne vrijednosti."
msgid "The start of the range must not exceed the end of the range."
msgstr ""
msgid "Enter two whole numbers."
msgstr "Unesite dva cijela broja."
msgid "Enter two numbers."
msgstr "Unesite dva broja."
msgid "Enter two valid date/times."
msgstr "Unesite dva ispravna datuma/vremena."
msgid "Enter two valid dates."
msgstr "Unesite dva ispravna datuma."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no more than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no more than "
"%(limit_value)d."
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no fewer than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no fewer than "
"%(limit_value)d."
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
#, python-format
msgid "Some keys were missing: %(keys)s"
msgstr ""
#, python-format
msgid "Some unknown keys were provided: %(keys)s"
msgstr ""
#, python-format
msgid ""
"Ensure that this range is completely less than or equal to %(limit_value)s."
msgstr ""
#, python-format
msgid ""
"Ensure that this range is completely greater than or equal to "
"%(limit_value)s."
msgstr ""

View File

@ -0,0 +1,118 @@
# This file is distributed under the same license as the Django package.
#
# Translators:
# Michael Wolf <milupo@sorbzilla.de>, 2016-2019,2023
msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-01-17 02:13-0600\n"
"PO-Revision-Date: 2023-04-19 09:22+0000\n"
"Last-Translator: Michael Wolf <milupo@sorbzilla.de>, 2016-2019,2023\n"
"Language-Team: Upper Sorbian (http://www.transifex.com/django/django/"
"language/hsb/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: hsb\n"
"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || "
"n%100==4 ? 2 : 3);\n"
msgid "PostgreSQL extensions"
msgstr "Rozšěrjenja PostgreSQL"
#, python-format
msgid "Item %(nth)s in the array did not validate:"
msgstr "Zapisk %(nth)s w pólnym wariabli njeje so wokrućił:"
msgid "Nested arrays must have the same length."
msgstr "Zakašćikowane pólne wariable maja samsnu dołhosć."
msgid "Map of strings to strings/nulls"
msgstr "Konwertowanje znamješkowych rjećazkow do znamješkowych rjećazkow/nulow"
#, python-format
msgid "The value of “%(key)s” is not a string or null."
msgstr "Hódnota \" %(key)s\" znamješkowy rjećazk abo null njeje."
msgid "Could not load JSON data."
msgstr "JSON-daty njedachu so začitać."
msgid "Input must be a JSON dictionary."
msgstr "Zapodaće dyrbi JSON-słownik być."
msgid "Enter two valid values."
msgstr "Zapodajće dwě płaćiwej hódnoće."
msgid "The start of the range must not exceed the end of the range."
msgstr "Spočatk wobłuka njesmě kónc wobłuka překročić."
msgid "Enter two whole numbers."
msgstr "Zapodajće dwě cyłej ličbje."
msgid "Enter two numbers."
msgstr "Zapodajće dwě ličbje."
msgid "Enter two valid date/times."
msgstr "Zapódajće dwě płaćiwej datowej/časowej podaći."
msgid "Enter two valid dates."
msgstr "Zapodajće dwě płaćiwej datowej podaći."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no more than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no more than "
"%(limit_value)d."
msgstr[0] ""
"Lisćina %(show_value)d element wobsahuje, wona njeměła wjace hač "
"%(limit_value)d wobsahować."
msgstr[1] ""
"Lisćina %(show_value)d elementaj wobsahuje, wona njeměła wjace hač "
"%(limit_value)d wobsahować."
msgstr[2] ""
"Lisćina %(show_value)d elementy wobsahuje, wona njeměła wjace hač "
"%(limit_value)d wobsahować."
msgstr[3] ""
"Lisćina %(show_value)d elementow wobsahuje, wona njeměła wjace hač "
"%(limit_value)d wobsahować."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no fewer than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no fewer than "
"%(limit_value)d."
msgstr[0] ""
"Lisćina %(show_value)d element wobsahuje, wona njeměła mjenje hač "
"%(limit_value)d wobsahować."
msgstr[1] ""
"Lisćina %(show_value)d elementaj wobsahuje, wona njeměła mjenje hač "
"%(limit_value)d wobsahować."
msgstr[2] ""
"Lisćina %(show_value)d elementy wobsahuje, wona njeměła mjenje hač "
"%(limit_value)d wobsahować."
msgstr[3] ""
"Lisćina %(show_value)d elementow wobsahuje, wona njeměła mjenje hač "
"%(limit_value)d wobsahować."
#, python-format
msgid "Some keys were missing: %(keys)s"
msgstr "Někotre kluče faluje: %(keys)s"
#, python-format
msgid "Some unknown keys were provided: %(keys)s"
msgstr "Někotre njeznate kluče su so podali: %(keys)s"
#, python-format
msgid ""
"Ensure that the upper bound of the range is not greater than %(limit_value)s."
msgstr "Zawěsćće, zo hornja hranica wobłuka njeje wjetša hač %(limit_value)s."
#, python-format
msgid ""
"Ensure that the lower bound of the range is not less than %(limit_value)s."
msgstr "Zawěsćće, zo delnja hranica wobłuka njeje mjeńša hač %(limit_value)s."

View File

@ -0,0 +1,109 @@
# This file is distributed under the same license as the Django package.
#
# Translators:
# Akos Zsolt Hochrein <hoch.akos@gmail.com>, 2018
# András Veres-Szentkirályi, 2016
# Dóra Szendrei <szendrgigi@gmail.com>, 2017
# Istvan Farkas <istvan.farkas@gmail.com>, 2019
# János R, 2017
msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-11 20:56+0200\n"
"PO-Revision-Date: 2020-05-12 20:01+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Hungarian (http://www.transifex.com/django/django/language/"
"hu/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: hu\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgid "PostgreSQL extensions"
msgstr "PostgreSQL kiterjesztések"
#, python-format
msgid "Item %(nth)s in the array did not validate:"
msgstr "A tömb %(nth)s-ik eleme érvénytelen:"
msgid "Nested arrays must have the same length."
msgstr "A belső tömböknek egyforma hosszúaknak kell lenniük."
msgid "Map of strings to strings/nulls"
msgstr "String-string/null leképezés"
#, python-format
msgid "The value of “%(key)s” is not a string or null."
msgstr "A(z) \"%(key)s\" nem karakterlánc, vagy null."
msgid "Could not load JSON data."
msgstr "JSON adat betöltése sikertelen."
msgid "Input must be a JSON dictionary."
msgstr "A bemenetnek JSON szótárnak kell lennie."
msgid "Enter two valid values."
msgstr "Adjon meg két érvényes értéket."
msgid "The start of the range must not exceed the end of the range."
msgstr "A tartomány eleje nem lehet nagyobb a tartomány végénél."
msgid "Enter two whole numbers."
msgstr "Adjon meg két egész számot."
msgid "Enter two numbers."
msgstr "Adjon meg két számot."
msgid "Enter two valid date/times."
msgstr "Adjon meg két érvényes dátumot/időt."
msgid "Enter two valid dates."
msgstr "Adjon meg két érvényes dátumot."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no more than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no more than "
"%(limit_value)d."
msgstr[0] ""
"A lista %(show_value)d elemet tartalmaz, legfeljebb %(limit_value)d lehetne."
msgstr[1] ""
"A lista %(show_value)d elemet tartalmaz, legfeljebb %(limit_value)d lehetne."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no fewer than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no fewer than "
"%(limit_value)d."
msgstr[0] ""
"A lista %(show_value)d elemet tartalmaz, legalább %(limit_value)d kellene."
msgstr[1] ""
"A lista %(show_value)d elemet tartalmaz, legalább %(limit_value)d kellene."
#, python-format
msgid "Some keys were missing: %(keys)s"
msgstr "Néhány kulcs hiányzik: %(keys)s"
#, python-format
msgid "Some unknown keys were provided: %(keys)s"
msgstr "Néhány ismeretlen kulcs érkezett: %(keys)s"
#, python-format
msgid ""
"Ensure that this range is completely less than or equal to %(limit_value)s."
msgstr ""
"Bizonyosodjon meg róla, hogy a tartomány egésze kevesebb mint "
"%(limit_value)s."
#, python-format
msgid ""
"Ensure that this range is completely greater than or equal to "
"%(limit_value)s."
msgstr ""
"Bizonyosodjon meg róla, hogy a tartomány egésze nagyobb mint %(limit_value)s."

View File

@ -0,0 +1,109 @@
# This file is distributed under the same license as the Django package.
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-11 20:56+0200\n"
"PO-Revision-Date: 2020-05-12 20:01+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Armenian (http://www.transifex.com/django/django/language/"
"hy/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: hy\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgid "PostgreSQL extensions"
msgstr "PostgreSQL հավելվածներ"
#, python-format
msgid "Item %(nth)s in the array did not validate:"
msgstr ""
msgid "Nested arrays must have the same length."
msgstr "Ներդրված մասսիվները պետք է ունենան նույն երկարությունը"
msgid "Map of strings to strings/nulls"
msgstr ""
#, python-format
msgid "The value of “%(key)s” is not a string or null."
msgstr ""
msgid "Could not load JSON data."
msgstr "Չհաջողվեց բեռնել JSON տվյալները"
msgid "Input must be a JSON dictionary."
msgstr ""
msgid "Enter two valid values."
msgstr "Մուտքագրեք երկու վավերական արժեք"
msgid "The start of the range must not exceed the end of the range."
msgstr "Ինտերվալի սկիզբը չպետք է գերազանցի նրա ավարտը"
msgid "Enter two whole numbers."
msgstr "Մուտքագրեք երկու ամբողջ թիվ"
msgid "Enter two numbers."
msgstr "Մուտքագրեք երկու թիվ"
msgid "Enter two valid date/times."
msgstr "Մուտքագրեք երկու ճիշտ ամսաթվեր/ժամանակ"
msgid "Enter two valid dates."
msgstr "Մուտքագրեք երկու ճիշտ ամսաթվեր"
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no more than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no more than "
"%(limit_value)d."
msgstr[0] ""
"Ցուցակը պարունակում է %(show_value)d էլեմենտը, բայց այն պետք է պարունակի "
"%(limit_value)d֊ից ոչ ավելի էլեմենտ"
msgstr[1] ""
"Ցուցակը պարունակում է %(show_value)d էլեմենտները, բայց այն պետք է պարունակի "
"%(limit_value)d֊ից ոչ ավելի էլեմենտ"
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no fewer than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no fewer than "
"%(limit_value)d."
msgstr[0] ""
"Ցուցակը պարունակում է %(show_value)d էլեմենտը, բայց այն պետք է պարունակի "
"%(limit_value)d֊ից ոչ պակաս էլեմենտ"
msgstr[1] ""
"Ցուցակը պարունակում է %(show_value)d էլեմենտը, բայց այն պետք է պարունակի "
"%(limit_value)d֊ից ոչ պակաս էլեմենտ"
#, python-format
msgid "Some keys were missing: %(keys)s"
msgstr "Որոշ բանալիներ պակասում են՝ %(keys)s"
#, python-format
msgid "Some unknown keys were provided: %(keys)s"
msgstr "Տրամադրվել են որոշ անհայտ բանալիներ՝ %(keys)s"
#, python-format
msgid ""
"Ensure that this range is completely less than or equal to %(limit_value)s."
msgstr ""
"Համոզվեք, որ տիրույթին պատկանող արժեքները փոքր են, կամ հավասար "
"%(limit_value)s֊ի"
#, python-format
msgid ""
"Ensure that this range is completely greater than or equal to "
"%(limit_value)s."
msgstr ""
"Համոզվեք, որ տիրույթին պատկանող արժեքները մեծ են, կամ հավասար "
"%(limit_value)s֊ի"

View File

@ -0,0 +1,98 @@
# This file is distributed under the same license as the Django package.
#
# Translators:
# Martijn Dekker <mcdutchie@hotmail.com>, 2016
msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-11 20:56+0200\n"
"PO-Revision-Date: 2020-05-12 20:01+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Interlingua (http://www.transifex.com/django/django/language/"
"ia/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ia\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgid "PostgreSQL extensions"
msgstr "Extensiones PostgreSQL"
#, python-format
msgid "Item %(nth)s in the array did not validate:"
msgstr ""
msgid "Nested arrays must have the same length."
msgstr "Arrays annidate debe haber le mesme longitude."
msgid "Map of strings to strings/nulls"
msgstr ""
#, python-format
msgid "The value of “%(key)s” is not a string or null."
msgstr ""
msgid "Could not load JSON data."
msgstr ""
msgid "Input must be a JSON dictionary."
msgstr ""
msgid "Enter two valid values."
msgstr ""
msgid "The start of the range must not exceed the end of the range."
msgstr ""
msgid "Enter two whole numbers."
msgstr ""
msgid "Enter two numbers."
msgstr ""
msgid "Enter two valid date/times."
msgstr ""
msgid "Enter two valid dates."
msgstr ""
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no more than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no more than "
"%(limit_value)d."
msgstr[0] ""
msgstr[1] ""
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no fewer than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no fewer than "
"%(limit_value)d."
msgstr[0] ""
msgstr[1] ""
#, python-format
msgid "Some keys were missing: %(keys)s"
msgstr ""
#, python-format
msgid "Some unknown keys were provided: %(keys)s"
msgstr ""
#, python-format
msgid ""
"Ensure that this range is completely less than or equal to %(limit_value)s."
msgstr ""
#, python-format
msgid ""
"Ensure that this range is completely greater than or equal to "
"%(limit_value)s."
msgstr ""

View File

@ -0,0 +1,109 @@
# This file is distributed under the same license as the Django package.
#
# Translators:
# Fery Setiawan <gembelweb@gmail.com>, 2015-2018
# M Asep Indrayana <me@drayanaindra.com>, 2015
# oon arfiandwi <oon.arfiandwi@gmail.com>, 2016
# rodin <romihardiyanto@gmail.com>, 2016
# sage <laymonage@gmail.com>, 2019
# Sutrisno Efendi <kangfend@gmail.com>, 2015
msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-11 20:56+0200\n"
"PO-Revision-Date: 2020-05-12 20:01+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Indonesian (http://www.transifex.com/django/django/language/"
"id/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: id\n"
"Plural-Forms: nplurals=1; plural=0;\n"
msgid "PostgreSQL extensions"
msgstr "Ekstensi PostgreSQL"
#, python-format
msgid "Item %(nth)s in the array did not validate:"
msgstr "Butir %(nth)s dalam larik tidak tervalidasi:"
msgid "Nested arrays must have the same length."
msgstr "Array bersaran harus mempunyai panjang yang sama."
msgid "Map of strings to strings/nulls"
msgstr "Pemetaan dari string ke string/null"
#, python-format
msgid "The value of “%(key)s” is not a string or null."
msgstr "Nilai dari “%(key)s” bukan sebuah string atau null."
msgid "Could not load JSON data."
msgstr "Tidak dapat memuat data JSON."
msgid "Input must be a JSON dictionary."
msgstr "Masukan harus kamus JSON."
msgid "Enter two valid values."
msgstr "Masukkan dua nilai yang valid."
msgid "The start of the range must not exceed the end of the range."
msgstr "Awal jangkauan harus tidak melebihi akhir jangkauan."
msgid "Enter two whole numbers."
msgstr "Masukkan dua buah bilangan bulat."
msgid "Enter two numbers."
msgstr "Masukkan dua buah bilangan."
msgid "Enter two valid date/times."
msgstr "Masukan dua buah tanggal/waktu."
msgid "Enter two valid dates."
msgstr "Masukan dua buah tanggal yang benar."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no more than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no more than "
"%(limit_value)d."
msgstr[0] ""
"Daftar mengandung %(show_value)d butir, seharusnya mengandung tidak lebih "
"dari %(limit_value)d."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no fewer than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no fewer than "
"%(limit_value)d."
msgstr[0] ""
"Daftar mengandung%(show_value)d butir, seharusnya mengandung tidak kurang "
"dari %(limit_value)d."
#, python-format
msgid "Some keys were missing: %(keys)s"
msgstr "Beberapa kunci hilang: %(keys)s"
#, python-format
msgid "Some unknown keys were provided: %(keys)s"
msgstr "Beberapa kunci yang tidak dikenali diberikan: %(keys)s"
#, python-format
msgid ""
"Ensure that this range is completely less than or equal to %(limit_value)s."
msgstr ""
"Pastikan bahwa jangkauan ini sepenuhnya kurang dari atau sama dengan "
"%(limit_value)s."
#, python-format
msgid ""
"Ensure that this range is completely greater than or equal to "
"%(limit_value)s."
msgstr ""
"Pastikan bahwa jangkauan ini sepenuhnya lebih dari atau sama dengan "
"%(limit_value)s."

View File

@ -0,0 +1,108 @@
# This file is distributed under the same license as the Django package.
#
# Translators:
# Thordur Sigurdsson <thordur@ja.is>, 2016-2019
msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-11 20:56+0200\n"
"PO-Revision-Date: 2020-05-12 20:01+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Icelandic (http://www.transifex.com/django/django/language/"
"is/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: is\n"
"Plural-Forms: nplurals=2; plural=(n % 10 != 1 || n % 100 == 11);\n"
msgid "PostgreSQL extensions"
msgstr "PostgreSQL viðbætur"
#, python-format
msgid "Item %(nth)s in the array did not validate:"
msgstr "Hlutur %(nth)s í listanum er ógildur:"
msgid "Nested arrays must have the same length."
msgstr "Faldaðir (nested) listar verða að vera af sömu lengd."
msgid "Map of strings to strings/nulls"
msgstr "Möppun strengja í strengi/null"
#, python-format
msgid "The value of “%(key)s” is not a string or null."
msgstr "Gildið á \"%(key)s\" er ekki strengur eða null."
msgid "Could not load JSON data."
msgstr "Gat ekki hlaðið inn JSON gögnum."
msgid "Input must be a JSON dictionary."
msgstr "Inntak verður að vera JSON hlutur (dictionary)."
msgid "Enter two valid values."
msgstr "Sláðu inn tvö gild gildi."
msgid "The start of the range must not exceed the end of the range."
msgstr "Upphaf bils má ekki ná yfir endalok bils."
msgid "Enter two whole numbers."
msgstr "Sláðu inn tvær heilar tölur."
msgid "Enter two numbers."
msgstr "Sláðu inn tvær tölur."
msgid "Enter two valid date/times."
msgstr "Sláðu inn tvær gildar dagsetningar ásamt tíma."
msgid "Enter two valid dates."
msgstr "Sláðu inn tvær gildar dagsetningar."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no more than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no more than "
"%(limit_value)d."
msgstr[0] ""
"Listinn inniheldur %(show_value)d hlut, en má ekki innihalda fleiri en "
"%(limit_value)d."
msgstr[1] ""
"Listinn inniheldur %(show_value)d hluti, en má ekki innihalda fleiri en "
"%(limit_value)d."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no fewer than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no fewer than "
"%(limit_value)d."
msgstr[0] ""
"Listinn inniheldur %(show_value)d hlut, en má ekki innihalda færri en "
"%(limit_value)d."
msgstr[1] ""
"Listinn inniheldur %(show_value)d hluti, en má ekki innihalda færri en "
"%(limit_value)d."
#, python-format
msgid "Some keys were missing: %(keys)s"
msgstr "Þessa lykla vantar: %(keys)s"
#, python-format
msgid "Some unknown keys were provided: %(keys)s"
msgstr "Þessir óþekktu lyklar fundust: %(keys)s"
#, python-format
msgid ""
"Ensure that this range is completely less than or equal to %(limit_value)s."
msgstr ""
"Gakktu úr skugga um að þetta bil sé minna eða jafnt og %(limit_value)s."
#, python-format
msgid ""
"Ensure that this range is completely greater than or equal to "
"%(limit_value)s."
msgstr ""
"Gakktu úr skugga um að þetta bil sé stærra eða jafnt og %(limit_value)s."

View File

@ -0,0 +1,122 @@
# This file is distributed under the same license as the Django package.
#
# Translators:
# 0d21a39e384d88c2313b89b5042c04cb, 2017
# Flavio Curella <flavio.curella@gmail.com>, 2016
# Mirco Grillo <mirco.grillomg@gmail.com>, 2018,2020
# palmux <palmux@gmail.com>, 2015
# Paolo Melchiorre <paolo@melchiorre.org>, 2023
# Mattia Procopio <promat85@gmail.com>, 2015
# Stefano Brentegani <sbrentegani@gmail.com>, 2015-2016
msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-01-17 02:13-0600\n"
"PO-Revision-Date: 2023-04-19 09:22+0000\n"
"Last-Translator: Paolo Melchiorre <paolo@melchiorre.org>, 2023\n"
"Language-Team: Italian (http://www.transifex.com/django/django/language/"
"it/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: it\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgid "PostgreSQL extensions"
msgstr "Estensioni per PostgreSQL"
#, python-format
msgid "Item %(nth)s in the array did not validate:"
msgstr "L'elemento %(nth)s dell'array non è stato convalidato:"
msgid "Nested arrays must have the same length."
msgstr "Gli array annidati devono avere la stessa lunghezza."
msgid "Map of strings to strings/nulls"
msgstr "Mappa di stringhe a stringhe/null"
#, python-format
msgid "The value of “%(key)s” is not a string or null."
msgstr "Il valore di \"%(key)s\" non è una stringa o nullo."
msgid "Could not load JSON data."
msgstr "Caricamento dati JSON fallito."
msgid "Input must be a JSON dictionary."
msgstr "L'input deve essere un dizionario JSON."
msgid "Enter two valid values."
msgstr "Inserisci due valori validi."
msgid "The start of the range must not exceed the end of the range."
msgstr ""
"Il valore iniziale dell'intervallo non può essere superiore al valore finale."
msgid "Enter two whole numbers."
msgstr "Inserisci due numeri interi."
msgid "Enter two numbers."
msgstr "Inserisci due numeri."
msgid "Enter two valid date/times."
msgstr "Inserisci due valori data/ora validi."
msgid "Enter two valid dates."
msgstr "Inserisci due date valide."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no more than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no more than "
"%(limit_value)d."
msgstr[0] ""
"La lista contiene %(show_value)d oggetto, non dovrebbe contenerne più di "
"%(limit_value)d."
msgstr[1] ""
"La lista contiene %(show_value)d elementi, e dovrebbe contenerne al massimo "
"%(limit_value)d."
msgstr[2] ""
"La lista contiene %(show_value)d elementi, e dovrebbe contenerne al massimo "
"%(limit_value)d."
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no fewer than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no fewer than "
"%(limit_value)d."
msgstr[0] ""
"La lista contiene %(show_value)d oggetto, non dovrebbe contenerne meno di "
"%(limit_value)d."
msgstr[1] ""
"La lista contiene %(show_value)d oggetti, e dovrebbe contenerne almeno "
"%(limit_value)d."
msgstr[2] ""
"La lista contiene %(show_value)d oggetti, e dovrebbe contenerne almeno "
"%(limit_value)d."
#, python-format
msgid "Some keys were missing: %(keys)s"
msgstr "Alcune chiavi risultano mancanti: %(keys)s"
#, python-format
msgid "Some unknown keys were provided: %(keys)s"
msgstr "Sono state fornite alcune chiavi sconosciute: %(keys)s"
#, python-format
msgid ""
"Ensure that the upper bound of the range is not greater than %(limit_value)s."
msgstr ""
"Assicurarsi che il limite superiore dell'intervallo non sia maggiore di "
"%(limit_value)s."
#, python-format
msgid ""
"Ensure that the lower bound of the range is not less than %(limit_value)s."
msgstr ""
"Assicurarsi che il limite inferiore dell'intervallo non sia inferiore a "
"%(limit_value)s."

View File

@ -0,0 +1,100 @@
# This file is distributed under the same license as the Django package.
#
# Translators:
# Shinya Okano <tokibito@gmail.com>, 2015-2018,2023
# Takuya N <takninnovationresearch@gmail.com>, 2020
msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-01-17 02:13-0600\n"
"PO-Revision-Date: 2023-04-19 09:22+0000\n"
"Last-Translator: Shinya Okano <tokibito@gmail.com>, 2015-2018,2023\n"
"Language-Team: Japanese (http://www.transifex.com/django/django/language/"
"ja/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ja\n"
"Plural-Forms: nplurals=1; plural=0;\n"
msgid "PostgreSQL extensions"
msgstr "PostgreSQL拡張"
#, python-format
msgid "Item %(nth)s in the array did not validate:"
msgstr "配列内のアイテム %(nth)s は検証できませんでした:"
msgid "Nested arrays must have the same length."
msgstr "ネストした配列は同じ長さにしなければなりません。"
msgid "Map of strings to strings/nulls"
msgstr "文字列と文字列/NULLのマップ"
#, python-format
msgid "The value of “%(key)s” is not a string or null."
msgstr "“%(key)s” の値は文字列または NULL ではありません。"
msgid "Could not load JSON data."
msgstr "JSONデータを読み込めませんでした。"
msgid "Input must be a JSON dictionary."
msgstr "JSON辞書を入力しなければなりません。"
msgid "Enter two valid values."
msgstr "2つの値を正しく入力してください。"
msgid "The start of the range must not exceed the end of the range."
msgstr "範囲の開始は、範囲の終わりを超えてはなりません。"
msgid "Enter two whole numbers."
msgstr "2つの整数を入力してください。"
msgid "Enter two numbers."
msgstr "2つの数値を入力してください。"
msgid "Enter two valid date/times."
msgstr "2つの日付/時間を入力してください。"
msgid "Enter two valid dates."
msgstr "2つの日付を入力してください。"
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no more than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no more than "
"%(limit_value)d."
msgstr[0] ""
"リストには%(show_value)d個のアイテムが含まれますが、%(limit_value)d個までしか"
"含められません。"
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no fewer than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no fewer than "
"%(limit_value)d."
msgstr[0] ""
"リストには%(show_value)d個のアイテムが含まれますが、%(limit_value)d個までしか"
"含められません。"
#, python-format
msgid "Some keys were missing: %(keys)s"
msgstr "いくつかのキーが欠落しています: %(keys)s"
#, python-format
msgid "Some unknown keys were provided: %(keys)s"
msgstr "いくつかの不明なキーがあります: %(keys)s"
#, python-format
msgid ""
"Ensure that the upper bound of the range is not greater than %(limit_value)s."
msgstr "範囲の上限が%(limit_value)sを超えないようにしてください。"
#, python-format
msgid ""
"Ensure that the lower bound of the range is not less than %(limit_value)s."
msgstr "範囲の下限が%(limit_value)sより小さくならないようにしてください。"

View File

@ -0,0 +1,98 @@
# This file is distributed under the same license as the Django package.
#
# Translators:
# André Bouatchidzé <a@anbz.net>, 2015
msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-11 20:56+0200\n"
"PO-Revision-Date: 2020-05-12 20:01+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Georgian (http://www.transifex.com/django/django/language/"
"ka/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ka\n"
"Plural-Forms: nplurals=2; plural=(n!=1);\n"
msgid "PostgreSQL extensions"
msgstr "PostgreSQL-ის გაფართოებები"
#, python-format
msgid "Item %(nth)s in the array did not validate:"
msgstr ""
msgid "Nested arrays must have the same length."
msgstr ""
msgid "Map of strings to strings/nulls"
msgstr ""
#, python-format
msgid "The value of “%(key)s” is not a string or null."
msgstr ""
msgid "Could not load JSON data."
msgstr ""
msgid "Input must be a JSON dictionary."
msgstr ""
msgid "Enter two valid values."
msgstr ""
msgid "The start of the range must not exceed the end of the range."
msgstr ""
msgid "Enter two whole numbers."
msgstr "შეიყვანეთ ორი მთელი რიცხვი."
msgid "Enter two numbers."
msgstr "შეიყვანეთ ორი რიცხვი."
msgid "Enter two valid date/times."
msgstr ""
msgid "Enter two valid dates."
msgstr ""
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no more than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no more than "
"%(limit_value)d."
msgstr[0] ""
msgstr[1] ""
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no fewer than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no fewer than "
"%(limit_value)d."
msgstr[0] ""
msgstr[1] ""
#, python-format
msgid "Some keys were missing: %(keys)s"
msgstr ""
#, python-format
msgid "Some unknown keys were provided: %(keys)s"
msgstr ""
#, python-format
msgid ""
"Ensure that this range is completely less than or equal to %(limit_value)s."
msgstr ""
#, python-format
msgid ""
"Ensure that this range is completely greater than or equal to "
"%(limit_value)s."
msgstr ""

View File

@ -0,0 +1,97 @@
# This file is distributed under the same license as the Django package.
#
# Translators:
# Leo Trubach <leotrubach@gmail.com>, 2017
msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-11 20:56+0200\n"
"PO-Revision-Date: 2020-05-12 20:01+0000\n"
"Last-Translator: Transifex Bot <>\n"
"Language-Team: Kazakh (http://www.transifex.com/django/django/language/kk/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: kk\n"
"Plural-Forms: nplurals=2; plural=(n!=1);\n"
msgid "PostgreSQL extensions"
msgstr "PostgreSQL кеңейтулері"
#, python-format
msgid "Item %(nth)s in the array did not validate:"
msgstr ""
msgid "Nested arrays must have the same length."
msgstr "Бір-бірін ішіне салынған ауқымдардың ұзындықтары бірдей болу керек"
msgid "Map of strings to strings/nulls"
msgstr ""
#, python-format
msgid "The value of “%(key)s” is not a string or null."
msgstr ""
msgid "Could not load JSON data."
msgstr ""
msgid "Input must be a JSON dictionary."
msgstr ""
msgid "Enter two valid values."
msgstr ""
msgid "The start of the range must not exceed the end of the range."
msgstr ""
msgid "Enter two whole numbers."
msgstr ""
msgid "Enter two numbers."
msgstr ""
msgid "Enter two valid date/times."
msgstr ""
msgid "Enter two valid dates."
msgstr ""
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no more than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no more than "
"%(limit_value)d."
msgstr[0] ""
msgstr[1] ""
#, python-format
msgid ""
"List contains %(show_value)d item, it should contain no fewer than "
"%(limit_value)d."
msgid_plural ""
"List contains %(show_value)d items, it should contain no fewer than "
"%(limit_value)d."
msgstr[0] ""
msgstr[1] ""
#, python-format
msgid "Some keys were missing: %(keys)s"
msgstr ""
#, python-format
msgid "Some unknown keys were provided: %(keys)s"
msgstr ""
#, python-format
msgid ""
"Ensure that this range is completely less than or equal to %(limit_value)s."
msgstr ""
#, python-format
msgid ""
"Ensure that this range is completely greater than or equal to "
"%(limit_value)s."
msgstr ""

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