news 2026/4/18 7:56:07

python在Django中切换语言,中英文两种语言怎样切换

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
python在Django中切换语言,中英文两种语言怎样切换

你想要在 Django 项目中实现中英文两种语言的切换功能,需要从基础配置、翻译文件创建、模板 / 代码翻译,到前端切换按钮实现的完整流程。以下是适配 Django 4.x/5.x 版本的详细步骤,兼顾配置和实际使用场景:


一、核心实现思路

Django 的国际化(i18n)和本地化(l10n)功能是语言切换的基础,核心逻辑是:

  1. 配置项目支持多语言,指定中英两种语言;
  2. 创建翻译文件(.po/.mo),存储中英文对照文本;
  3. 在模板 / 代码中使用翻译标签 / 函数,动态加载对应语言文本;
  4. 实现语言切换逻辑(通过表单 / URL 参数),修改用户会话的语言配置。

二、具体实现步骤

步骤 1:基础配置(settings.py)

这是多语言功能的核心配置,需修改settings.py开启国际化并指定语言参数:

python

# settings.py import os BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # 1. 开启国际化(必须) USE_I18N = True # 启用国际化 USE_L10N = True # 启用本地化(日期/数字格式等) # 2. 指定支持的语言(仅保留中英) LANGUAGES = [ ('zh-hans', '简体中文'), # 中文代码:zh-hans(简体),zh-hant(繁体) ('en', 'English'), # 英文代码:en ] # 3. 默认语言(项目启动时的默认语言) LANGUAGE_CODE = 'zh-hans' # 默认中文,可改为'en' # 4. 翻译文件存储路径(关键!需手动创建locale文件夹) LOCALE_PATHS = [ os.path.join(BASE_DIR, 'locale'), # 项目根目录下的locale文件夹 ] # 5. 配置中间件(关键!LocaleMiddleware必须在指定位置) MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', # 先有会话,才能存储语言 'django.middleware.locale.LocaleMiddleware', # 语言中间件(位置:Session之后,Common之前) 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ]
关键说明:
  • LOCALE_PATHS:指定翻译文件的存储目录,需手动在项目根目录创建locale文件夹;
  • LocaleMiddleware:作用是检测用户的语言偏好(会话 / COOKIE / 请求头),并加载对应翻译,位置必须在SessionMiddleware之后、CommonMiddleware之前
  • LANGUAGES:仅列出需要支持的语言,前端切换时只能选择这里配置的语言。

步骤 2:创建翻译文件(.po/.mo)

翻译文件是存储 “原文 - 译文” 的核心,需通过 Django 命令生成并编辑:

步骤 2.1:创建 locale 目录

在项目根目录执行:

bash

mkdir locale # 对应settings.py中LOCALE_PATHS的路径
步骤 2.2:生成翻译模板文件(.po)
  • 生成英文翻译文件:

    bash

    运行

    # 进入项目根目录,执行以下命令(-l 指定语言代码) django-admin makemessages -l en
  • 生成中文翻译文件(若默认语言不是中文,需手动生成):

    bash

    django-admin makemessages -l zh-hans

执行后,会在locale目录下生成如下结构:

plaintext

locale/ ├── en/ │ └── LC_MESSAGES/ │ └── django.po # 英文翻译文件 └── zh-hans/ └── LC_MESSAGES/ └── django.po # 中文翻译文件
步骤 2.3:编辑翻译文件(.po)

打开locale/en/LC_MESSAGES/django.po(英文翻译文件),添加需要翻译的文本:

po

# django.po msgid "Welcome to our website" # 原文(模板/代码中使用的标识) msgstr "欢迎访问我们的网站" # 译文(英文环境下显示的文本) msgid "File Upload" msgstr "文件上传" msgid "Language" msgstr "语言"

打开locale/zh-hans/LC_MESSAGES/django.po(中文翻译文件),对应添加:

po

# django.po msgid "Welcome to our website" msgstr "欢迎访问我们的网站" msgid "File Upload" msgstr "文件上传" msgid "Language" msgstr "语言"
步骤 2.4:编译翻译文件(.mo)

