0

我有一个烧瓶芹菜设置,烧瓶 babel 翻译我的文本。我不能在 celery 任务中翻译。我相信这是因为它不知道当前的语言(即使它知道我也不知道),这是因为 celery 无法访问请求上下文(据我所知)......

能够翻译的解决方案是什么?

4

1 回答 1

0

您正确地指出了 celery 无法访问请求上下文的问题,这意味着 flask_babelex.get_locale 返回 None。您可以使用 Flask-Babel 中提供的 force_locale 上下文管理器,它提供了虚拟请求上下文。

from contextlib import contextmanager
from flask import current_app
from babel import Locale

from ..config import SERVER_NAME, PREFERRED_URL_SCHEME


@contextmanager
def force_locale(locale=None):
    if not locale:
        yield
            return

    env = {
        'wsgi.url_scheme': PREFERRED_URL_SCHEME,
        'SERVER_NAME': SERVER_NAME,
        'SERVER_PORT': '',
        'REQUEST_METHOD': ''
    }
    with current_app.request_context(env) as ctx:
        ctx.babel_locale = Locale.parse(locale)
        yield

芹菜任务示例

@celery.task()
def some_task(user_id):
    user = User.objects.get(id=user_id)
    with force_locale(user.locale):
        ...gettext('TranslationKey')...
于 2021-02-09T03:23:48.553 回答