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
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.
$ mkdir webapp2-example && cd webapp2-example
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')
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
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()
$ 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>
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
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
.
Anwendungserstellung
Öffnen Sie den installierten Google App Engine Launcher und geben Sie die lokal erstellte Anwendung an. Die Anwendungs-ID ist leer und in Ordnung
Bestätigung bestätigen (2. Zeile)
Stellen Sie mit Cmd + D bereit und warten Sie, bis "Bereitstellung erfolgreich" im Protokoll angezeigt wird.
Sie können den Vorgang mit überprüfen.
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.
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
pybabel init
erstellenpybabel compile
erstellen / aktualisieren