[PYTHON] Mehrsprachige webapp2-Anwendungen mit pybabel und Jinja2

Verfahren zum Erstellen einer mehrsprachigen webapp2-Anwendung mit pybabel und Jinja2 und zum Bereitstellen auf GAE.

--webapp2: Python-Web-App-Framework. - https://webapp2.readthedocs.io/en/latest/

--Jinja2: Python-Vorlagen-Engine. - http://jinja.pocoo.org/docs/2.9/ --pybabel (Babel): Ein Tool zum Verwalten des länderspezifischen Katalogs übersetzter Teile. Es ist verwirrend, aber es ist nicht das [Babel] des JS-Compilers (https://babeljs.io/). - http://babel.pocoo.org/en/latest/cmdline.html

Umgebung

Verzeichnisaufbau

Irgendwann wird es so sein.

$ 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

Ich habe ein Repository als Referenz erstellt.

Anwendungserstellung

$ mkdir webapp2-example && cd webapp2-example

Babel Einstellungen

Installieren Sie die von der webapp2 i18n-Erweiterung verwendete Babel-Bibliothek in Ihrem Projekt

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')

GAE-Einstellungen

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

Anwendung

Sie können das Gebietsschema trotzdem abrufen, aber hier werden wir aus den Anforderungsparametern lesen

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()

Vorlage

$ mkdir templates

Schreiben wir einen Fall, der Platzhalter verwendet.

_ ist ein Alias für gettext, Sie können also einen verwenden.

templates/index.html


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

Lokale Betriebsprüfung

Es war noch nicht mehrsprachig, aber in diesem Stadium werden wir den Betrieb auf dem GAE-Entwicklungsserver überprüfen.

Starten Sie den Entwicklungsserver

$ 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

Browserzugriff auf http: // localhost: 8080, auf dem das Modul ausgeführt wird

Screen Shot 2017-03-17 at 14.27.33.png

Funktionsprüfung mit GAE

Obwohl es ein wenig von i18n abweicht, überprüfen Sie den Betrieb mit GAE.

Erstellen Sie ein Projekt mit demselben Namen wie in app.yaml.

Screen Shot 2017-03-17 at 15.08.51.png

Anwendungserstellung

Screen Shot 2017-03-17 at 15.11.23.png

Screen Shot 2017-03-17 at 15.14.42.png

Öffnen Sie den installierten Google App Engine Launcher und geben Sie die lokal erstellte Anwendung an. Die Anwendungs-ID ist leer und in Ordnung

Screen Shot 2017-03-17 at 15.13.17.png

Bestätigung bestätigen (2. Zeile) Screen Shot 2017-03-17 at 15.13.39.png

Stellen Sie mit Cmd + D bereit und warten Sie, bis "Bereitstellung erfolgreich" im Protokoll angezeigt wird. Screen Shot 2017-03-17 at 15.14.20.png

Sie können den Vorgang mit überprüfen.

Gebietsschema hinzufügen

Von hier aus i18n des Hauptthemas. Installieren Sie den Befehl pybabel, um einen Katalog zu erstellen.

$ 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

Mehrsprachiges Ziel setzen etc.

babel.cfg


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

Der Ablauf der Katalogerstellung

Wird sein.

Erstellen Sie einen POT basierend auf der Jinja2-Vorlage.

$ 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

Wenn Sie den POT öffnen, wird automatisch die msgid aufgelistet und wo sie verwendet wird. Dieser POT ist eine Vorlage, damit Sie sich nicht damit anlegen müssen.

locale/message.pot


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

Erstellen Sie eine Gebietsschema-Bestellung basierend auf dem POT. (Pybabel Update wenn PO erstellt wurde)

$ 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

Bearbeiten Sie die hier erstellte Bestelldatei. Wenn Sie einen Platzhalter verwenden, sieht es so aus.

locale/ja_JP/LC_MESSAGES/messages.po


msgid "Hello, %(username)s"
msgstr "%(username)s, Hallo"

Kompilieren. Die erstellte MO-Datei ist eine Binärdatei.

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

Fügen Sie dem Anforderungsparameter ein Gebietsschema hinzu und versuchen Sie, darauf zuzugreifen.

Screen Shot 2017-03-17 at 14.35.30.png

Wenn Sie es erneut bereitstellen, können Sie das Verhalten in GAE sehen.

Wiederholen Sie danach die folgenden Schritte, um den Katalog zu erweitern.

--Übersetzung und msgid werden aktualisiert-> POT-Update mit pybabel extract --POT aktualisiert-> PO-Update mit pybabel update

Recommended Posts

Mehrsprachige webapp2-Anwendungen mit pybabel und Jinja2
Generierung der Vorlagen-Netzwerkkonfiguration mit Python und Jinja2
Mit und ohne WSGI
Erstellen Sie Anwendungen, registrieren Sie Daten und teilen Sie sie mit einer einzigen E-Mail