[PYTHON] Applications webapp2 multilingues avec pybabel et Jinja2

Procédure pour créer une application webapp2 multilingue avec pybabel et Jinja2 et la déployer sur GAE.

--webapp2: cadre d'application Web Python. - https://webapp2.readthedocs.io/en/latest/

--Jinja2: moteur de template Python. - http://jinja.pocoo.org/docs/2.9/ --pybabel (Babel): Un outil pour gérer le catalogue des parties traduites spécifique aux paramètres régionaux. C'est déroutant, mais ce n'est pas le [Babel] du compilateur JS (https://babeljs.io/). - http://babel.pocoo.org/en/latest/cmdline.html

environnement

Structure du répertoire

Finalement, ce sera comme ça.

$ tree
.
├── app.yaml
├── appengine_config.py
├── appengine_config.pyc
├── babel.cfg
├── lib
│   ├── Babel-2.3.4.dist-info
│   ├── babel
│   ├── pytz
│   └── pytz-2016.10.dist-info
├── locale
│   ├── ja_JP
│   │   └── LC_MESSAGES
│   │       ├── messages.mo
│   │       └── messages.po
│   └── message.pot
├── main.py
├── main.pyc
├── requirements.txt
└── templates
    └── index.html

33 directories, 1395 files

J'ai créé un référentiel pour référence.

Création d'applications

$ mkdir webapp2-example && cd webapp2-example

Paramètres Babel

Installez la bibliothèque Babel utilisée par l'extension webapp2 i18n dans votre projet

requirements.txt


Babel==2.3.4
$ pip install -t lib -r requirements.txt 
Collecting Babel==2.3.4 (from -r requirements.txt (line 1))
  Using cached Babel-2.3.4-py2.py3-none-any.whl
Collecting pytz>=0a (from Babel==2.3.4->-r requirements.txt (line 1))
  Using cached pytz-2016.10-py2.py3-none-any.whl
Installing collected packages: pytz, Babel
Successfully installed Babel-2.3.4 pytz-2016.10

appengine_config.py


from google.appengine.ext import vendor
vendor.add('lib')

Paramètres GAE

app.yaml


application: webapp2-example
version: 1
runtime: python27
api_version: 1
threadsafe: yes

handlers:
- url: .*
  script: main.app

libraries:
- name: webapp2
  version: "2.5.2"
- name: jinja2
  version: latest

application

Vous pouvez quand même obtenir les paramètres régionaux, mais ici, nous lirons les paramètres de la requête

main.py


import webapp2

from webapp2_extras import i18n
import os

import jinja2
JINJA_ENVIRONMENT = jinja2.Environment(
    loader=jinja2.FileSystemLoader(os.path.dirname(__file__)),
    extensions=['jinja2.ext.i18n', 'jinja2.ext.autoescape'],
    autoescape=True)
JINJA_ENVIRONMENT.install_gettext_translations(i18n)

class HelloWorldHandler(webapp2.RequestHandler):
    def get(self):
        locale = self.request.GET.get('locale', 'en_US')
        i18n.get_i18n().set_locale(locale)
        print(locale)

        template_values = {}
        template = JINJA_ENVIRONMENT.get_template('templates/index.html')
        self.response.write(template.render(template_values))


app = webapp2.WSGIApplication([
    ('/', HelloWorldHandler),
], debug=True)

def main():
    app.run()

if __name__ == '__main__':
    main()

modèle

$ mkdir templates

Écrivons un cas qui utilise des espaces réservés.

_ est un alias pour gettext, vous pouvez donc utiliser l'un ou l'autre.

templates/index.html


<html>
  <body>
    {{ _("Hello, %(username)s", username='satzz') }}
  </body>
</html>

Contrôle de fonctionnement local

Il n'est pas encore multilingue, mais à ce stade, nous allons vérifier le fonctionnement sur le serveur de développement GAE.

Démarrer le serveur de développement

