** Hinweis: ** Dies ist nur ein Hinweis. Bitte vergib mir, auch wenn ich keine nützlichen Informationen habe.
Ich schreibe eine Flask-App als Hobby, möchte sie aber nach Möglichkeit bei der Arbeit nützlich machen. Das Problem ist jedoch Japanisch. Englisch ist besser für die Veröffentlichung auf GitHub oder GitLab, aber die traurige Realität ist, dass Sie es nicht auf Englisch verwenden können, wenn Sie versuchen, es bei der Arbeit zu verwenden.
Also i18n. vielleicht. i18n ist eine Abkürzung für Internationalisierung (?) Wie Sie wissen. Übrigens hat mir das Hyper Nikki System gefallen, aber die offizielle Website Domain h14m.org kommt von dort, oder? (Entgleisung) Vorerst war ich immer daran interessiert, wie man i18n macht, deshalb habe ich diese Gelegenheit genutzt, um es auszuprobieren, was der Inhalt dieses Artikels ist.
Dieser Artikel basiert im Wesentlichen auf [dieser Site (Englisch)] Link-1 und [dieser Site (Japanisch, Qiita)] Link-3. Es scheint üblich zu sein (oder kann ich sagen?), [Babel] Link-2 zu verwenden, um i18n-Dinge mit Flask of Python zu tun. Wenn Sie an Babel denken, denken Menschen, die Emacs verwenden, und Menschen, die JS verwenden, möglicherweise an etwas anderes (Entgleisung). Oder besser gesagt, ich konnte Babel nicht auf das Tag schreiben, weil es verwirrend zu sein scheint ... !!
Installieren Sie zuerst Babel selbst.
% pip3 install --user Babel flask_babel
Es war so.
[Diese Seite (Japanisch, Qiita)] Versuchen Sie, das Github-Repository von Link-3 zu klonen und auszuführen. Sprechen Sie zuerst mit Telnet, ohne an etwas zu denken.
% telnet localhost 5000
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET / HTTP/1.1
HTTP/1.0 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 11
Server: Werkzeug/0.12.2 Python/3.6.1+
Date: Wed, 14 Jun 2017 11:10:09 GMT
Hello WORLDConnection closed by foreign host.
Es war ein Ingurishu. Hallo. Die Reihenfolge ist umgekehrt, aber es scheint, dass die Sprachumschaltung durch Senden von Accept-Language im http-Anforderungsheader erfolgen kann. Also bat ich diesmal alle, in ihrem Lieblingsjapanisch zurückzukehren.
% telnet localhost 5000
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET / HTTP/1.1
Accept-Language: ja
HTTP/1.0 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 21
Server: Werkzeug/0.12.2 Python/3.6.1+
Date: Wed, 14 Jun 2017 11:14:39 GMT
Hello World Connection vom ausländischen Host geschlossen.
Wie geplant antwortete er auf Japanisch. Ich sehe, so funktioniert es. Es scheint, dass Accept-Language auch als gewichtete Liste übergeben werden kann.
Machen wir jetzt den ersten Schritt in Richtung i18n-Unterstützung. Die folgende Beschreibung wurde der Flask-App hinzugefügt. [Referenzseite (Englisch)] In Link-1 ist es in "__init __. Py" geschrieben, aber welches ist besser?
app/hoge.py
app = Flask(__name__)
app.config.from_object(__name__)
from flask_babel import Babel
babel = Babel(app)
from config import LANGUAGES
@babel.localeselector
def get_locale():
return request.accept_languages.best_match(LANGUAGES.keys())
Als nächstes habe ich die folgenden Dateien vorbereitet.
config.py
# -*- coding: utf-8 -*-
#
# available languages
LANGUAGES = {
'en': 'English',
'ja': 'japanisch'
}
Es scheint, dass die Verwendung des Localeselector-Dekorators wie dieser es ermöglicht, auf Accept-Language zu reagieren. Und noch etwas, es scheint, dass die Einstellungsdatei von Babel selbst auch notwendig ist, also habe ich sie wie folgt erstellt. Die erste und zweite Zeile sind die zu übersetzenden Dateien, und die dritte Zeile scheint die Erweiterung von Babel zu aktivieren. Ich habe die Details der Erweiterung nicht untersucht.
babel.cfg
[python: **.py]
[jinja2: **/templates/**.tpl.html]
extensions=jinja2.ext.autoescape,jinja2.ext.with_
Lassen Sie uns zuerst mit der Vorlage spielen. In diesem Fall scheint "_ ()" ein Alias für "gettext ()" zu sein, daher habe ich die Stelle, an der es auf Englisch zu "Name" wird, wie folgt geändert.
show_person.tpl.html
<tr>
<td>{{ _('Name') }}</td>
<td>{{ person.name }}</td>
</tr>
Beim Übersetzen einer Nachricht, die geflasht werden soll, musste ich mich mit dem Code auf der Python-Seite herumschlagen, aber ich konnte ihn wie folgt implementieren.
hoge.py
from flask import flash
from flask_babel import gettext as _
@app.route('/logout')
def logout():
session.pop('logged_in', None)
flash(_("You were logged out"), 'success')
return redirect(url_for('show_hoge'))
Oben wird gettext als _ importiert, um es an der Vorlagenseite auszurichten. Wenn Sie Zahlen usw. eingeben möchten
hoge.py
flash(_("No Such Item with ID %(item_id)d", item_id=item_id), 'error')
Es scheint gut zu sein, es als zu tun.
Als nächstes habe ich den folgenden Befehl ausgeführt.
% pybabel extract -F babel.cfg -o message.pot hoge
Dies scheint eine Vorlagendatei zu erstellen. Betrachten Sie den Inhalt der Ausgabe message.pot
message.pot
# Translations template for PROJECT.
# Copyright (C) 2017 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2017.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2017-06-14 20:54+0900\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <[email protected]>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 2.4.0\n"
#: hoge/templates/show_person.tpl.html:10
msgid "Name"
msgstr ""
Es war so. Es scheint, dass es "Name" anstelle von msgid gibt, das früher für gettext verwendet wurde. Darüber hinaus scheint es eine Übersetzungsdatei zu erstellen, die auf dieser Datei basiert. Insbesondere habe ich den folgenden Befehl gedrückt.
% pybabel init -i message.pot -d hoge/translations -l ja
creating catalog hoge/translations/ja/LC_MESSAGES/messages.po based on message.pot
Die Po-Datei schien mit Poedit Poedit, das in [Referenzseite (Englisch)] Link-1 eingeführt wurde, einfach zu erstellen zu sein. Ich habe die generierte message.po geöffnet und "Name" als "Name" eingegeben, wie unten gezeigt.
In der bearbeiteten Datei wurde das Aktualisierungsdatum neu geschrieben, und natürlich wurde auch msgstr neu geschrieben, und X-Generator machte eine Selbstbehauptung. Ursprünglich scheint es danach "pybabel compile" zu machen, aber bei Verwendung von Poedit scheint es, dass automatisch eine Mo-Datei erstellt wird, die beim Speichern kompiliert wird (verwenden Sie Version 1.8.11).
In diesem Zustand wurde "Name" erfolgreich durch "Name" ersetzt, als die App im Browser angezeigt wurde. Außerdem konnte ich bestätigen, dass "Name" wieder angezeigt wird, wenn die englische Priorität in den Browsereinstellungen erhöht wird.
Beim Aktualisieren scheint die Po-Datei wie folgt aktualisiert zu werden.
pybabel extract -F babel.cfg -o message.pot hoge
pybabel update -i message.pot -d hoge/translations
Wenn es um Sätze geht, scheint es ziemlich schwierig zu sein, aber ich habe den Eindruck, dass es überraschend einfach ist, wenn es um Wörter geht. Es scheint mühsam zu sein, den Befehl beim Aktualisieren zu drücken, aber gibt es einen guten Weg?
Wie auch immer, es gibt kein Problem damit, es bei der Arbeit zu verwenden oder auf GitHub zu veröffentlichen !! Nun, das größte Problem ist, dass es bedeutungslos ist, wenn die Entwicklung der Anwendung selbst nicht voranschreitet !!
Recommended Posts