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

18

我有一个多语言应用程序,但我希望始终将管理员网站保持为英语。

那么最好的方法是什么?

提前感谢。

4个回答

15

考虑使用中间件来覆盖某些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+)中。


这个线程安全吗?我们刚刚发现这段代码也将非管理员的语言改成了英语。 - Tom Viner
原来问题是由 activate(get_language()) 引起的,它仅仅激活了之前激活的语言(即 en)。对我来说,使用 activate(settings.LANGUAGE_CODE) 解决了这个问题。 - Tom Viner
我认为使用activate(request.LANGUAGE_CODE)而不是settings.LANGUAGE_CODE会更好一些。你觉得呢?@Tommaso Barbugli - Alexey Sidash
在正则表达式匹配时要小心,这将匹配任何包含 .*admin/ 的 URL,即使该页面不属于管理员站点。最好以 ^ 字符开头或使用 Python 的 startswith - thnee

4
我会设置两个设置文件:
  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 *

1
你如何配置管理站点以实际使用admin_settings.py文件? - thnee
@thnee 你可以在 manage.pywsgi.py 中选择设置文件(两个都要改)。 - Mark
@Mark 这不仅会影响管理站点,也会影响整个项目的所有部分。 - thnee
@thnee 两个域名将拥有各自的进程,各自的wsgi.py和manage.py(以及settings.py)。它们可以共享其余的代码和数据库。如果您想要将管理员会话与主要会话分开,则可以选择不同的SESSION_COOKIE_DOMAIN值。或者您可以共享它们,在这种情况下,SECRET_KEY也应该是相同的。 - Mark

0

这是一个有趣的问题,我找不到一个简单明了的答案,所以看起来需要一个创新性的解决方案。以下是两个想法。

  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可能会导致管理员以英文但从右到左的方式显示。 - Flimm

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"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接