$ dev_appserver.py . 
INFO     2017-03-17 06:07:29,597 sdk_update_checker.py:229] Checking for updates to the SDK.
INFO     2017-03-17 06:07:30,185 api_server.py:204] Starting API server at: http://localhost:63035
INFO     2017-03-17 06:07:30,189 dispatcher.py:197] Starting module "default" running at: http://localhost:8080
INFO     2017-03-17 06:07:30,192 admin_server.py:118] Starting admin server at: http://localhost:8000

Accès du navigateur à http: // localhost: 8080 où le module est en cours d'exécution

Screen Shot 2017-03-17 at 14.27.33.png

Contrôle de fonctionnement avec GAE

Bien qu'il s'écarte un peu de i18n, vérifiez le fonctionnement avec GAE.

Créez un projet avec le même nom que celui écrit dans ʻapp.yaml`.

Screen Shot 2017-03-17 at 15.08.51.png

Création d'applications

Screen Shot 2017-03-17 at 15.11.23.png

Screen Shot 2017-03-17 at 15.14.42.png

Ouvrez le lanceur d'applications Google App Engine installé et spécifiez l'application créée localement. L'ID d'application est vide et ok

Screen Shot 2017-03-17 at 15.13.17.png

Confirmer l'ajout (2e ligne) Screen Shot 2017-03-17 at 15.13.39.png

Déployez avec Cmd + D et attendez que «Déploiement réussi» apparaisse dans le journal. Screen Shot 2017-03-17 at 15.14.20.png

Vous pouvez vérifier le fonctionnement avec.

Ajouter des paramètres régionaux

De là, i18n du sujet principal. Installez la commande pybabel pour créer un catalogue.

$ pip install babel
Collecting babel
  Using cached Babel-2.3.4-py2.py3-none-any.whl
Requirement already satisfied: pytz>=0a in /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python (from babel)
Installing collected packages: babel
Successfully installed babel-2.3.4

Définir une cible multilingue, etc.

babel.cfg


[jinja2: templates/**.html]
encoding = utf-8
$ mkdir locale

Le flux de création de catalogue

Sera.

Créez un POT basé sur le modèle Jinja2.

$ pybabel extract -F ./babel.cfg -o ./locale/message.pot .

extracting messages from templates/index.html (encoding="utf-8")
writing PO template file to ./locale/message.pot

Lorsque vous ouvrez le POT, il répertorie automatiquement le msgid et où il est utilisé. Ce POT est un modèle pour que vous n'ayez pas à le manipuler.

locale/message.pot


#: templates/index.html:3
#, python-format
msgid "Hello, %(username)s"
msgstr ""

Créez un PO local basé sur le POT. (Pybabel update si PO a été créé)

$ pybabel init -l ja_JP -d ./locale -i ./locale/message.pot
creating catalog ./locale/ja_JP/LC_MESSAGES/messages.po based on ./locale/message.pot

Modifiez le fichier PO créé ici. Lorsque vous utilisez un espace réservé, cela ressemble à ceci.

locale/ja_JP/LC_MESSAGES/messages.po


msgid "Hello, %(username)s"
msgstr "%(username)s's, bonjour"

Compiler. Le fichier MO créé sera un fichier binaire.

$ pybabel compile -f -d ./locale
compiling catalog ./locale/ja_JP/LC_MESSAGES/messages.po to ./locale/ja_JP/LC_MESSAGES/messages.mo

Ajoutez un paramètre régional au paramètre de requête et essayez d'y accéder.

Screen Shot 2017-03-17 at 14.35.30.png

Si vous le déployez à nouveau, vous pouvez voir le comportement dans GAE.

Après cela, répétez ce qui suit pour agrandir le catalogue.

Recommended Posts

Applications webapp2 multilingues avec pybabel et Jinja2
Génération de configuration de réseau de modèles avec Python et Jinja2
Avec et sans WSGI
Créez des applications, enregistrez des données et partagez-les avec un seul e-mail