如何在django会话中显式设置django_language

时间:2010-04-09 06:06:02

标签: django

如何在django_language会话中明确设置Django

非常感谢...

4 个答案:

答案 0 :(得分:32)

如果您希望用户能够指定语言,请确保已启用LocaleMiddleware

MIDDLEWARE_CLASSES = (
   ...
   'django.middleware.locale.LocaleMiddleware',
   ...
)

然后Django会按顺序查找用户的语言偏好(请参阅trans_real.py中的get_language_from_request):

    如果使用i18n_patterns,则request.path_info中的
  1. ;
  2. request.session[settings.LANGUAGE_SESSION_KEY];
  3. request.COOKIES[settings.LANGUAGE_COOKIE_NAME];
  4. request.META['HTTP_ACCEPT_LANGUAGE']中的所有语言,直到被接受为止;
  5. settings.LANGUAGE_CODE
  6. 因此,在Django会话中显式设置语言的最简单方法是重写request.session[settings.LANGUAGE_SESSION_KEY]

    def someview (request):
        ...
        request.session[settings.LANGUAGE_SESSION_KEY] = 'en'
        ...
    

答案 1 :(得分:17)

如果您使用版本>= Django 1.8。这就是我们如何使用它:

from django.utils.translation import LANGUAGE_SESSION_KEY

def someview (request):
    ...
    request.session[LANGUAGE_SESSION_KEY] = 'en'

答案 2 :(得分:1)

我认为最好的方法是遵循 Django 文档:

在您的 urls.py 文件中:

urlpatterns = [
    # other libraries
    path('i18n/', include('django.conf.urls.i18n')),
]

并且在您的模板文件(例如:“/core.html”)中调用标准的“set_language”视图。我会去找一个 boostrap 切换器:

   {% load i18n %}
    <ul class="navbar-nav">
        <li class="dropdown nav-item">
            <a href="#" class="dropdown-toggle nav-link" data-toggle="dropdown">
                <i class="nc-icon nc-planet"></i>
            </a>
            <ul class="dropdown-menu">
            <form action="{% url 'set_language' %}" method="post">{% csrf_token %}
            {% get_current_language as LANGUAGE_CODE %}
            {% get_available_languages as LANGUAGES %}
            {% get_language_info_list for LANGUAGES as languages %}
            {% for lang in languages %}
                <button type="submit"
                        name="language"
                        value="{{ lang.code }}"
                        class="dropdown-item">
                    {{ lang.name_local }}
                </button>
            {% endfor %}
            </form>
            </ul> 
        </li>
    </ul>

答案 3 :(得分:0)

考虑使用django.views.i18n.set_language()。通过在URLconf中添加以下行来激活此视图:

# This example makes the view available at /i18n/setlang/
url(r'^i18n/', include('django.conf.urls.i18n')),
  

为方便起见,Django提出了一个观点,   django.views.i18n.set_language(),用于设置用户的语言   首选项和重定向到给定的URL,或者,默认情况下,返回到   上一页。

     

视图期望通过POST方法使用语言调用   请求中的参数集。如果启用了会话支持,则视图   将语言选择保存在用户的会话中。否则,它会节省   默认情况下命名的cookie中的语言选择   django_language。 (名称可以通过改变   LANGUAGE_COOKIE_NAME设置。)