diff --git a/src/pretix/base/forms/questions.py b/src/pretix/base/forms/questions.py index 21a89a4679..9fe865fb4a 100644 --- a/src/pretix/base/forms/questions.py +++ b/src/pretix/base/forms/questions.py @@ -9,7 +9,6 @@ import pycountry import pytz import vat_moss.errors import vat_moss.id -from babel import localedata from django import forms from django.contrib import messages from django.core.exceptions import ValidationError @@ -20,14 +19,14 @@ from django.utils.formats import date_format from django.utils.html import escape from django.utils.safestring import mark_safe from django.utils.timezone import get_current_timezone -from django.utils.translation import ( - get_language, gettext_lazy as _, pgettext_lazy, -) +from django.utils.translation import gettext_lazy as _, pgettext_lazy from django_countries import countries from django_countries.fields import Country, CountryField from phonenumber_field.formfields import PhoneNumberField from phonenumber_field.phonenumber import PhoneNumber -from phonenumber_field.widgets import PhoneNumberPrefixWidget +from phonenumber_field.widgets import ( + PhoneNumberPrefixWidget, PhonePrefixSelect, +) from phonenumbers import NumberParseException, national_significant_number from phonenumbers.data import _COUNTRY_CODE_TO_REGION_CODE @@ -35,7 +34,9 @@ from pretix.base.forms.widgets import ( BusinessBooleanRadio, DatePickerWidget, SplitDateTimePickerWidget, TimePickerWidget, UploadedFileWidget, ) -from pretix.base.i18n import get_language_without_region, language +from pretix.base.i18n import ( + get_babel_locale, get_language_without_region, language, +) from pretix.base.models import InvoiceAddress, Question, QuestionOption from pretix.base.models.tax import ( EU_COUNTRIES, cc_to_vat_prefix, is_eu_country, @@ -204,7 +205,18 @@ class NamePartsFormField(forms.MultiValueField): return value +class WrappedPhonePrefixSelect(PhonePrefixSelect): + def __init__(self, *args, **kwargs): + with language(get_babel_locale()): + super().__init__(*args, **kwargs) + + class WrappedPhoneNumberPrefixWidget(PhoneNumberPrefixWidget): + + def __init__(self, attrs=None, initial=None): + widgets = (WrappedPhonePrefixSelect(initial), forms.TextInput()) + super(PhoneNumberPrefixWidget, self).__init__(widgets, attrs) + def render(self, name, value, attrs=None, renderer=None): output = super().render(name, value, attrs, renderer) return mark_safe(self.format_output(output)) @@ -564,13 +576,7 @@ class BaseQuestionsForm(forms.Form): if q.valid_datetime_max: field.validators.append(MaxDateTimeValidator(q.valid_datetime_max)) elif q.type == Question.TYPE_PHONENUMBER: - babel_locale = 'en' - # Babel, and therefore django-phonenumberfield, do not support our custom locales such das de_Informal - if localedata.exists(get_language()): - babel_locale = get_language() - elif localedata.exists(get_language()[:2]): - babel_locale = get_language()[:2] - with language(babel_locale): + with language(get_babel_locale()): default_country = guess_country(event) default_prefix = None for prefix, values in _COUNTRY_CODE_TO_REGION_CODE.items(): diff --git a/src/pretix/base/i18n.py b/src/pretix/base/i18n.py index b1d52e45a2..99ba153b5f 100644 --- a/src/pretix/base/i18n.py +++ b/src/pretix/base/i18n.py @@ -1,5 +1,6 @@ from contextlib import contextmanager +from babel import localedata from django.conf import settings from django.utils import translation from django.utils.formats import date_format, number_format @@ -69,6 +70,16 @@ class LazyNumber: ALLOWED_LANGUAGES = dict(settings.LANGUAGES) +def get_babel_locale(): + babel_locale = 'en' + # Babel, and therefore django-phonenumberfield, do not support our custom locales such das de_Informal + if localedata.exists(translation.get_language()): + babel_locale = translation.get_language() + elif localedata.exists(translation.get_language()[:2]): + babel_locale = translation.get_language()[:2] + return babel_locale + + def get_language_without_region(lng=None): """ Returns the currently active language, but strips what pretix calls a ``region``. For example, diff --git a/src/pretix/presale/forms/checkout.py b/src/pretix/presale/forms/checkout.py index 6a59c52392..b8e5a223e0 100644 --- a/src/pretix/presale/forms/checkout.py +++ b/src/pretix/presale/forms/checkout.py @@ -1,10 +1,9 @@ from itertools import chain -from babel import localedata from django import forms from django.core.exceptions import ValidationError from django.utils.encoding import force_str -from django.utils.translation import get_language, gettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from phonenumber_field.formfields import PhoneNumberField from phonenumber_field.phonenumber import PhoneNumber from phonenumbers import NumberParseException @@ -14,7 +13,7 @@ from pretix.base.forms.questions import ( BaseInvoiceAddressForm, BaseQuestionsForm, WrappedPhoneNumberPrefixWidget, guess_country, ) -from pretix.base.i18n import language +from pretix.base.i18n import get_babel_locale, language from pretix.base.validators import EmailBanlistValidator from pretix.presale.signals import contact_form_fields @@ -39,13 +38,7 @@ class ContactForm(forms.Form): ) if self.event.settings.order_phone_asked: - babel_locale = 'en' - # Babel, and therefore django-phonenumberfield, do not support our custom locales such as de_Informal - if localedata.exists(get_language()): - babel_locale = get_language() - elif localedata.exists(get_language()[:2]): - babel_locale = get_language()[:2] - with language(babel_locale): + with language(get_babel_locale()): default_country = guess_country(self.event) default_prefix = None for prefix, values in _COUNTRY_CODE_TO_REGION_CODE.items():