Flask babel:flask-table 未翻译
Flask babel: flask-table is not translated
我正在尝试用 babel 翻译一个 flask web 项目(使用 Ubuntu 16.04/python 2.7.12)。一切似乎都工作正常,除了表格。列的名称不会被翻译。有谁知道我是如何让它工作的?
我的 .py 示例:
from flask import Flask, render_template
from flask_script import Manager
from flask.ext.babel import Babel, gettext
from flask_table import Table, Col
app = Flask(__name__)
manager = Manager(app)
babel = Babel(app)
class ItemTable(Table):
col1 = Col(gettext('Apple'))
col2 = Col(gettext('Banana'))
col3 = Col(gettext('Pear'))
class Item(object):
def __init__(self, col1, col2, col3):
self.col1 = col1
self.col2 = col2
self.col3 = col3
@babel.localeselector
def get_locale():
return 'de'
@app.route('/')
def index():
items = []
items.append(Item('bla', 'bla', 'bla'))
table = ItemTable(items)
test = gettext("This is a string.")
return render_template('index.html', test=test, table=table)
if __name__ == '__main__':
app.run(debug=True)
和 html 文件:
<h1>{{gettext("Hello World!")}}</h1>
<h2>{{test}}</h2>
{{table}}
在这里,我只是想测试翻译成德语是否有效,所以 get_locale 只是 returns 'de'。翻译文件夹和 babel.cfg 在地方,pybabel extract/init/compile 工作,字符串 Apple/Banana/Pear 甚至出现在生成的 messages.po 文件中,在那里它们被翻译。但是,尽管 "Hello World" 和 'test' 在页面加载时得到翻译,列字符串却没有。
知道该怎么做吗?
我找到了解决方案,适用于遇到相同问题的任何人。关键是要覆盖ItemTable的构造函数:
class ItemTable(Table):
col1 = Col('')
col2 = Col('')
col3 = Col('')
def __init__(self, items):
super(ItemTable, self).__init__(items)
self.col3.name = gettext('Apple')
self.col2.name = gettext('Banana')
self.col3.name = gettext('Pear')
这同样适用于 wtforms。这不起作用:
class TestForm(Form):
field1 = TextField(gettext('fieldlabel1'))
field2 = TextField(gettext('fieldlabel2'))
但是这样做:
class TestForm(Form):
field1 = TextField('')
field2 = TextField('')
def __init__(self, formdata=None):
if formdata:
super(TestForm, self).__init__(formdata)
else:
super(TestForm, self).__init__()
self.field1.label.text = gettext('fieldlabel1')
self.field2.label.text = gettext('fieldlabel2')
您可以使用 lazy_gettext 而不是 gettext 并保持原样。
from flask.ext.babel import lazy_gettext
from flask_table import Table, Col
class ItemTable(Table):
col1 = Col(gettext('Apple'))
col2 = Col(gettext('Banana'))
col3 = Col(gettext('Pear'))
我正在尝试用 babel 翻译一个 flask web 项目(使用 Ubuntu 16.04/python 2.7.12)。一切似乎都工作正常,除了表格。列的名称不会被翻译。有谁知道我是如何让它工作的?
我的 .py 示例:
from flask import Flask, render_template
from flask_script import Manager
from flask.ext.babel import Babel, gettext
from flask_table import Table, Col
app = Flask(__name__)
manager = Manager(app)
babel = Babel(app)
class ItemTable(Table):
col1 = Col(gettext('Apple'))
col2 = Col(gettext('Banana'))
col3 = Col(gettext('Pear'))
class Item(object):
def __init__(self, col1, col2, col3):
self.col1 = col1
self.col2 = col2
self.col3 = col3
@babel.localeselector
def get_locale():
return 'de'
@app.route('/')
def index():
items = []
items.append(Item('bla', 'bla', 'bla'))
table = ItemTable(items)
test = gettext("This is a string.")
return render_template('index.html', test=test, table=table)
if __name__ == '__main__':
app.run(debug=True)
和 html 文件:
<h1>{{gettext("Hello World!")}}</h1>
<h2>{{test}}</h2>
{{table}}
在这里,我只是想测试翻译成德语是否有效,所以 get_locale 只是 returns 'de'。翻译文件夹和 babel.cfg 在地方,pybabel extract/init/compile 工作,字符串 Apple/Banana/Pear 甚至出现在生成的 messages.po 文件中,在那里它们被翻译。但是,尽管 "Hello World" 和 'test' 在页面加载时得到翻译,列字符串却没有。
知道该怎么做吗?
我找到了解决方案,适用于遇到相同问题的任何人。关键是要覆盖ItemTable的构造函数:
class ItemTable(Table):
col1 = Col('')
col2 = Col('')
col3 = Col('')
def __init__(self, items):
super(ItemTable, self).__init__(items)
self.col3.name = gettext('Apple')
self.col2.name = gettext('Banana')
self.col3.name = gettext('Pear')
这同样适用于 wtforms。这不起作用:
class TestForm(Form):
field1 = TextField(gettext('fieldlabel1'))
field2 = TextField(gettext('fieldlabel2'))
但是这样做:
class TestForm(Form):
field1 = TextField('')
field2 = TextField('')
def __init__(self, formdata=None):
if formdata:
super(TestForm, self).__init__(formdata)
else:
super(TestForm, self).__init__()
self.field1.label.text = gettext('fieldlabel1')
self.field2.label.text = gettext('fieldlabel2')
您可以使用 lazy_gettext 而不是 gettext 并保持原样。
from flask.ext.babel import lazy_gettext
from flask_table import Table, Col
class ItemTable(Table):
col1 = Col(gettext('Apple'))
col2 = Col(gettext('Banana'))
col3 = Col(gettext('Pear'))