Flask Babel 翻译路径
我有一个使用 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。