Django启用国际化支持(2)—实现界面内切换语言:activate()

文章目录

⭐注意⭐

以下操作依赖于 Django 项目的国际化支持。如果你不清楚如何启用国际化功能,请先参考:Django 启用国际化支持(1)---实现配置多国语言

1. 配置项目全局设置:启用国际化

在项目的全局配置文件 settings.py 中完成以下步骤:

(1)启用国际化功能

再次确认 USE_I18N = True,这是 Django 多语言支持的基础。

(2)定义支持的语言

使用 LANGUAGES 选项指定支持的语言列表,这样可以避免用户切换到不支持的语言,同时提升性能。

python 复制代码
# settings.py
LANGUAGES = [
    ('en', 'English'),            # 英文
    ('zh-hans', 'Simplified Chinese'),  # 简体中文
]
USE_I18N = True  # 启用国际化功能

2. 编写视图函数

(1)首页视图 index

  • 页面显示一个问候信息(根据语言切换)。
  • 提供语言切换链接,点击后切换到对应语言。

(2)切换语言视图 set_language

  • 根据用户选择的语言切换显示内容。
  • 如果用户选择了不受支持的语言,返回错误信息。
python 复制代码
# views.py
from django.conf import settings
from django.http import HttpResponse, HttpResponseBadRequest
from django.shortcuts import redirect
from django.utils.translation import gettext as _, activate

def index(request):
    message = _('hello world')  # 翻译字符串
    return HttpResponse(f"""
    <html>
        <body>
            <p>{message}</p>
            <a href="/set_language/?lang=en">English</a> |  <!-- 切换到英文 -->
            <a href="/set_language/?lang=zh-hans">中文</a> |  <!-- 切换到简体中文 -->
            <a href="/set_language/?lang=fr">français</a>  <!-- 一个未支持的语言 -->
        </body>
    </html>
    """)

def set_language(request):
    # 获取用户选择的语言参数,默认值为 'en'
    lang = request.GET.get('lang', 'en')
    # 获取项目中支持的语言列表
    supported_languages = dict(settings.LANGUAGES).keys()
    if lang in supported_languages:
        # 如果选择的语言是支持的
        activate(lang)  # 切换到该语言
        return redirect("/")  # 重定向回首页
    else:
        # 如果选择的语言不支持,返回错误信息
        error_message = f"Error: Language '{lang}' is not supported."
        return HttpResponseBadRequest(error_message)

3. 配置路由

urls.py 中配置 URL 路由:

python 复制代码
# urls.py
from django.contrib import admin
from django.urls import path
from demo.views import index, set_language

urlpatterns = [
    path("admin/", admin.site.urls),
    path("", index),  # 首页
    path("set_language/", set_language),  # 语言切换处理
]

4. 界面演示

5、扩展

自动识别并切换到当前语言

可以根据用户浏览器的 Accept-Language 自动切换语言:

python 复制代码
from django.utils.translation import get_language_from_request,activate

def index(request):
    lang = get_language_from_request(request)
    activate(lang)
    message = _('hello world')
    return HttpResponse(f"<p>{message}</p>")

设置语言并保存到Session

python 复制代码
# views.py
from django.conf import settings
from django.http import HttpResponse, HttpResponseBadRequest
from django.shortcuts import redirect
from django.utils.translation import gettext as _, activate

....

def set_language(request):
    lang = request.GET.get('lang', 'en')
    supported_languages = dict(settings.LANGUAGES).keys()
    if lang in supported_languages:
        activate(lang)
        # 将语言存储到用户 Session 中(确保 Django 数据库已初始化)
        request.session['django_language'] = lang
        return redirect("/")
    else:
        error_message = f"Error: Language '{lang}' is not supported."
        return HttpResponseBadRequest(error_message)

注意:

切换语言时,语言代码会存储到用户的 Session 中。确保以下步骤已完成:

  1. 数据库已经初始化:

    bash 复制代码
    python manage.py migrate
  2. migrate 后会自动创建django_session表,这是 Django 默认的 存储Session 数据的表。

  • 如果不想使用 Session存储,可以改用 Cookie:

    python 复制代码
    response.set_cookie('django_language', lang)
相关推荐
数据小爬虫@2 小时前
深入解析:使用 Python 爬虫获取苏宁商品详情
开发语言·爬虫·python
健胃消食片片片片2 小时前
Python爬虫技术:高效数据收集与深度挖掘
开发语言·爬虫·python
Ai 编码助手5 小时前
在 Go 语言中如何高效地处理集合
开发语言·后端·golang
小丁爱养花5 小时前
Spring MVC:HTTP 请求的参数传递2.0
java·后端·spring
ℳ₯㎕ddzོꦿ࿐5 小时前
解决Python 在 Flask 开发模式下定时任务启动两次的问题
开发语言·python·flask
CodeClimb5 小时前
【华为OD-E卷 - 第k个排列 100分(python、java、c++、js、c)】
java·javascript·c++·python·华为od
一水鉴天5 小时前
为AI聊天工具添加一个知识系统 之63 详细设计 之4:AI操作系统 之2 智能合约
开发语言·人工智能·python
Channing Lewis5 小时前
什么是 Flask 的蓝图(Blueprint)
后端·python·flask
B站计算机毕业设计超人5 小时前
计算机毕业设计hadoop+spark股票基金推荐系统 股票基金预测系统 股票基金可视化系统 股票基金数据分析 股票基金大数据 股票基金爬虫
大数据·hadoop·python·spark·课程设计·数据可视化·推荐算法
觅远6 小时前
python+playwright自动化测试(四):元素操作(键盘鼠标事件)、文件上传
python·自动化