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
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.
$ mkdir webapp2-example && cd webapp2-example
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')
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
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()
$ 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>
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
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`.
Création d'applications
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
Confirmer l'ajout (2e ligne)
Déployez avec Cmd + D et attendez que «Déploiement réussi» apparaisse dans le journal.
Vous pouvez vérifier le fonctionnement avec.
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.
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.
pybabel extract
--POT mis à jour-> Mise à jour PO avec pybabel update
--Ajouter des paramètres régionaux-> Créer un bon de commande avec pybabel init
--Créer / mettre à jour PO-> Créer / mettre à jour MO avec pybabel compile