Flask教程:http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-xiv-i18n-and-l10n

SOURCE

这章讲解国际化和本地化。使用的是Flask-Babel

配置

app/__init__.py

    
    from flask.ext.babel import Babel
    babel = Babel(app)
    
    

config.py

    
    LANGUAGES = {
        'en':'English',
        'zh_CN':'简体中文'
    }
    
    

app/views.py 在这里获取每个请求头中的Accept-Language ,来确定语言。然后设置给g。

    
    from app import babel
    from config import LANGUAGES
    
    @babel.localeselector
    def get_locale():
        return request.accept_languages.best_match(LANGUAGES.keys())
        
    @app.before_request
    def before_request():
        ...
        g.locale = get_locale()
    
    

babel.cfg:babel的配置文件。设定什么文件要I18N。

[python: **.py]
[jinja2: **/templates/**.html]
extensions=jinja2.ext.autoescape,jinja2.ext.with_

抽出字串和翻译

py文件:使用gettext()

    
    flash(gettext('Your changes have been saved.'))
    
    

模版文件:_('string')

    
    <a href="/index">{{ _('Home') }}</a>
    
    

gettext()_('string')中字串抽出到翻译模板文件中:

flask/bin/pybabel extract -F babel.cfg -o messages.pot app

然后根据生成的模板pot文件,生成具体语言的po文件。

flask/bin/pybabel init -i messages.pot -d app/translations -l zh

使用文本编辑工具编辑,翻译抽出的字串。保存后,要编译成mo文件。

flask/bin/pybabel compile -d app/translations

这里有个问题:如果上面的命令提示:catalog ‘app/translations/zh/LC_MESSAGES/messages.po’ is marked as fuzzy, skipping 删除po文件中#,fuzzy行。或者使用命令:pybabel compile -f -d translations

更新字串。比如你添加了新的翻译字串

flask/bin/pybabel extract -F babel.cfg -o messages.pot app
flask/bin/pybabel update -i messages.pot -d app/translations

moment.js的国际化

  1. 下载moment-with-locales.min.js
  2. 在base.html模版中使用如下代码:
    
    <script src="/static/js/moment-with-locales.min.js"></script>
    <script>moment.locale("{{ g.locale }}")</script>
    
    

完整的国际化和本地化更改请看这里

Flask-Babel的更多说明请看官网:Flask-Babel