如何本地化您的Django应用程式
你是否曾经想过,网站如何能够将内容提供给多种语言,完美地适应不同的文化和地区?这种魔力被称为本地化,它对网站开发来说是一个改变游戏规则的技术——特别是在使用超级灵活的Python框架Django时这不仅仅是简单的翻译
你是否曾经想过网站如何能够以多种语言呈现其内容,完美地适应不同的文化和地区?
那个神奇的技术叫作本地化,对于网络开发来说,它是一个改变游戏规则的技术 —— 尤其是当使用 Django 这个超级多才多艺的 Python 框架时。
这不仅仅是关于文本翻译 —— 它还包括将你的应用程序调整到不同的文化中,以适应其独特的习俗和偏好。所以,今天我要向你介绍如何对 Django 应用进行本地化。让我们开始吧!
前提条件
首先,确保你的机器上已安装了Python。在本教程中,我假设你已经具备了基础的Django知识 —— 我们将快速地过一些部分。
如果你对Django基础还不熟悉,你可能需要先恶补一下。不用担心,Hyperskill,我作为专家在那里工作,为你准备了一些很棒的学习资料。
下面是我们将要讲解的内容:
如何安装 Django
步骤1:创建一个虚拟环境
通常,我们为 Django 项目创建一个虚拟环境。这有助于将项目与计算机上的其他 Python 项目隔离开,并保持项目的依赖关系独立。运行命令 python -m venv myenv
创建一个虚拟环境。
步骤2:激活虚拟环境
在 Unix/macOS 上运行 source myenv/bin/activate
,在 Windows 上运行 myenv\\Scripts\\activate
来激活虚拟环境。
步骤3:安装 Django
在你的虚拟环境激活状态下,使用 Python 包管理器 pip 执行命令 pip install django
来安装 Django。
步骤4:测试 Django 安装
安装完成后,运行 django-admin --version
验证 Django 是否正确安装。它应该输出版本号而不出现任何错误信息。
django-admin 是随 Django 一同提供的命令行脚本,它用于执行一些管理任务,比如启动新项目和处理数据库迁移。
如何创建新的 Django 项目和应用
步骤1:创建 Django 项目
让我们使用命令 django-admin startproject localization_project
来创建一个名为 localization_project 的新项目。
这个命令会创建一个名为 localization_project
的新目录,其中包含我们 Django 项目所需的所有必要文件,如下所示。
要开始工作这个新项目,通过执行命令cd localization_project
进入新创建的文件夹。
第二步:创建一个Django应用
您需要一个包含一些内容的应用程序来展示如何翻译内容。我将使用python manage.py startapp homepage
命令创建一个简单的应用程序。再次提醒,manage.py是另一个命令行实用工具,它作为django-admin的轻量级封装器,让您以各种方式与Django项目进行交互。运行该命令后,应该会得到一个名为homepage的文件夹,其中包含许多Python文件。
第三步:定义应用程序的视图
打开homepage应用程序目录中的views.py
文件,并为首页定义一个视图。为了简单起见,我们的首页将显示一个问候语、一个以千计的数字和当前日期。
from django.shortcuts import renderfrom django.utils import timezonedef home_view(request): context = { 'greeting': "欢迎来到我们的本地化项目!", 'large_number': 12345.67, 'current_date': timezone.now() } return render(request, 'home.html', context)
第四步:配置URL
首先,在localization_project
目录中编辑urls.py
,以包含homepage应用程序的URL。
from django.contrib import adminfrom django.urls import path, includeurlpatterns = [ path('admin/', admin.site.urls), path('', include('homepage.urls')),]
然后,在homepage应用程序目录中创建一个urls.py
文件,并设置您的视图URL。
from django.urls import pathfrom .views import home_viewurlpatterns = [ path('', home_view, name='home'),]
第五步:创建首页模板
在homepage应用程序目录中,创建一个名为templates的文件夹。在其中创建一个名为home.html
的文件。这里是您设计首页的地方。添加以下HTML代码:
<!DOCTYPE html><html><head> <title>本地化项目</title></head><body> <h1>{{ greeting }}</h1> <p>数字:{{ large_number }}</p> <p>日期:{{ current_date }}</p></body></html>
将首页添加到settings.py
文件中的INSTALLED_APPS
列表中,位于localization_project
目录中。
INSTALLED_APPS = [ # '其他应用', 'homepage',]
这应该是您的最终localization_project
目录:
第6步 – 运行开发服务器
最后,您可以通过使用python manage.py runserver
命令来运行您的开发服务器,以查看主页。现在,当您在Web浏览器中访问http://127.0.0.1:8000/时,您应该看到您的简单主页显示欢迎消息、一个数量以千计的数字和当前日期。
如何创建语言切换器
通常,大多数网站在您首次访问时会显示英文内容。
如果您访问过支持本地化的网站,您可能会注意到一个下拉菜单,允许用户选择网站支持的语言。一旦用户选择了首选语言,网站会自动将其设置为默认语言,并相应地更新内容。这个下拉菜单被称为语言切换器,您将在接下来创建它。通过它,您将有一个选项允许用户更改语言并查看本地化功能的实际效果,您将在此之后完成这个功能。
步骤1:添加语言选择表单
首先,修改您的home.html
模板,包括一个用于语言选择的表单。这个表单将包含一个下拉菜单,其中包含英语、西班牙语和法语选项。表单将提交给Django内置的set_language
视图,该视图将处理语言更改。
<!DOCTYPE html><html><head> <title>本地化项目</title></head><body> <h1>{{ greeting }}</h1> <p>数字:{{ large_number }}</p> <p>日期:{{ current_date }}</p> <form action="{% url 'set_language' %}" method="post"> {% csrf_token %} <input name="next" type="hidden" value="{{ redirect_to }}" /> <select name="language"> <option value="en">English</option> <option value="es">Español</option> <option value="fr">Français</option> </select> <input type="submit" value="改变语言"> </form></body></html>
步骤2:更新您的视图
在views.py
中的home_view
函数中,将当前路径包含在上下文中,以便表单知道在更改语言后要重定向到哪里。
from django.utils.translation import gettext as _def home_view(request): context = { 'greeting': _("欢迎来到我们的本地化项目!"), 'large_number': 12345.67, 'current_date': timezone.now(), 'redirect_to': request.path } return render(request, 'home.html', context)
步骤3:配置用于语言更改的URL
确保您的urls.py
在localization_project
目录中设置为处理语言更改。Django提供了一个视图来处理此操作,但您必须在URL配置中进行连接。
from django.contrib import adminfrom django.urls import path, includefrom django.conf.urls.i18n import i18n_patternsurlpatterns = [ path('admin/', admin.site.urls), path('', include('homepage.urls')), path('i18n/', include('django.conf.urls.i18n')),]
国际化 URL 模式包括 set_language
重定向视图。
步骤 4:为区域设置启用中间件
确保在你的 settings.py
中启用了 LocaleMiddleware
。该中间件允许 Django 自动从请求中检测用户的语言偏好。
MIDDLEWARE = [ # '其他中间件', 'django.middleware.locale.LocaleMiddleware',]
步骤 5:运行开发服务器并测试语言切换器
运行你的开发服务器并访问首页。现在,你应该能看到下面的图片,其中包含我们选择的三种语言的语言选择下拉菜单。
如何将应用本地化
本节将向您展示如何根据本地用户的选择翻译我们首页上的文本。
步骤 1:在 Django 设置中启用国际化
在开始之前,请确保你的 Django 项目已经设置为支持国际化。在你的 settings.py
文件中,你需要检查和更新以下设置。以下代码中的前四个设置可能是默认设置。因此,你需要指定你想在应用程序中支持的语言 – 在这种情况下是英语、西班牙语和法语。接下来,定义你的区域目录的路径。这是 Django 存储和查找翻译文件的位置。你需要在项目中手动创建这个目录(与 manage.py
文件相同的目录)。还要记得在文件顶部导入 OS 模块。
LANGUAGE_CODE = 'en-us'TIME_ZONE = 'UTC'USE_I18N = TrueUSE_TZ = TrueLANGUAGES = [ ('en', 'English'), ('es', 'Spanish'), ('fr', 'French'),]LOCALE_PATHS = [os.path.join(BASE_DIR, 'locale')]
步骤 2:标记需要翻译的文本
在使用 Django 开发 Web 应用程序时,必须记住文本、数字和日期在不同语言和文化环境下的本土化方式是不同的。这是因为它们的内容和上下文可能会有很大的变化。
例如,文本字符串在应用程序中使用时需要更加明确地了解其含义和上下文。因此,为了让你的应用程序适用于不同文化的用户,你需要明确标记每个需要翻译的字符串。另一方面,数字和日期是 Django 可以根据区域本地化自动格式化的数据类型。你不需要对它们进行标记。如果你检查我们的应用程序,你会注意到我们从 views.py
文件传递了三个值到 HTML 模板:一个字符串、一个数字和一个日期。虽然不需要对数字和日期进行本地化,但你必须标记字符串以启用其本地化。为此,Django 提供了 gettext
函数。在本地化你的应用程序时,为从视图传递到要本地化的 HTML 模板的任何字符串进行标记。在我们的例子中,我们将使用 _() 来标记问候语文本。
from django.utils.translation import gettext as _from django.shortcuts import renderfrom django.utils import timezonedef home_view(request): context = { 'greeting': _("Welcome to our Localization Project!"), # 其他数据 } return render(request, 'home.html', context)
步骤 3:创建消息文件
使用 makemessages
命令为每种语言创建语言文件。它会扫描你的 Django 项目文件中标记为翻译的字符串,并生成存储翻译的 .po
文件。在命令行工具或终端工具中运行以下命令。
- 对于西班牙语:
django-admin makemessages -l es
- 对于法语:
django-admin makemessages -l fr
这将在 locale/es/LC_MESSAGES
和 locale/fr/LC_MESSAGES
目录下创建 .po
文件。
第四步:翻译消息文件
打开每个 .po
文件,在相应的 msgstr
下添加每个字符串的翻译。例如,在 locale/es/LC_MESSAGES/django.po
中,您可以添加以下内容:
msgid "Welcome to our Localization Project!"msgstr "¡Bienvenido a nuestro Proyecto de Localización!"
然后,在 locale/fr/LC_MESSAGES/django.po
中添加以下文本:
msgid "Welcome to our Localization Project!"msgstr "Bienvenue dans notre Projet de Localisation!"
第五步:编译消息文件
翻译完毕后,将这些文件编译为 .mo
文件,这是 Django 可以使用的机器可读文件。运行 django-admin compilemessages
命令处理项目中的所有 .po
文件,并生成相应的 .mo
文件。
第六步:运行服务器并测试翻译
现在,使用您的网站上的语言切换器测试您的翻译。刷新首页,您应该可以在所选的语言中看到问候语:
如您所见,项目的标题“Welcome to our Localization Project”根据我们选择的语言进行了翻译。您还会注意到数字和日期根据切换的语言自动翻译。但是可以看到,单词 Number 和 Date 没有被翻译。这是因为在之前的步骤中没有将它们标记为需要翻译的内容。每次添加新内容并需要本地化时,只需按照上述步骤进行操作。
首先,标记需要本地化的字符串。然后,运行 makemessages
命令,更新您的 .po
文件以包含这些新字符串。接下来,在 .po
文件中为这些新字符串提供相应的翻译文本。最后,使用 compilemessages
命令生成 .mo
文件。
如何使用{% trans %}
在模板中标记字符串
正如您所知,之前的步骤中数字和日期未被本地化。有趣的是,您不能像使用 views.py
文件中的 gettext
方法一样标记它们。这些是 HTML 模板中的静态文字。要在 Django 模板中本地化文本,您需要使用 Django 提供的 {% trans %}
模板标签。此标签指示 Django 根据当前用户的语言偏好将指定的文本翻译为适当的语言。让我们使用 {% trans %}
模板标签来本地化 Number 和 Date 文本。
步骤1:用{%trans%}
标签更新您的模板
打开您的home.html
模板,并对要翻译的文本周围加上{%trans%}
标签进行修改。下面是一个示例 – 记得在HTML文件顶部添加{%load i18n%}
:
{%load i18n%}<!DOCTYPE html><html><head> <title>{% trans "本地化项目" %}</title></head><body> <h1>{{问候语}}</h1> <p>{% trans "数字" %}:{{large_number}}</p> <p>{% trans "日期" %}:{{current_date}}</p> <!--语言切换器表单--> <!--...--></body></html>
在这个示例中,模板中的“本地化项目”,“数字”和“日期”被标记为需要翻译的词语。
步骤2:创建/更新语言消息文件
运行makemessages
命令来更新每种语言的.po
文件。
- 对于西班牙语:
django-admin makemessages -l es
- 对于法语:
django-admin makemessages -l fr
步骤3:在.po
文件中翻译新的字符串
在每个.po
文件中,您将找到新增的字符串。根据每种语言,在msgstr
下添加翻译。例如,这是西班牙语.po文件的相关内容:
#: .\homepage\templates\home.html:10msgid "数字"msgstr "Número"#: .\homepage\templates\home.html:11msgid "日期"msgstr "Fecha"
接下来,运行django-admin compilemessages
命令来编译消息文件,并运行开发服务器以测试更新的Web应用程序。现在,您可以看到以下输出:
复数形式
Django的框架中的复数形式是一种根据数字值处理不同翻译的方式。这是非常重要的,因为在许多语言中,词语的形式取决于它所描述的数量。
Django提供了使用{%blocktrans%}
模板标签和复数形式处理此问题。我们用我们的Django应用程序来演示这个。假设您想要显示有关访问您的网站的访问者数量的消息,这个数字是动态变化的。
步骤1:更新视图以传递访问者数量
首先,在views.py
中修改你的home_view
,添加一个表示访问者数量的变量。为了演示目的,这个可以是一个静态数字。
from django.shortcuts import render
from django.utils import timezone
from django.utils.translation import gettext as _
def home_view(request):
num_visitors = 5
context = {
'greeting': _("欢迎来到我们的本地化项目!"),
'num_visitors': num_visitors,
}
return render(request, 'home.html', context)
步骤 2:使用复数形式更新模板
在你的 home.html
中,使用 {% blocktrans %}
标签和复数形式来处理复数形式变化,像这样:
<!-- 其他模板内容 -->
{{ greeting }}
{% blocktrans count counter=num_visitors %}
目前有 {{ counter }} 位访客。
{% plural %}
目前有 {{ counter }} 位访客。
{% endblocktrans %}
<!-- 其余模板内容 -->
这里,{% blocktrans count counter=num_visitors %}
用于处理单数情况,{% plural %}
部分用于处理复数情况。
步骤 3:更新消息文件
运行 makemessages
命令,为每种语言更新你的 .po
文件: django-admin makemessages -l es
为西班牙语,django-admin makemessages -l fr
为法语。
步骤 4:翻译并处理 .po
文件中的复数形式
在每个 .po
文件中,你会找到单数和复数形式的条目。
例如,西班牙语 .po 文件应包含以下内容:
msgid "There is %(counter)s visitor."
msgid_plural "There are %(counter)s visitors."
msgstr[0] "Hay %(counter)s visitante."
msgstr[1] "Hay %(counter)s visitantes."
接下来,运行 django-admin compilemessages
命令来编译消息文件。运行你的服务器,你应该能够看到根据访客数量显示单数或复数形式的消息。改变视图中的 num_visitors
数字,观察消息的变化。
结论
这就是一个全面指南,教你如何本地化 Django 应用。借助 Django 的易用设计,你可以轻松地翻译数字和日期时间的值。此外,我们还看到了 Django-admin 命令行如何简化管理翻译文件的过程。
但要记住,本地化网站不仅仅是翻译单词。要充分利用Django的本地化能力,你需要深入研究它的文档,加深你的理解,并不断练习。
感谢您的阅读!我是杰斯,我是Hyperskill的专家。您可以在平台上查看Django课程。
Leave a Reply