#34853: [Date Input Localization] Accept-Language Header Takes Precedence Over
Language Set With Cookie
-------------------------------------+-------------------------------------
               Reporter:  blue-      |          Owner:  nobody
  hexagon                            |
                   Type:             |         Status:  new
  Uncategorized                      |
              Component:             |        Version:  4.1
  Internationalization               |       Keywords:  l10n localization
               Severity:  Normal     |  form input
           Triage Stage:             |      Has patch:  0
  Unreviewed                         |
    Needs documentation:  0          |    Needs tests:  0
Patch needs improvement:  0          |  Easy pickings:  0
                  UI/UX:  0          |
-------------------------------------+-------------------------------------
 = Accept-Language Header takes precedence over language set with cookie =

 The input localization follows the browsers locale.

 In the first image below, my browsers locale is 'da' (Danish/Dansk) while
 Django language is en-GB - the form inputs should be localized to en-GB
 and *not* danish!

 In the second image, my browsers locale is 'en-GB' and Django language is
 'da' (Danish) - the form inputs should be localized to danish and not en-
 GB!

 The images clearly shows the error.

 I have provided every relevant piece of information I can think of below
 the images.

 Nowhere in the Django docs, does it mention that form inputs should be
 localized to the browsers locale.

 [[Image(https://i.imgur.com/twLMfDc.png)]]
 [[Image(https://i.imgur.com/HnE2HgC.png)]]

 == Middleware ==
 {{{
 #!python
 MIDDLEWARE = [
     "django.middleware.security.SecurityMiddleware",
     "django.middleware.gzip.GZipMiddleware",
     "django.contrib.sessions.middleware.SessionMiddleware",
     'django.middleware.locale.LocaleMiddleware',
     "django.middleware.common.CommonMiddleware",
     "django.middleware.csrf.CsrfViewMiddleware",
     "django.contrib.auth.middleware.AuthenticationMiddleware",
     "django.contrib.messages.middleware.MessageMiddleware",
     "django.middleware.clickjacking.XFrameOptionsMiddleware",
     "django.middleware.common.BrokenLinkEmailsMiddleware",
 ]
 }}}

 == I18N / L10N ==
 {{{
 #!python
 TIME_ZONE = "UTC"
 LANGUAGE_CODE = "en"
 LANGUAGES = [
     ('en', _('English')),
     ('en-gb', _('English')),
     ('da', _('Danish')),
 ]

 USE_I18N = True
 LANGUAGE_COOKIE_AGE = 31_536_000  # 1 year.

 USE_L10N = True
 USE_THOUSAND_SEPARATOR = True
 USE_TZ = True

 LOCALE_PATHS = [
     BASE_DIR / 'locale/',
 ]
 }}}

 == Loan View ==
 {{{
 #!python
 @login_required(login_url="/accounts/login/")
 def loan_create(request, institution_id: int):
     if request.POST:
         form = LoanForm(request.POST)
         if form.is_valid():
             form.save()
             messages.add_message(request, messages.SUCCESS, _("Loan
 created successfully."))
             return redirect(request.META.get("HTTP_REFERER",
 request.path_info))
         else:
             messages.add_message(request, messages.ERROR, _("An error
 occured."))
             return redirect(request.META.get("HTTP_REFERER",
 request.path_info))
     form = LoanFormCreate(
         institution_id=institution_id,
         initial={
             "staff": request.user.id,
             "reminder_has_been_sent": 0,
             "is_returned": False,
         },
     )
     return render(
         request,
         template_name="crud/loan/create.html",
         context={
             "form": form,
         },
     )
 }}}

 == Modelforms for Loan ==
 {{{
 #!python
 class LoanForm(ModelForm):
     def __init__(self, *args, **kwargs):
         super().__init__(*args, **kwargs)

     class Meta:
         model = Loan
         fields = "__all__"


 class LoanFormBase(ModelForm):
     def __init__(self, *args, **kwargs):
         super().__init__(*args, **kwargs)

     class Meta:
         localized_fields = [
             "borrowed_from_date",
             "borrowed_to_date",
             "deposit"
         ]
         model = Loan
         fields = [
             "id",
             "borrower_user",
             "staff_user",
             "item",
             "borrowed_from_date",
             "borrowed_to_date",
             "reminder_has_been_sent",
             "is_returned",
             "extra_information",
             "deposit",
         ]
         widgets = {
             "id": forms.NumberInput(),
             "staff_user": forms.Select(attrs={"class": "form-control"}),
             "borrower_user": forms.Select(attrs={"class": "form-
 control"}),
             "item": forms.Select(attrs={"class": "form-control", "data-
 live-search": True}),
             "borrowed_from_date": forms.DateInput(
                 attrs={"class": "form-control", "type": "date"},
 format=locale_format
             ),
             "borrowed_to_date": forms.DateInput(attrs={"class": "form-
 control", "type": "date"}),
             "reminder_has_been_sent": forms.NumberInput(attrs={"class":
 "form-control "}),
             "is_returned": forms.CheckboxInput(attrs={"class": "form-
 control"}),
             "extra_information": forms.Textarea(attrs={"class": "form-
 control", "rows": 4}),
             "deposit": forms.TextInput(attrs={"class": "form-control"}),
         }
         labels = {
             "staff_user": _("Lender"),
             "borrower_user": _("Borrower"),
             "item": _("Loaned Asset"),
             "borrowed_from_date": _("Loaned From"),
             "borrowed_to_date": _("Loaned To"),
             "is_returned": _("Returned"),
             "extra_information": _("Comments"),
             "deposit": _("Deposit"),
             "reminder_has_been_sent": _("Reminder Sent"),
         }

         help_texts = {
             "staff_user": _("Select the person responsible for lending the
 asset to the borrower."),
             "borrower_user": _("Select the person who borrowed the
 asset."),
             "item": _("Select the asset that has been loaned out."),
             "borrowed_from_date": _("Pick the date when the asset was
 borrowed."),
             "borrowed_to_date": _("Pick the expected return date for the
 asset."),
             "is_returned": _("Check this box when the asset has been
 returned."),
             "extra_information": _("Add any relevant comments or
 additional information about the loan here."),
             "deposit": _("Enter the deposit amount, if applicable."),
             "reminder_has_been_sent": _("Check if a reminder has been sent
 for this loan."),
         }


 class LoanFormCreate(LoanFormBase):
     def __init__(self, institution_id: int, *args, **kwargs):
         super().__init__(*args, **kwargs)
         # Items shall belong to the institution
         self.fields["item"].queryset =
 Item.objects.filter(item_group__institution_id=institution_id)

         # Borrower users shall belong to the institution
         self.fields["borrower_user"].queryset = User.objects.filter()
         institution_staff_ids =
 StaffInstitution.objects.filter().values_list("staff_id")
         self.fields["staff_user"].queryset =
 User.objects.filter().exclude()

     class Meta(LoanFormBase.Meta):
         localized_fields = [
             "borrowed_from_date",
             "borrowed_to_date",
             "deposit"
         ]
         exclude = ["id", "is_returned"]
         widgets = {
             "extra_information": forms.Textarea(attrs={"class": "form-
 control", "rows": 4}),
             "borrowed_from_date": forms.DateInput(
                 attrs={"class": "form-control", "type": "date"},
             ),
             "borrowed_to_date": forms.DateInput(
                 attrs={"class": "form-control", "type": "date"},
             ),
             "item": forms.Select(
                 attrs={
                     "class": "form-control selectpicker border",
                     "data-live-search": "true",
                     "data-show-subtext": "true",
                     "data-style": "form-control",
                 }
             ),
             "borrower_user": forms.Select(
                 attrs={
                     "class": "form-control selectpicker border",
                     "data-live-search": "true",
                     "data-show-subtext": "true",
                     "data-style": "form-control",
                 }
             ),
             "staff_user": forms.Select(
                 attrs={
                     "class": "form-control selectpicker border ",
                     "data-live-search": "true",
                     "data-show-subtext": "true",
                     "data-style": "form-control",
                     "": "",
                 }
             ),
             "reminder_has_been_sent": forms.NumberInput(attrs={"hidden":
 None}),
         }
 }}}

 == Input Dates in Images from HTML file ==
 {{{
 #!jinja
 {# ---------------------------------------------------- #}
 {# --- Trying out with and without filters and tags --- #}
 {{ form.borrowed_to_date }}
 {{ form.borrowed_to_date|localize }}
 {% localize off %}
 {{ form.borrowed_to_date }}
 {% endlocalize %}
 {% localize on %}
 {{ form.borrowed_to_date }}
 {% endlocalize %}
 {# ---------------------------------------------------- #}
 }}}

-- 
Ticket URL: <https://code.djangoproject.com/ticket/34853>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-updates+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/0107018aae1ca4be-5f481178-5a8c-49d7-aef2-6a9b424e112b-000000%40eu-central-1.amazonses.com.

Reply via email to