最近用flask-bable翻译一个项目,在网站上查找到有一个示例文档,地址:http://translations.readthedocs.io/en/latest/flask-babel.html#

不过有些地方显示的不对,特写此文章进行更改,同时以备自己后期查看使用

安装 Flask-Babel

Flask-Babel 是 Flask 的翻译扩展工具。安装命令如下:

pip install flask-babel

安装它的时候会顺便安装 Babelpytzspeaklater 这三个包,其中 Babel 是 Python 的一个国际化工具包。pytz 是处理时区的工具包,speaklater 相当于是 Babel 的一个辅助工具,

我们这里集中在翻译流程上,这几个工具就供以后进一步了解吧。

Hello, World

接下来我们做一个简单的 Hello World 程序,新建一个叫 hello 的文件夹,在其中创建一个叫 hello.py 的文件,内容如下:

注意:需要先安装flask: pip install flask

#hello.py

from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')

def hello():

day = "Saturday"

return render_template('index.html', day=day)

if __name__ == '__main__':

app.run(debug=True)

然后在 hello.py 的同一级目录下创建一个叫 templates 的文件夹,在其中写一个 index.html,内容如下:

<p>Hello, world!</p>

<p>It's {{ day }} today.</p>

很简单的 Hello World 程序,接下来我们要做的是让这个站变成中文站。

更新程序和模板

再接下来就是翻译了。翻译需要用到 flask-babel 这个 flask 扩展。首先我们将这个 app “国际化”,为模板和 .py 文件中的每一个字符串添加一个 gettext 函数,由于 gettext 函数被引用的次数太多了,为了方便手写,就将其 import 为 “_”:

from flask import Flask, render_template

from flaskext.babel import Babel, gettext as _

app = Flask(__name__)

app.config['BABEL_DEFAULT_LOCALE'] = 'zh'

babel = Babel(app)

@app.route('/')

def hello():

day = _("Saturday")

return render_template('index.html', day=day)

if __name__ == '__main__':

app.run(debug=True)

然后修改模板:

<p>{{ _("Hello, world!") }}</p>

<p>{{ _("It's %(day)s today", day=day) }}</p>

你可以注意到我们对 app 的 locale 做了配置,然后用 babel 扩展将 app 再次初始化,并且将 .py 和 .html 中的字符串做了配置,让它们都使用 gettext 这个函数。其中值得注意的是 gettext 的格式化字符串的参数。

如果直接用类似 "It's %s today" % day 是不行的。

这么一来,app 的语言其实是被写死成中文了。其实你可以在 flask 程序中让用户选择自己喜好的语言,或者依据浏览器设置用户优先显示的语言,详细做法可以参考官方文档中提到 localeselector 的部分。

设置 Babel

接下来我们要做的是 babel 的配置。在 hello.py 的同级目录创建一个叫 babel.cfg 的文件,内容如下:

[python: **.py]

