5

我有一个使用 Flask Babel 翻译模板的 webapp。这个 webapp 可以通过将数据库名称添加到其 url 来使用多个数据库,例如:

myapp.com/<dbname>

问题是翻译路径在 babel 中是硬编码的:

    def list_translations(self):
        """Returns a list of all the locales translations exist for.  The
        list returned will be filled with actual locale objects and not just
        strings.

        .. versionadded:: 0.6
        """
        dirname = os.path.join(self.app.root_path, 'translations')
        if not os.path.isdir(dirname):
            return []
        result = []
        for folder in os.listdir(dirname):
            locale_dir = os.path.join(dirname, folder, 'LC_MESSAGES')
            if not os.path.isdir(locale_dir):
                continue
            if filter(lambda x: x.endswith('.mo'), os.listdir(locale_dir)):
                result.append(Locale.parse(folder))
        if not result:
            result.append(Locale.parse(self._default_locale))
        return result

babel 迫使我进入名为“translations”的目录和名为“messages.mo”的语言文件

我尝试了整个互联网,但仍然没有明确的解决方案来解决这个问题。

我想到的一个想法是,是否可以用 babelex 更改 babel,然后我可以覆盖翻译路径?

4

3 回答 3

9

...几年后,在 github 中获得线索。从 0.6 版开始,Babel 的参数BABEL_TRANSLATION_DIRECTORIES似乎记录得很差。那么 Flask 应用程序骨架应该是

# example.py
from flask import Flask
app = Flask('example')

# change path of messages.mo file
app.config['BABEL_TRANSLATION_DIRECTORIES'] = 'i18n'

# add translation capacity
from flask.ext.babel import Babel
babel = Babel(app)

# define routes and so on ...

使用此配置,Flask 将首先在 dir 'i18n' 中查找翻译。

一个非常基本的神社模板

{{_('hello')}}

具有 2 种语言的目录树。文件 messages.po 应包含“hello”的翻译

/myProject
  /i18n
    /en
      /LC_MESSAGES
        messages.po
    /fr
      /LC_MESSAGES
        messages.po
  example.py

奖励:用于多个目录

app.config['BABEL_TRANSLATION_DIRECTORIES'] = 'i18n;second_dir;third_dir'
于 2017-03-12T17:22:20.663 回答
2

解决方案是安装 Flask Babelex 而不是 Babel。

于 2014-10-23T13:50:57.343 回答
0

为什么不直接将flask babel 源代码加载到您的项目中并进行修改呢?

于 2014-10-21T20:15:14.287 回答