编辑完.po文件后,需编译为二进制.mo文件(Django 实际加载的是这个文件):

bash

django-admin compilemessages

编译后,locale/[语言]/LC_MESSAGES/下会生成django.mo文件,翻译生效。

步骤 3:在模板中使用翻译(前端文本)

在 HTML 模板中加载翻译标签,使用{% trans %}{% blocktrans %}渲染多语言文本:

步骤 3.1:模板头部加载 i18n 标签

html

预览

<!-- templates/base.html --> {% load i18n %} <!-- 必须加载i18n标签 --> <!DOCTYPE html> <html lang="{{ LANGUAGE_CODE }}"> <!-- 动态设置页面语言 --> <head> <meta charset="UTF-8"> <title>{% trans "Website Title" %}</title> </head> <body> <!-- 简单文本翻译 --> <h1>{% trans "Welcome to our website" %}</h1> <!-- 带变量的翻译(用blocktrans) --> {% blocktrans with username=request.user.username %} Hello {{ username }}, welcome back! {% endblocktrans %} <!-- 语言切换表单(核心!) --> <form action="{% url 'set_language' %}" method="post"> {% csrf_token %} <input name="next" type="hidden" value="{{ request.path }}"> <!-- 切换后返回当前页面 --> <select name="language" onchange="this.form.submit()"> {% get_current_language as LANGUAGE_CODE %} {% get_available_languages as LANGUAGES %} {% get_language_info_list for LANGUAGES as languages %} {% for lang in languages %} <option value="{{ lang.code }}" {% if lang.code == LANGUAGE_CODE %}selected{% endif %}> {{ lang.name_local }} <!-- 显示语言的本地名称(如“简体中文”/“English”) --> </option> {% endfor %} </select> </form> </body> </html>
关键说明:
  • {% trans "文本" %}:用于无变量的简单文本翻译;
  • {% blocktrans %}:用于带变量的复杂文本翻译;
  • set_language:Django 内置的语言切换视图(无需自己写),接收language参数并修改会话语言。

步骤 4:配置语言切换路由

Django 内置了set_language视图,只需在urls.py中配置路由:

python

# 项目根urls.py from django.contrib import admin from django.urls import path, include from django.conf.urls.i18n import i18n_patterns # 可选:带语言前缀的URL urlpatterns = [ path('admin/', admin.site.urls), # 配置内置的语言切换视图(必须) path('i18n/', include('django.conf.urls.i18n')), ] # 可选:为URL添加语言前缀(如/zh-hans/upload/、/en/upload/) urlpatterns += i18n_patterns( # 你的业务路由,比如文件上传路由 path('upload/', include('app.urls')), )
关键说明:
  • path('i18n/', include('django.conf.urls.i18n')):注册内置的set_language视图,对应模板中表单的action="{% url 'set_language' %}"
  • i18n_patterns:可选功能,为 URL 添加语言前缀(如/en/upload/),方便 SEO 和用户识别当前语言。

步骤 5:在视图 / 模型中使用翻译(后端文本)

如果需要在视图、模型或表单中使用多语言文本,需使用 Django 提供的翻译函数:

5.1 视图中使用翻译

python

# app/views.py from django.shortcuts import render from django.utils.translation import gettext as _ # 普通翻译(即时生效) from django.utils.translation import gettext_lazy as _lazy # 惰性翻译(适合模型/表单) def home(request): # 普通文本翻译 message = _("Welcome to our website") # 带变量的翻译 username = request.user.username or "Guest" greeting = _("Hello %(username)s, welcome back!") % {'username': username} return render(request, 'home.html', { 'message': message, 'greeting': greeting })
5.2 模型 / 表单中使用翻译(惰性翻译)

python

# app/models.py from django.db import models from django.utils.translation import gettext_lazy as _lazy class UploadFile(models.Model): file = models.FileField(upload_to='uploads/', verbose_name=_lazy("Uploaded File")) # 字段名翻译 upload_time = models.DateTimeField(auto_now_add=True, verbose_name=_lazy("Upload Time")) class Meta: verbose_name = _lazy("Uploaded File") verbose_name_plural = _lazy("Uploaded Files")

