2017-03-22 281 views
0

我想翻譯一個燒瓶web項目與巴貝爾(使用Ubuntu 16.04/python 2.7.12)。一切似乎都很好,除了桌子。列的名稱不會被翻譯。有誰知道我是如何得到這個工作的?燒瓶babel:燒瓶表沒有翻譯

我的.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只是返回 '德' 。翻譯文件夾和babel.cfg都已準備就緒,pybabel提取/ init/compile工作,Apple/Banana/Pear字符串甚至出現在生成的messages.po文件中,並在其中進行翻譯。但是,雖然在加載頁面時「Hello World」和「test」會被翻譯,但列字符串不會。

任何想法,該怎麼辦?

回答

0

我找到了解決方案,對於任何遇到同樣問題的人。關鍵是覆蓋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')