[jinja2: **/templates/**.html]

extensions=jinja2.ext.autoescape,jinja2.ext.with_

生成翻译模板

这样 babel 就知道要从哪些位置搜索要翻译的字符串了。然后我们用 pybabel 生成要翻译的 PO 模板文件,这个命令是 babel 这个工具包带来的,生成翻译模板命令如下:

$ pybabel extract -F babel.cfg -o messages.pot .

注意结尾的点“.”,这个点表示当前目录,目录是 pybabel 必须的参数,所以命令是无法执行成功的。messages.pot 就是我们生成的翻译模板文件,内容大致如下:

# Translations template for PROJECT.

# Copyright (C) 2011 ORGANIZATION

# This file is distributed under the same license as the PROJECT project.

# FIRST AUTHOR , 2011.

#

#, fuzzy

msgid ""

msgstr ""

"Project-Id-Version: PROJECT VERSION\n"

"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"

"POT-Creation-Date: 2011-07-26 15:39+0800\n"

"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"

"Last-Translator: FULL NAME \n"

"Language-Team: LANGUAGE \n"

"MIME-Version: 1.0\n"

"Content-Type: text/plain; charset=utf-8\n"

"Content-Transfer-Encoding: 8bit\n"

"Generated-By: Babel 0.9.6\n"</code>

#: hello.py:11

msgid "Saturday"

msgstr ""

#: templates/index.html:1

msgid "Hello, world!"

msgstr ""

#: templates/index.html:2

#, python-format

msgid "It's %(day)s today"

msgstr ""

你可以修改里边头文件的信息,把个人和项目相关的资料加进去。

翻译

接下来我们创建中文翻译:

$ pybabel init -i messages.pot -d translations -l zh

这句命令会在 hello 文件夹中生成一个 translations 文件夹,要确保 flask 能找到翻译内容,translations文件夹要和 templates 文件夹在同一个目录中。接下来我们就可以进行翻译了,修改 translations/zh/LC_MESSAGES/messages.po 文件,将其中的内容翻译过来:

# Chinese (China) translations for PROJECT.

# Copyright (C) 2011 ORGANIZATION

# This file is distributed under the same license as the PROJECT project.

# FIRST AUTHOR , 2011.

#

msgid ""

msgstr ""

"Project-Id-Version: PROJECT VERSION\n"

"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"

"POT-Creation-Date: 2011-07-26 15:39+0800\n"

"PO-Revision-Date: 2011-07-26 09:07+0800\n"

"Last-Translator: FULL NAME \n"

"Language-Team: zh_CN \n"

"Plural-Forms: nplurals=1; plural=0\n"

"MIME-Version: 1.0\n"

"Content-Type: text/plain; charset=utf-8\n"

"Content-Transfer-Encoding: 8bit\n"

"Generated-By: Babel 0.9.6\n"</code>

#: hello.py:11

msgid "Saturday"

msgstr "星期六"

#: templates/index.html:1

msgid "Hello, world!"

msgstr "哈罗,世界!"

#: templates/index.html:2

#, fuzzy, python-format

msgid "It's %(day)s today"

msgstr "今天是%(day)s"

PO文件的翻译其实可以用专门的工具来编辑,比如 Poedit,不过小文件直接手译就可以了。

编译翻译结果

翻译完后执行下面的命令,为其编译出 message.mo 文件:

$ pybabel compile -d translations

如果上述命令无法生成 messages.mo 文件,那你需要将 message.po 中的 #, fuzzy 删除。

然后就算基本完成了。这时执行 python hello.py 就会看到翻译的中文页面了。

更新翻译

有时我们需要对程序和模板做修改,翻译也要随之更新。更新后需要用前面的命令重新生成 messages.pot 文件,然后使用下面的命令将更新的内容 merge 到原来的翻译中:

$ pybabel update -i messages.pot -d translations

最后再到对应 locale 的文件夹下更新翻译并 compile 即可。

整个目录结构图下所示:

代码汇总:

1、新建babel.cfg:
[python: **.py]
[jinja2: **/templates/**.html]
extensions=jinja2.ext.autoescape,jinja2.ext.with_
2、生成编译模板
pybabel extract -F babel.cfg -o messages.pot .
3、翻译
pybabel init -i messages.pot -d translations -l zh_Hans-CN
4、手动输入中文
messages.mo
5、编译翻译结果
pybabel compile -d translations
6、更新翻译
pybabel update -i messages.pot -d translations

Flask-Babel 使用简介(翻译文档)的更多相关文章

  1. Flask 中文手册 0.10 文档

    Flask 中文手册 0.10 文档 欢迎使用 Flask 欢迎阅读 Flask 文档. 本文档分为几个部分.我推荐您先从 安装 开始,之后再浏览 快速入门 章节. 教程 比快速入门更详细地介绍了如何 ...

  2. Umbraco(4)-Outputting the Document Type Properties(翻译文档)

    翻译原文地址:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/umbraco4outputting-the-document-typ ...

  3. Umbraco(6)-Creating More Pages Using the Master - Part 2(翻译文档)

    创建一个Contact Us页面 我们将创建一个新的”联系我们“页面,在该页面我们将放置简单的联系信息.对于添加这个功能你可能想替换为一个完全成熟的形式. 一些有效的解决方案: 使用表面控制器构建自己 ...

  4. Umbraco(5)-Creating Master Template Part 1(翻译文档)

    原文地址:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/umbraco5-creating-master-template-par ...

  5. Umbraco(2) - Creating Your First Template and Content Node(翻译文档)

    创建(编辑)你的第一个模板(Template) 展开 Settings > Templates文件夹 - 然后你应该看到子节点名为"Homepage" - 这是我们在创建Do ...

  6. Umbraco(1) - Document Types(翻译文档)

    Document Types Data first nothing in = nothing out! 任何网站的第一步是创建一个"Document Type"-几次安装后你会熟悉 ...

  7. Retrofit 简介 wiki 文档

    简介 Type-safe HTTP client for Android and Java by Square, Inc. GitHub主页:https://github.com/square/ret ...

  8. 26 JavaScript HTML DOM简介&方法&文档

    HTML DOM: Document  Object  Model 文档对象模型.是HTML的标准对象模型和编程接口.(JavaScript只是可以操作HTML DOM的语言之一) 定义了HTML元素 ...

  9. 管理后台-第一部分:Creating custom sections in Umbraco 7 - Part 1(翻译文档)

    在Umbraco上每个部分都可以被称为一个应用程序,所以这些部分和应用程序基本上是一样的.我们首先要做的事情是需要创建应用程序.在这个例子中,我不会去摆弄xml文件或是数据库——我将使用类来创建我的内 ...

随机推荐

  1. [CodeForces]986A Fair

    大意:给一张图,每个图上有一个数,问以每个点为源点,经过的点包含k种数字的最小距离. 显然跑最短路会T,但我们注意到边权一定.某次学校考试就是类似题,可以bfs做,复杂度O(n),每种货物做一次,复杂 ...

  2. Java 超类引用子类对象的示例代码

    动态方法分配 dynamic method dispatch 一个被重写的方法的调用会在运行时解析,而不是编译时解析 Java 会根据在调用发生时引用的对象的类型来判断所要执行的方法 public c ...

  3. 2019年北航OO第四单元(UML任务)及学期总结

    第四单元两次作业总结 第十三次作业 需求分析 本次作业需要完成一个UML类图解析器,所需要解析的只有符合UML标准和能够在Java 8中复现的UML类图.查询指令存在两种:仅与所查对象有关的指令,以及 ...

  4. 【codeforces 807C】Success Rate

    [题目链接]:http://codeforces.com/contest/807/problem/C [题意] 给你4个数字 x y p q 要求让你求最小的非负整数b; 使得 (x+a)/(y+b) ...

  5. @PostConstruct 和 @PreDestroy 指定初始化和销毁方法

    通过实现 @PostConstruct 和 @PreDestroy 注解,也可以指定 bean 的初始化和销毁方法 一.Student 类 public class Student{ public S ...

  6. spring中的单例和多例

    单例 对象在整个系统中只有一份,所有的请求都用一个对象来处理,如service和dao层的对象一般是单例的. 为什么使用单例:因为没有必要每个请求都新建一个对象的时候,浪费CPU和内存. 多例 对象在 ...

  7. pthread_cond 唤醒特定线程的方法

  8. UVA 10593 Kites DP

    The season of flying kites is well ahead. So what? Let us make an inventory for kites. We are givena ...

  9. Redis常用的命令

    常规命令查询地址: http://redisdoc.com/ 如下图:

  10. Redis学习笔记(五) 基本命令:Hash操作

    原文链接:http://doc.redisfans.com/hash/index.html 学习前先明确一下概念,这里我们把Redis的key称作key(键),把数据结构hash中的key称为fiel ...