Flask Babel 翻译路径

5 投票
3 回答
3890 浏览
提问于 2025-04-28 19:16

我有一个使用 Flask Babel 的网页应用,它可以翻译模板。这个网页应用可以通过在网址中添加数据库名称来使用多个数据库,比如:

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,这样我就可以自定义翻译的路径了?

暂无标签

3 个回答

0

你为什么不把flask babel的源代码直接放到你的项目里,然后进行修改呢?

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会首先在'i18n'这个文件夹里寻找翻译。

一个非常基础的jinja模板

{{_('hello')}}

这个目录结构包含了两种语言。文件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'
2

解决办法是安装 Flask Babelex,而不是 Babel。

撰写回答