使用Django会话(Session)实现多语言网站的用户语言选择功能
- 配置语言设置
首先,在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列出了支持的语言选项。
- 创建视图函数
在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)中。
- 配置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'), ]
- 创建语言选择器模板标签
创建一个语言选择器模板标签,该标签用于在模板中显示语言选择器:
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和当前语言代码传递给语言选择器模板。
- 创建语言选择器模板
在模板中使用语言选择器标签,并创建语言选择器的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视图函数,然后重新加载当前页面,以切换到所选语言。
- 测试
使用Django测试客户端或在浏览器中访问语言选择器模板,选择不同的语言选项,验证语言设置是否按预期进行。
相关文章