Flask babel 不能进行简单的翻译?

Spa*_*ide 5 python flask flask-babel python-babel

好的,我有以下应用程序:

babel.cfg

[python: **.py]
[jinja2: **/templates/**.html]
extensions=jinja2.ext.autoescape,jinja2.ext.with_
Run Code Online (Sandbox Code Playgroud)

露西/初始化.py

babel = Babel()

def create_app(object_name):
  app = Flask(__name__)
  app.config.from_object(object_name)

  app.register_blueprint(main_blueprint)
  app.register_blueprint(category_blueprint)
  app.register_blueprint(item_blueprint)

  babel.init_app(app)
  db.init_app(app)
  return app


@babel.localeselector
def get_locale():
  return 'de'
Run Code Online (Sandbox Code Playgroud)

露西/控制器/main.py

main_blueprint = Blueprint(
    'main',
    __name__,
    template_folder='../templates/main',
)

@main_blueprint.route('/debug')
def debug():
  print get_locale()
  return gettext('A simple string')
Run Code Online (Sandbox Code Playgroud)

我运行了以下命令:

  1. pybabel 提取物 -F babel.cfg -o messages.pot 。
  2. pybabel init -i messages.pot -d 翻译 -l de
  3. pybabel 编译 -d 翻译/

这是我的项目结构的样子:

.
|-- README.md
|-- babel.cfg
|-- fabfile.py
|-- lucy
|   |-- __init__.py
|   |-- config.py
|   |-- controllers
|   |   |-- __init__.py
|   |   |-- category.py
|   |   |-- item.py
|   |   `-- main.py
|   |-- forms.py
|   |-- models.py
|   |-- static
|   |   |-- css
|   |   `-- js
|   `-- templates
|       |-- boilerplate
|       |   |-- items.html
|       |   `-- layout.html
|       |-- category
|       |   `-- show.html
|       |-- item
|       |   |-- index.html
|       |   `-- show.html
|       `-- main
|           `-- signup.html
|-- manage.py
|-- messages.pot
|-- requirements.txt
|-- tests
|   |-- __init__.py
|   `-- test_models.py
`-- translations
    `-- de
        `-- LC_MESSAGES
            |-- messages.mo
            `-- messages.po
Run Code Online (Sandbox Code Playgroud)

这些是翻译的结果:

消息.pot

# Translations template for PROJECT.
# Copyright (C) 2016 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2016.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2016-07-19 16:07+0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.3.4\n"

#: lucy/controllers/main.py:20
msgid "A simple string"
msgstr ""
Run Code Online (Sandbox Code Playgroud)

翻译/德/LC_MESSAGES/message.po

# German translations for PROJECT.
# Copyright (C) 2016 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2016.
#
msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2016-07-19 16:07+0800\n"
"PO-Revision-Date: 2016-07-19 16:07+0800\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language: de\n"
"Language-Team: de <LL@li.org>\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.3.4\n"

#: lucy/controllers/main.py:20
msgid "A simple string"
msgstr "german string berlin"
Run Code Online (Sandbox Code Playgroud)

翻译/德/LC_MESSAGES/message.mo

??,<=?M?A simple stringProject-Id-Version: PROJECT VERSION
Report-Msgid-Bugs-To: EMAIL@ADDRESS
POT-Creation-Date: 2016-07-19 16:07+0800
PO-Revision-Date: 2016-07-19 16:07+0800
Last-Translator: FULL NAME <EMAIL@ADDRESS>
Language: de
Language-Team: de <LL@li.org>
Plural-Forms: nplurals=2; plural=(n != 1)
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 8bit
Generated-By: Babel 2.3.4
german string berlin
Run Code Online (Sandbox Code Playgroud)

当我访问 /debug 时,我看到我的语言环境是de. 但是,我仍然看到A simple string正在输出。任何想法为什么?

小智 7

对我来说,解决方案是设置 BABEL_TRANSLATION_DIRECTORIES 变量。它包含一个以“;”分隔路径的字符串。

在我的配置中(只有一个位置):

BABEL_TRANSLATION_DIRECTORIES = '/home/work/python/project/translations'


小智 5

我的答案与fmelan的相同,但我使用绝对路径:

from flask import Flask
import os

base_dir = os.path.abspath(os.path.dirname(__file__))
app = Flask(__name__)
app.config["BABEL_TRANSLATION_DIRECTORIES"] = os.path.join(base_dir, "app/translation")
Run Code Online (Sandbox Code Playgroud)