0

This is my django-project below to translate from English to French. *I use Django 4.2.1:

django-project
 |-core
 |  |-settings.py
 |  └-urls.py
 |-my_app1
 |  |-views.py
 |  └-urls.py
 |-my_app2
 └-locale
    └-fr
       └-LC_MESSAGES
          |-django.po
          └-django.mo

And, this is core/settings.py below:

# "core/settings.py"

MIDDLEWARE = [
    ...
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.common.CommonMiddleware',
    ...
]

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_TZ = True

from django.utils.translation import gettext_lazy as _

LANGUAGES = (
    ('en', _('English')),
    ('fr', _('French'))
)

And, gettext() is used to translate Test to Examen in my_app1/views.py as shown below:

# "my_app1/views.py"

from django.shortcuts import render
from django.utils.translation import gettext as _

def test(request):     # ↓ Here ↓
    return HttpResponse(_("Test"))

And, hello/world/ path for test() is set to urlpatterns in my_app1/urls.py as shown below:

# "my_app1/urls.py"

from django.urls import path
from . import views

app_name = "my_app1"

urlpatterns = [
        # ↓ ↓ Here ↓ ↓
    path("hello/world/", views.test, name="test")
]

And, my_app1/ path for my_app1 is set to urlpatterns with i18n_patterns() as shown below:

# "core/urls.py"

from django.urls import path, include
from django.conf.urls.i18n import i18n_patterns

urlpatterns = i18n_patterns(
        # ↓ Here ↓
    path("my_app1/", include('my_app1.urls'))
)

And, "Anglais", "Français" and "Examen" are set for "English", "French" and "Test" respectively in locale/fr/LC_MESSAGES/django.po as shown below:

# "locale/fr/LC_MESSAGES/django.po"

...

#: .\core\settings.py:140
msgid "English"
msgstr "Anglais" # Here

#: .\core\settings.py:141
msgid "French"
msgstr "Français" # Here

#: .\my_app1\views.py:5
msgid "Test"
msgstr "Examen" # Here

...

Then, I could translate from English to French as shown below:

http://localhost:8000/fr/my_app1/hello/world/

enter image description here

Now, how can I translate the English url above to the French url below?

http://localhost:8000/fr/mon_app1/bonjour/monde/
Super Kai - Kazuya Ito
  • 22,221
  • 10
  • 124
  • 129

1 Answers1

0

You should use gettext_lazy() and replace "hello/world/" with _("hello/world/") as shown below. *For the path, gettext_lazy() works but gettext() doesn't work and you can see my answer explaining how to translate in Django in detail:

# "my_app1/urls.py"

from django.urls import path
from . import views
from django.utils.translation import gettext_lazy as _ # Here

app_name = "my_app1"

urlpatterns = [
        # ↓ ↓ ↓ Here ↓ ↓ ↓
    path(_("hello/world/"), views.test, name="test")
    # path("hello/world/", views.test, name="test")
]

Then, use gettext_lazy() and replace "my_app1/" with _("my_app1/") as shown below:

# "core/urls.py"

from django.urls import path, include
from django.conf.urls.i18n import i18n_patterns
from django.utils.translation import gettext_lazy as _ # Here

urlpatterns = i18n_patterns(
        # ↓ ↓ Here ↓ ↓
    path(_("my_app1/"), include('my_app1.urls'))
    # path("my_app1/", include('my_app1.urls'))
)

Then, run the command below:

django-admin makemessages -l fr

Then, add "mon_app1/" and "bonjour/monde/" for "my_app1/" and "hello/world/" respectively as shown below:

# "locale/fr/LC_MESSAGES/django.po"

...

#: .\core\settings.py:140
msgid "English"
msgstr "Anglais"

#: .\core\settings.py:141
msgid "French"
msgstr "Français"

#: .\core\urls.py:20
msgid "my_app1/"
msgstr "mon_app1/" # Here

#: .\my_app1\urls.py:8
msgid "hello/world/"
msgstr "bonjour/monde/" # Here

#: .\my_app1\views.py:5
msgid "Test"
msgstr "Examen"

...

Then, run the command below:

django-admin compilemessages

Now, you can translate the English url to the French url as shown below:

http://localhost:8000/fr/mon_app1/bonjour/monde/

enter image description here

In addition, I don't know how to translate the url in Django Admin so I asked the question about it.

Super Kai - Kazuya Ito
  • 22,221
  • 10
  • 124
  • 129