"""Validators for the contributors app."""
from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _
# ISO 639-1 two-letter codes, shared by the validators and by the languages choice on the forms.
ISO_639_1_CODES = frozenset(
{
"aa",
"ab",
"ae",
"af",
"ak",
"am",
"an",
"ar",
"as",
"av",
"ay",
"az",
"ba",
"be",
"bg",
"bh",
"bi",
"bm",
"bn",
"bo",
"br",
"bs",
"ca",
"ce",
"ch",
"co",
"cr",
"cs",
"cu",
"cv",
"cy",
"da",
"de",
"dv",
"dz",
"ee",
"el",
"en",
"eo",
"es",
"et",
"eu",
"fa",
"ff",
"fi",
"fj",
"fo",
"fr",
"fy",
"ga",
"gd",
"gl",
"gn",
"gu",
"gv",
"ha",
"he",
"hi",
"ho",
"hr",
"ht",
"hu",
"hy",
"hz",
"ia",
"id",
"ie",
"ig",
"ii",
"ik",
"io",
"is",
"it",
"iu",
"ja",
"jv",
"ka",
"kg",
"ki",
"kj",
"kk",
"kl",
"km",
"kn",
"ko",
"kr",
"ks",
"ku",
"kv",
"kw",
"ky",
"la",
"lb",
"lg",
"li",
"ln",
"lo",
"lt",
"lu",
"lv",
"mg",
"mh",
"mi",
"mk",
"ml",
"mn",
"mr",
"ms",
"mt",
"my",
"na",
"nb",
"nd",
"ne",
"ng",
"nl",
"nn",
"no",
"nr",
"nv",
"ny",
"oc",
"oj",
"om",
"or",
"os",
"pa",
"pi",
"pl",
"ps",
"pt",
"qu",
"rm",
"rn",
"ro",
"ru",
"rw",
"sa",
"sc",
"sd",
"se",
"sg",
"si",
"sk",
"sl",
"sm",
"sn",
"so",
"sq",
"sr",
"ss",
"st",
"su",
"sv",
"sw",
"ta",
"te",
"tg",
"th",
"ti",
"tk",
"tl",
"tn",
"to",
"tr",
"ts",
"tt",
"tw",
"ty",
"ug",
"uk",
"ur",
"uz",
"ve",
"vi",
"vo",
"wa",
"wo",
"xh",
"yi",
"yo",
"za",
"zh",
"zu",
}
)
[docs]
def validate_iso_639_1_language_code(value):
"""Validate a two-letter lowercase ISO 639-1 language code such as ``en``.
Args:
value: The code to check.
Raises:
ValidationError: The value is not an ISO 639-1 code.
"""
if value not in ISO_639_1_CODES:
msg = _(
"'%(value)s' is not a valid ISO 639-1 language code. Please use a two-letter code (e.g., 'en', 'es', 'fr')."
)
raise ValidationError(msg, params={"value": value})
[docs]
def validate_iso_639_1_language_codes(value):
"""Validate that every element of a list is an ISO 639-1 language code.
An invalid element raises the ``ValidationError`` of the single-code validator.
Args:
value: The list of codes, or an empty value.
"""
for code in value or []:
validate_iso_639_1_language_code(code)