]
*配置中间件:这是最关键也最容易出错的一步!你必须在 `MIDDLEWARE` 列表里,加入 `'django.middleware.locale.LocaleMiddleware'`。而且它的位置有讲究,必须放在 `SessionMiddleware` 之后,`CommonMiddleware` 之前。放错了位置,语言切换功能可能就完全失效了。
*指定翻译文件的家:通过 `LOCALE_PATHS` 设置一个路径,比如 `(os.path.join(BASE_DIR, 'locale'),)`,这样Django就知道去哪里找你做好的翻译文件了。
完成这些配置,你的Django项目就具备了多语言的基础能力。但这就像给电脑装好了操作系统,里面还没有任何应用程序。
接下来,你需要把网站里所有用户能看到文字——比如按钮上的“提交”、标题里的“欢迎光临”——都标记出来,告诉Django:“喂,这些文字是需要翻译的哦!”
*在Python代码里:你需要从 `django.utils.translation` 导入 `gettext_lazy`(通常简写为 `_`),然后用它来包裹字符串。
例如,在定义数据模型时:
from django.utils.translation import gettext_lazy as _
class Product(models.Model):
name = models.CharField(max_length=100, verbose_name=_('产品名称'))
description = models.TextField(verbose_name=_('产品描述'))
注意,这里用的是 `gettext_lazy` 而不是 `gettext`,尤其是在模型、表单这些地方,用“lazy”(懒加载)版本能避免一些潜在问题。
*在HTML模板里:首先要在模板顶部用 `{% load i18n %}` 加载国际化标签库。然后,对于简单的静态文字,用 `{% trans “文字” %}` 标签;对于包含变量的复杂句子,用 `{% blocktrans %}...{% endblocktrans %}` 标签。
比如:
{% blocktrans with product_name=product.name %}You are viewing: {{ product_name }}{% endblocktrans %}
标记好之后,Django才能知道哪些内容需要被提取出来进行翻译。
现在,你网站里所有需要翻译的文字都已经被标记出来了,就像一堆待分类的原材料。接下来,我们需要把它们收集起来,交给翻译人员(或者你自己)进行加工。
*生成翻译文件:在项目根目录下运行命令 `python manage.py makemessages -l zh_Hans`(这里以简体中文为例)。这个命令会扫描你的代码和模板,把所有被 `_()` 或 `{% trans %}` 包裹的字符串提取出来,生成一个后缀为 `.po` 的文本文件。这个文件通常位于 `locale/zh_Hans/LC_MESSAGES/django.po`。
*进行翻译:用任何文本编辑器打开这个 `.po` 文件,你会看到很多 `msgid`(原始字符串)和 `msgstr`(翻译字符串)的配对。你的工作就是把 `msgstr` 后面的空填上对应的翻译。比如:
msgid “Welcome to Our Store”
msgstr “欢迎来到我们的店铺”
*编译翻译文件:翻译完成后,运行 `python manage.py compilemessages` 命令。这个命令会把人类可读的 `.po` 文件编译成机器效率更高的 `.mo` 文件。Django在运行时读取的就是这个 `.mo` 文件。
到了这里,一个基本的、静态的多语言内容体系就建立起来了。但是,网站是动态的,用户来自世界各地,我们怎么知道该给谁显示哪种语言呢?
这可能是新手最困惑的地方之一。我配置好了,翻译也做了,用户怎么切换?难道要他们自己去改浏览器的设置吗?当然不是,我们可以提供更友好的方式。
Django主要通过以下几种机制来判断和切换语言,优先级从高到低:
1.URL路径前缀:这是最清晰、对搜索引擎最友好的方式。你可以通过配置URL,让不同语言的页面拥有不同的路径。比如,英文站是 `/en/products/`,中文站是 `/zh-hans/products/`。这需要用到Django的 `i18n_patterns` 来定义URL模式。
2.用户会话(Session)或Cookie:你可以在网站上放一个语言选择器,当用户点击“中文”时,将他的选择保存在会话(Session)或Cookie中。Django的 `LocaleMiddleware` 会优先读取这个信息。
3.浏览器语言偏好:如果用户没有主动选择,Django会尝试读取他浏览器发送的 `Accept-Language` 请求头,自动匹配一个你支持的语言。
4.全局默认语言:如果以上都失败了,就 fallback 到你在 `settings.py` 里设置的 `LANGUAGE_CODE`。
所以,一个完整的流程是:用户访问网站 -> Django的中间件按照上述优先级决定使用哪种语言 -> 从对应的 `.mo` 文件中加载翻译好的文本 -> 渲染出最终的页面。
在动手做的过程中,你可能会遇到一些让人抓狂的问题。这里提前给你打个预防针:
*“我的翻译怎么不生效?”:请首先、务必、反复检查 `LocaleMiddleware` 的位置是否正确。这是头号杀手。其次,确保运行了 `compilemessages` 命令,并且 `.mo` 文件生成在了正确的 `LOCALE_PATHS` 路径下。
*“翻译文件是空的?”:运行 `makemessages` 命令没提取到内容?检查你的字符串是否真的被 `_()` 或 `{% trans %}` 正确包裹了。模板里别忘了 `{% load i18n %}`。另外,命令里的语言代码格式要正确,比如简体中文是 `zh_Hans`。
*“动态内容怎么翻译?”:前面说的都是模板和代码里的静态字符串。如果你的产品描述、文章内容这些是从数据库里读出来的动态文本,就需要用到像 `django-modeltranslation` 这样的第三方库,它能帮你为模型的特定字段创建多语言版本。
*不要拼接“延迟翻译”字符串:`gettext_lazy()` 返回的是一个特殊的“代理对象”,不是真正的字符串。如果你用 `_('Hello') + ' ' + _('World')` 这种方式拼接,很可能会出问题。正确做法是翻译整个句子:`_('Hello World')`。
---
说到底,用Django做多语言外贸网站,技术门槛确实有,但绝没有想象中那么高不可攀。它更像是一个流程清晰的手工活:配置开关 -> 标记文本 -> 提取翻译 -> 编译应用 -> 处理切换。对于新手小白而言,最大的障碍可能不是代码,而是对这套流程的陌生感和对未知错误的恐惧。我的观点是,别想着一口吃成胖子,按照步骤一点点来,每完成一步就测试一下。遇到报错别慌,那十有八九是配置顺序或者路径问题,对照文档和教程仔细检查。当你第一次看到自己的网站随着语言切换而变换内容时,那种成就感会让你觉得这一切都值了。外贸的天地很大,用技术为自己打开一扇窗,这事挺酷的。
版权说明:电话:18026290016 (24小时)
📧 业务邮箱:4085008@qq.com
💬 QQ技术售后:4085008 (工单快速响应)
🏢 广州市天河区科韵北路108号三楼
微信扫码添加咨询
销售经理 李经理