例如下面这样,你可以把 英文 翻译成 法文。*我使用的是 Django 4.2.3。
首先,按照下面的方法,在 django-project
目录下创建一个 locale
文件夹。*你可以查看 我的答案 来了解如何设置模板:
django-project
|-core
| |-settings.py
| └-urls.py
|-my_app1
| |-views.py
| |-urls.py
| |-models.py
| |_admin.py
| └-apps.py
|-my_app2
|-templates
| └-index.html
└-locale # Here
然后,将
core/settings.py
设置如下。*
LocaleMiddleware
必须位于
SessionMiddleware
和
CommonMiddleware
之间。
'en-us'
默认设置为
LANGUAGE_CODE
在
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'))
)
并且,Hello
和World
被翻译为gettext()并在控制台上输出,index.html
在my_app1/views.py
的test()
中呈现如下。*您可以查看我的答案,解释何处使用gettext()
和gettext_lazy():
from django.shortcuts import render
from django.utils.translation import gettext as _
def test(request):
print(_("Hello"), _("World"))
return render(request, 'index.html')
而且,在下面所示的
my_app1/urls.py
中,
test()
路径被设置为
urlpatterns
。*您可以查看
我的问题和
我的答案,了解如何在Django中翻译URL:
from django.urls import path
from . import views
app_name = "my_app1"
urlpatterns = [
path('', views.test, name="test")
]
而且,
admin
和
my_app1
路径在
core/urls.py
中使用
i18n_patterns()设置为
urlpatterns
,如下所示。*您可以查看
我的问题和
我的答案来解释
i18n_patterns()
中的
prefix_default_language=False:
from django.contrib import admin
from django.urls import path, include
from django.conf.urls.i18n import i18n_patterns
urlpatterns = i18n_patterns(
path('admin/', admin.site.urls),
path('my_app1/', include('my_app1.urls'))
)
而且,在templates/index.py
中设置了3个标签,如下所示。*在Django模板中进行翻译时,需要使用{% load i18n %}
,并且可以使用{% translate %}
或{% trans %}
进行翻译:
# "templates/index.py"
{% load i18n %}
{% translate "Hello" %} {% trans "World" %}
而且,在
my_app1/models.py
中,
name
字段和
person
模型的翻译如下所示:
from django.db import models
from django.utils.translation import gettext_lazy as _
class Person(models.Model):
first_name = models.CharField(
max_length=20, verbose_name=_("first name")
)
last_name = models.CharField(
max_length=20, verbose_name=_("last name")
)
class Meta:
verbose_name = _('person')
verbose_name_plural = _('persons')
这是我的
my_app1/admin.py
文件的内容:
from django.contrib import admin
from .models import Person
@admin.register(Person)
class PersonAdmin(admin.ModelAdmin):
pass
而且,my_app1
在 my_app1/apps.py
中被翻译如下所示:
from django.apps import AppConfig
from django.utils.translation import gettext_lazy as _
class MyApp1Config(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'my_app1'
verbose_name = _('my_app1')
现在,运行下面的命令。*你可以点击
我的回答来解释下面的命令:
django-admin makemessages -l fr
然后,将
django.po
在
locale/fr/LC_MESSAGES/
中创建如下所示:
django-project
|-core
| |-settings.py
| └-urls.py
|-my_app1
| |-views.py
| |-urls.py
| |-models.py
| |_admin.py
| └-apps.py
|-my_app2
|-templates
| └-index.html
└-locale
└-fr
└-LC_MESSAGES
└-django.po # Here
然后,在
locale/fr/LC_MESSAGES/django.po
中的每个
msgstr ""
分别添加
Bonjour
、
Monde
、
Anglais
和
Français
,如下所示:
# "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\apps.py:7
msgid "my_app1"
msgstr "mon_app1" # Here
#: .\my_app1\models.py:6
msgid "first name"
msgstr "prénom"
#: .\my_app1\models.py:7
msgid "last name"
msgstr "nom de famille"
#: .\my_app1\models.py:13
msgid "person"
msgstr "personne"
#: .\my_app1\models.py:14
msgid "persons"
msgstr "personnes"
#: .\my_app1\views.py:5 .\templates\index.html:3
msgid "Hello"
msgstr "Bonjour" # Here
#: .\my_app1\views.py:5 .\templates\index.html:3
msgid "World"
msgstr "Monde" # Here
...
然后,运行以下命令将
django.po
编译为
django.mo
。*您可以查看
我的答案来了解下面的命令的解释:
django-admin compilemessages
然后,
django.po
在
locale/fr/LC_MESSAGES/
中被编译成
django.mo
,如下所示:
django-project
|-core
| |-settings.py
| └-urls.py
|-my_app1
| |-views.py
| |-urls.py
| |-models.py
| |_admin.py
| └-apps.py
|-my_app2
|-templates
| └-index.html
└-locale
└-fr
└-LC_MESSAGES
|-django.po
└-django.mo # Here
现在,http://localhost:8000/zh/my_app1/
可以如下所示显示 你好,世界
:
![enter image description here](https://istack.dev59.com/rMaT4.webp)
以下是在控制台上输出的代码:
Hello World
。
Hello World
而且,
http://localhost:8000/fr/my_app1/
可以如下所示显示
Bonjour Monde
:
![enter image description here](https://istack.dev59.com/exby0.webp)
并且,在控制台上输出Bonjour Monde
:
Bonjour Monde
而且,
http://localhost:8000/en/admin/my_app1/person/add/
可以显示如下所示的 Django Admin 的英文版本,包括应用程序、模型和字段标签:
![enter image description here](https://istack.dev59.com/kRrzu.webp)
而且,http://localhost:8000/fr/admin/my_app1/person/add/
可以显示Django Admin的法语版本,包括下面所示的应用程序、模型和字段标签:
![enter image description here](https://istack.dev59.com/NeXkj.webp)
此外,您在浏览器中将语言设置为英语,如下所示。*这是
Google Chrome:
![enter image description here](https://istack.dev59.com/nt1tI.webp)
现在,如果您访问
http://localhost:8000/my_app1/
,则会被重定向到下面所示的
http://localhost:8000/en/my_app1/
。
![enter image description here](https://istack.dev59.com/rMaT4.webp)
而且,您将浏览器中的语言设置为第一种语言,如下所示:法语
。
![enter image description here](https://istack.dev59.com/zC76Q.webp)
现在,如果您访问
http://localhost:8000/my_app1/
,那么您将被重定向到下面的地址:
http://localhost:8000/fr/my_app1/
。
![enter image description here](https://istack.dev59.com/exby0.webp)
此外,您可以从
core/urls.py
中的
admin
和
my_app1
路径中删除
i18n_patterns()
,如下所示:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('my_app1/', include('my_app1.urls'))
]
然后,您在浏览器中将
English
设置为第一语言,如下所示:
![enter image description here](https://istack.dev59.com/nt1tI.webp)
现在,http://localhost:8000/my_app1/
可以如下所示显示 Hello World
:
![enter image description here](https://istack.dev59.com/IHzTG.webp)
并且,你在浏览器中将 法语
设置为第一语言,如下所示。
![enter image description here](https://istack.dev59.com/zC76Q.webp)
现在,
http://localhost:8000/my_app1/
可以如下所示显示
Bonjour Monde
:
![enter image description here](https://istack.dev59.com/xWXan.webp)
最后,你可以根据我的回答中的
链接1和
链接2来轻松创建一个用于Django和Django Admin的
i18n切换器。
USE_I18N = True
? - SeitaridisUSE_I18N = True
和USE_L10N = True
- frlanurlpatterns = i18n_patterns(
- petkostas