Django i18n:如何不翻译管理站点?

时间:2010-03-30 15:44:16

标签: django internationalization django-admin admin

我有多种语言的应用程序,但我想保持管理站点始终使用英语。 这样做的最佳方式是什么?

提前致谢。

4 个答案:

答案 0 :(得分:13)

考虑使用覆盖某些网址的区域设置的中间件。这是一个粗略的例子:

Django 1.9及更早版本:

from django.conf import settings    
from django.utils.translation import activate     
import re

class ForceInEnglish(object):

    def process_request(self, request):   
        if re.match(".*admin/", request.path):          
            activate("en")      
        else:
            activate(settings.LANGUAGE_CODE)

这只是一个实施的想法。

Django 1.10 +:

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


class ForceInEnglish:

    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        if request.path.startswith('/admin'):
            request.LANG = 'en'
            translation.activate(request.LANG)
            request.LANGUAGE_CODE = request.LANG

        return self.get_response(request)

如何申请?

保存到'middleware.py',并在设置文件中包含MIDDLEWARE_CLASSES(1.9及更早版本)或MIDDLEWARE(1.10 +)。

答案 1 :(得分:4)

我会设置两个设置文件:

    整个项目的
  1. settings.py
  2. admin_settings.py仅适用于管理员
  3. 然后在不同的域中托管此项目:

    1. example.com
    2. admin.example.com
    3. 如果您有管理员和项目其余部分的单独设置文件,则可以覆盖admin_settings.py

      中的语言设置

      您可能会有非常相似的设置文件,因此admin_settings.py顶部的关注行会很方便:

      from my_project.settings import *
      

答案 2 :(得分:0)

这是一个有趣的问题,我找不到一个简单的直接回答,所以看起来它需要开箱即用的解决方案。这有两个想法。

  1. 这可能是一种粗暴的做法,但您是否尝试删除django.contrib.admin.locale下的所有语言包,除了en?我自己没有尝试过,但我认为如果这是唯一可以显示的区域,那么django将默认返回英语。如果它找不到它,它可能最终会使用基础django语言环境文件,但值得一试。

  2. 我能想到的唯一其他选项是将管理主页更改为自定义视图,您可以在会话或cookie中手动将django_language变量设置为英语,然后重定向到正常的管理页面。 / p>

  3. 请参阅这些链接以获取一些想法。

    http://code.djangoproject.com/browser/django/trunk/django/views/i18n.py

    http://docs.djangoproject.com/en/1.2/topics/i18n/internationalization/#the-set-language-redirect-view

答案 3 :(得分:0)

这是对我有用的简单解决方案。
只需将请求中的语言Cookie设置为英语,然后在settings.py之前的LocaleMiddleware中添加该中间件即可。
好处是无需激活和停用该语言,因此无需担心会影响其他请求

from django.conf import settings
from django.http import HttpRequest
from django.utils.deprecation import MiddlewareMixin


class ForceInEnglish(MiddlewareMixin):
    def process_request(self, request: HttpRequest) -> None:
        if request.path.startswith("/admin"):
            request.COOKIES[settings.LANGUAGE_COOKIE_NAME] = "en"