步骤 6:测试语言切换功能

  1. 启动 Django 开发服务器:python manage.py runserver
  2. 访问项目页面,看到语言切换下拉框;
  3. 选择 “English”,页面文本切换为英文;选择 “简体中文”,切换为中文;
  4. 切换后 URL 若配置了i18n_patterns,会自动添加语言前缀(如/en/)。

三、常见问题解决

  1. 翻译不生效

    • 检查LOCALE_PATHS路径是否正确,翻译文件是否编译为.mo
    • 检查LocaleMiddleware的位置是否正确;
    • 重启 Django 服务器(翻译文件修改后需重启)。
  2. 中文乱码

    • 确保.po文件的编码是 UTF-8;
    • 模板中设置<meta charset="UTF-8">
  3. 语言切换后跳转到首页

    • 检查表单中next隐藏字段是否正确(value="{{ request.path }}"),确保返回当前页面。

总结

  1. Django 语言切换的核心是配置国际化参数+创建翻译文件+使用内置set_language视图
  2. 关键步骤:开启USE_I18N、配置LocaleMiddleware、生成 / 编译.po翻译文件、模板中添加切换表单;
  3. 前端用{% trans %}/{% blocktrans %},后端用gettext/gettext_lazy,分别适配不同场景的翻译需求。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/13 11:19:33

PySimpleGUI配置无缝升级:5个关键策略让应用版本迭代零风险

PySimpleGUI配置无缝升级&#xff1a;5个关键策略让应用版本迭代零风险 【免费下载链接】PySimpleGUI 项目地址: https://gitcode.com/gh_mirrors/pys/PySimpleGUI 当你的PySimpleGUI应用发布新版本时&#xff0c;用户最担心的就是辛苦配置的个性化设置会不会丢失。从主…

作者头像 李华
网站建设 2026/4/18 7:52:16

F5-TTS语音合成实战指南:从技术小白到语音大师的蜕变之旅

F5-TTS语音合成实战指南&#xff1a;从技术小白到语音大师的蜕变之旅 【免费下载链接】F5-TTS Official code for "F5-TTS: A Fairytaler that Fakes Fluent and Faithful Speech with Flow Matching" 项目地址: https://gitcode.com/gh_mirrors/f5/F5-TTS 还…

作者头像 李华
网站建设 2026/4/17 15:09:18

Apache OpenDAL 数据访问层终极指南:统一存储操作的核心技术

Apache OpenDAL 数据访问层终极指南&#xff1a;统一存储操作的核心技术 【免费下载链接】opendal 项目地址: https://gitcode.com/gh_mirrors/op/opendal 在当今数据驱动时代&#xff0c;应用程序需要访问多种存储系统已成为常态。从本地文件系统到云端对象存储&#…

作者头像 李华
网站建设 2026/4/12 9:40:50

DeepSeek-VL2商业部署全攻略:7个必须知道的授权要点

当您准备将DeepSeek-VL2集成到企业产品中时&#xff0c;是否真正理解了双重许可协议背后的商业风险&#xff1f;作为业界领先的混合专家多模态视觉语言模型&#xff0c;DeepSeek-VL2的开源协议体系为技术决策者提供了清晰的合规路径。本文将从实际业务场景出发&#xff0c;帮助…

作者头像 李华
网站建设 2026/4/18 7:36:48

分布式存储终极革命:从性能瓶颈到突破性架构的演进路径

分布式存储终极革命&#xff1a;从性能瓶颈到突破性架构的演进路径 【免费下载链接】rustfs &#x1f680; High-performance distributed object storage that is faster than MinIO 项目地址: https://gitcode.com/GitHub_Trending/rus/rustfs 面对AI时代数据洪流的冲…

作者头像 李华
网站建设 2026/4/17 21:14:13

快速上手Rime Plum配置管理:终极指南

快速上手Rime Plum配置管理&#xff1a;终极指南 【免费下载链接】plum 東風破 /plum/: Rime configuration manager and input schema repository 项目地址: https://gitcode.com/gh_mirrors/pl/plum Rime Plum&#xff08;東風破&#xff09;是专为中州韵输入法引擎设…

作者头像 李华