【问题标题】:Django i18n: how to not translate the admin site?Django i18n:如何不翻译管理站点?
【发布时间】:2011-02-02 13:05:10
【问题描述】:

我有一个使用多种语言的应用程序,但我希望管理站点始终使用英语。 最好的方法是什么?

提前致谢。

【问题讨论】:

    标签: django internationalization django-admin admin


    【解决方案1】:

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

    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+)。

    【讨论】:

    • 这个线程安全吗?我们刚刚发现这段代码也将非管理员变成了英文。
    • 原来问题是由activate(get_language())引起的,它只是激活了之前激活的语言(即en)。使用activate(settings.LANGUAGE_CODE) 为我解决了这个问题。
    • 我认为使用 activate(request.LANGUAGE_CODE) 而不是 settings.LANGUAGE_CODE 会更好一些。你不这么认为吗? @Tommaso Barbugli
    • 小心正则表达式匹配,这将匹配任何包含.*admin/的url,即使该页面不属于管理站点。最好以 ^ 字符开始正则表达式,或者使用 Python 的 startswith
    【解决方案2】:

    我会设置两个设置文件:

    1. settings.py 整个项目
    2. admin_settings.py 仅供管理员使用

    然后在不同的域中托管这个项目:

    1. example.com
    2. admin.example.com

    如果您有单独的管理员和项目其他设置文件,您可以覆盖 admin_settings.py 中的语言设置

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

    from my_project.settings import *
    

    【讨论】:

    • 如何配置管理站点以实际使用 admin_settings.py 文件?
    • @thnee 您可以选择manage.pywsgi.py中的设置文件(两者都可以更改)。
    • @Mark 这不仅会影响管理站点,还会影响整个项目的所有部分。
    • @thnee 这两个域有自己的进程,有自己的 wsgi.py 和 manage.py(以及 settings.py)。他们可以共享其余的代码和数据库。如果您想将管理会话与主会话分开,您可以选择单独的 SESSION_COOKIE_DOMAIN 值。或者您可以共享它们,在这种情况下 SECRET_KEY 也应该相同。
    【解决方案3】:

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

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

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

    查看这些链接了解一些想法。

    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

    【讨论】:

    • 对于从右到左的语言,方法 1 可能会导致管理员以英语但从右到左显示。
    【解决方案4】:

    这是一个对我有用的简单解决方案。
    只需将请求中的语言 cookie 设置为英语,并将该中间件添加到 settings.pyLocaleMiddleware 之前。
    好处是不需要激活和停用语言,所以不用担心会影响其他请求

    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"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多