【问题标题】:Flask babel: flask-table is not translatedFlask babel:flask-table 未翻译
【发布时间】:2017-03-22 21:56:51
【问题描述】:

我正在尝试使用 babel 翻译一个烧瓶网络项目(使用 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 只返回 'de'。翻译文件夹和 babel.cfg 已就位,pybabel extract/init/compile 有效,字符串 Apple /Banana/Pear 甚至出现在生成的 messages.po 文件中,它们被翻译。但是,虽然“Hello World”和“test”在页面加载时会被翻译,但列字符串不会。

知道该怎么做吗?

【问题讨论】:

    标签: python flask-babel


    【解决方案1】:

    我找到了一个解决方案,任何人都会遇到同样的问题。关键是要覆盖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')
    

    【讨论】:

      【解决方案2】:

      您可以使用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'))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-19
        • 1970-01-01
        相关资源
        最近更新 更多