使用Django会话(Session)实现多语言网站的用户语言选择功能

2023-04-12 00:00:00 语言 会话 多语言
  1. 配置语言设置

首先,在Django的settings.py文件中添加以下代码:

from django.utils.translation import ugettext_lazy as _

LANGUAGE_CODE = 'zh-hans'
LANGUAGES = (
    ('zh-hans', _('Simplified Chinese')),
    ('en', _('English')),
)

其中,LANGUAGE_CODE指定了网站的默认语言为简体中文,LANGUAGES列出了支持的语言选项。

  1. 创建视图函数

在views.py文件中,创建一个处理用户语言选择的视图函数:

from django.conf import settings
from django.http import HttpResponse
from django.utils import translation

def set_language(request):
    lang_code = request.GET.get('language')
    if lang_code and lang_code in dict(settings.LANGUAGES).keys():
        translation.activate(lang_code)
        request.session[translation.LANGUAGE_SESSION_KEY] = lang_code
    return HttpResponse('OK')

该视图函数的作用是:从GET请求中获得用户所选择的语言代码,如果该代码在LANGUAGES中定义,则将该语言设置为当前语言,并将该设置保存在用户的会话(Session)中。

  1. 配置URL映射

在urls.py文件中,配置URL映射,将set_language函数映射到一个URL上:

from django.urls import path
from . import views

app_name = 'myapp'
urlpatterns = [
    path('set_language/', views.set_language, name='set_language'),
]
  1. 创建语言选择器模板标签

创建一个语言选择器模板标签,该标签用于在模板中显示语言选择器:

from django import template

register = template.Library()

@register.simple_tag(takes_context=True)
def language_switch(context):
    request = context['request']
    lang_choices = context['LANGUAGES']
    current_lang = translation.get_language()
    choices = [
        (code, label, code == current_lang)
        for code, label in lang_choices
    ]
    return {
        'choices': choices,
        'next': request.path,
        'current_lang': current_lang,
    }

该标签将当前可用的语言选项、当前页面的URL和当前语言代码传递给语言选择器模板。

  1. 创建语言选择器模板

在模板中使用语言选择器标签,并创建语言选择器的HTML代码:

<div id="language-switcher">
    <form action="{% url 'myapp:set_language' %}" method="get">
        {% csrf_token %}
        <input type="hidden" name="next" value="{{ next }}">
        {% for code, label, is_current in choices %}
            <button 
                type="submit" 
                class="{% if is_current %}active{% endif %}"
                name="language" 
                value="{{ code }}"
            >
                {{ label }}
            </button>
        {% endfor %}
    </form>
</div>

该模板使用POST请求将用户选择的语言代码提交给set_language视图函数,然后重新加载当前页面,以切换到所选语言。

  1. 测试

使用Django测试客户端或在浏览器中访问语言选择器模板,选择不同的语言选项,验证语言设置是否按预期进行。

相关文章