Opened 12 months ago

Last modified 3 weeks ago

#35333 assigned Bug

Template tag `unlocalize` does not work with `date` and `time` filters.

Reported by: Natalia Bidart Owned by: Ahmed Nassar
Component: Template system Version: dev
Severity: Normal Keywords:
Cc: Triage Stage: Accepted
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no
Pull Requests:18021 build:success

Description

Following #35306, it was noticed that using the date or time template filters would not honor the unlocalize template tag. See regression tests:

  • TabularUnified tests/i18n/tests.py

    diff --git a/tests/i18n/tests.py b/tests/i18n/tests.py
    index 355505a10d..90cf4630bf 100644
    a b class FormattingTests(SimpleTestCase):  
    13511351                self.assertEqual(template2.render(context), output2)
    13521352                self.assertEqual(template3.render(context), output3)
    13531353
     1354    def test_unlocalize_honor_date_settings(self):
     1355        filter_template = Template(
     1356            "{% load l10n %}Localized: {{ my_value }}. "
     1357            "Unlocalized: {{ my_value|unlocalize }}."
     1358        )
     1359        tag_template = Template(
     1360            "{% load l10n %}Localized: {{ my_value }}. {% localize off %}"
     1361            "Unlocalized: {{ my_value }}{% endlocalize %}."
     1362        )
     1363        filter_inside_unlocalize = Template(
     1364            "{% load l10n %}Localized: {{ my_value|date }}. {% localize off %}"
     1365            "Unlocalized: {{ my_value|date:'DATE_FORMAT' }}{% endlocalize %}."
     1366        )
     1367        context = Context({"my_value": datetime.date(2024, 12, 15)})
     1368        expected_result = "Localized: 15. Dezember 2024. Unlocalized: 15-12-2024."
     1369        for case in (filter_template, tag_template, filter_inside_unlocalize):
     1370            with (
     1371                self.subTest(case=str(case)),
     1372                translation.override("de", deactivate=True),
     1373                self.settings(DATE_FORMAT="j-m-Y"),
     1374            ):
     1375                self.assertEqual(case.render(context), expected_result)
     1376
     1377    def test_unlocalize_honor_time_settings(self):
     1378        filter_template = Template(
     1379            "{% load l10n %}Localized: {{ my_value }}. "
     1380            "Unlocalized: {{ my_value|unlocalize }}."
     1381        )
     1382        tag_template = Template(
     1383            "{% load l10n %}Localized: {{ my_value }}. {% localize off %}"
     1384            "Unlocalized: {{ my_value }}{% endlocalize %}."
     1385        )
     1386        filter_inside_unlocalize = Template(
     1387            "{% load l10n %}Localized: {{ my_value|time }}. {% localize off %}"
     1388            "Unlocalized: {{ my_value|time }}{% endlocalize %}."
     1389        )
     1390        context = Context({"my_value": datetime.time(1, 2, 3)})
     1391        expected_result = "Localized: 01:02. Unlocalized: 01h 02m."
     1392        for case in (filter_template, tag_template, filter_inside_unlocalize):
     1393            with (
     1394                self.subTest(case=str(case)),
     1395                translation.override("de", deactivate=True),
     1396                self.settings(TIME_FORMAT="H\\h i\\m"),
     1397            ):
     1398                self.assertEqual(case.render(context), expected_result)
     1399
    13541400    def test_localized_off_numbers(self):
    13551401        """A string representation is returned for unlocalized numbers."""
    13561402        template = Template(

According to the ticket's flags, the next step(s) to move this issue forward are:

  • To provide a patch by sending a pull request. Claim the ticket when you start working so that someone else doesn't duplicate effort. Before sending a pull request, review your work against the patch review checklist. Check the "Has patch" flag on the ticket after sending a pull request and include a link to the pull request in the ticket comment when making that update. The usual format is: [https://github.com/django/django/pull/#### PR].

Change History (4)

comment:1 by Claude Paroz, 12 months ago

I'm not yet sure if this can be resolved in the code, or if we should rather complement the template filter docs, telling that if you apply an l10n-sensible filter inside an unlocalized section, you should specify an explicit format argument. The problem being that the way filters are currently implemented, it's not possible to transmit any context. That explains for example that floatformat gained an u parameter to force unlocalization (see #30086).

So in your example in the tests above, you should use |date:settings.DATE_FORMAT and not just DATE_FORMAT. Thoughts?

comment:2 by Claude Paroz, 11 months ago

Owner: Claude Paroz removed
Status: assignednew

comment:3 by Ahmed Nassar, 3 weeks ago

Owner: set to Ahmed Nassar
Status: newassigned

comment:4 by Ahmed Nassar, 3 weeks ago

I'd like to work on this issue if it's still available. Could you confirm if it's unassigned? If so, I will start by reviewing the expected behavior and checking the existing implementation of date and time filters.

Looking forward to contributing!

Note: See TracTickets for help on using tickets.
Back to Top