通过" / i18n / setlang /"更改语言ajax POST在Firefox上没有做任何事情

时间:2018-05-15 16:47:32

标签: javascript django reactjs internationalization

我的后端使用Django,我的前端完成了ReactJS。

当用户更改其个人资料的语言时,我会使用数据对象/i18n/setlang/{language: [language_code]}执行POST ajax调用并刷新页面。

我只是通过这个ajax调用来改变语言,一堆带有翻译的.po / .mo文件,我使用gettext()来翻译JS中的行。

这适用于Chrome,但在Firefox上完全忽略,并且不进行任何翻译。知道为什么吗?

我的中间件包含django.middleware.locale.LocaleMiddleware,我的LOCALE_PATH设置如下:

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

LOCALE_PATHS = [
    os.path.join(BASE_DIR, 'locale')
]

更新

在Chrome上,值request.META['HTTP_ACCEPT_LANGUAGE']

fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7,pl;q=0.6

(我支持的所有语言) 而在Firefox上,它返回:

en,en-US;q=0.5

仍然不确定为什么......

2 个答案:

答案 0 :(得分:0)

关于此问题有Firefox bug

答案 1 :(得分:0)

我设法通过在执行AJAX调用时在数据库中保存用户首选项来解决此问题,然后在用户获取主页面视图时更新session[translation.LANGUAGE_SESSION_KEY]值。

from django.utils import translation

class MainPageView(TemplateView):
    template_name = 'index.html'

def get(self, request, *args, **kwargs):
    if not request.user.is_authenticated:
        return super(MainPageView, self).get(self, request, *args, **kwargs)

    profile = request.user.profile

    if profile.preferred_language is None or profile.preferred_language == "":
        profile.preferred_language = request.LANGUAGE_CODE
        profile.save()
    else:
        request.session[translation.LANGUAGE_SESSION_KEY] = profile.preferred_language

    return super(MainPageView, self).get(self, request, *args, **kwargs)