【问题标题】:Get current locale in Jinja2获取 Jinja2 的当前语言环境
【发布时间】:2013-05-05 11:45:44
【问题描述】:

在我的网站上使用 Flask + Jinja2 和 Flask-Babel 进行翻译。该站点有两种语言(取决于 URL),我想添加一个链接以在它们之间切换。要正确执行此操作,我需要获取当前语言环境的名称,但我在文档中没有找到这样的功能。它存在吗?

【问题讨论】:

    标签: python jinja2 gettext python-babel


    【解决方案1】:

    其他答案说您必须实现 babel 的 get_locale() 函数,并且您应该将其添加到 Jinja2 全局变量中,但他们没有说明如何。所以,我所做的是:

    我实现了get_locale()函数如下:

    from flask import request, current_app
    
    @babel.localeselector
    def get_locale():
        try:
            return request.accept_languages.best_match(current_app.config['LANGUAGES'])
        except RuntimeError:  # Working outside of request context. E.g. a background task
            return current_app.config['BABEL_DEFAULT_LOCALE']
    

    然后,我在我的 Flask app 定义中添加了以下行:

    app.jinja_env.globals['get_locale'] = get_locale
    

    现在您可以从模板中调用get_locale()

    【讨论】:

      【解决方案2】:

      最后,我使用了这个解决方案:将无论如何都应该定义的get_locale 函数添加到 Jinja2 全局变量中,然后像任何其他函数一样在模板中调用它。

      【讨论】:

      • 你是如何添加到 jinja2 全局变量中的?我试过做 e=Environment, e.globals = {'get_locale':get_locale}
      【解决方案3】:

      您有责任将用户的语言环境存储在数据库中的会话中。 Flask-babel 不会为您执行此操作,因此您应该为 flask-babel 实现 get_locale 方法,以便能够找到您用户的语言环境。

      这是来自flask-babel 文档的get_locale 示例:

      from flask import g, request
      
      @babel.localeselector
      def get_locale():
          # if a user is logged in, use the locale from the user settings
          user = getattr(g, 'user', None)
          if user is not None:
              return user.locale
          # otherwise try to guess the language from the user accept
          # header the browser transmits.  We support de/fr/en in this
          # example.  The best match wins.
          return request.accept_languages.best_match(['de', 'fr', 'en'])
      

      【讨论】:

      • 是的,我已经实现了这样的 get_locale 函数,它根据 URL 返回一个区域设置。但是如何在 Jinja 模板中获取活动请求区域设置?
      猜你喜欢
      • 2017-04-11
      • 1970-01-01
      • 2014-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-22
      • 1970-01-01
      相关资源
      最近更新 更多