Flask babel not working on simple translation?

python flask babel

1863 просмотра

1 ответ

1353 Репутация автора

Ok I have the following app:

babel.cfg

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

lucy/init.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'

lucy/controllers/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')

I ran the following commands:

  1. pybabel extract -F babel.cfg -o messages.pot .
  2. pybabel init -i messages.pot -d translations -l de
  3. pybabel compile -d translations/

This is what my project structure looks like:

.
|-- 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

These are the results from translation:

messages.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 ""

translation/de/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"

translation/de/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

When I visit /debug, I see that my locale is de. However, I still see A simple string being outputted. Any ideas why?

Автор: Sparrowcide Источник Размещён: 19.07.2016 08:24

Ответы (1)


3 плюса

67 Репутация автора

For me the solution was to set the BABEL_TRANSLATION_DIRECTORIES variable. It contains a string with paths separated by ';'.

In my config (only one location):

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

Автор: fmelan Размещён: 29.09.2017 10:03
Вопросы из категории :
32x32