Erstellen Sie eine Nachricht, die der Lokalisierung entspricht, mit einer Python-Übersetzungszeichenfolge

Erstellen Sie eine Nachricht, die der Lokalisierung entspricht, mit einer Python-Übersetzungszeichenfolge

Je nach Gebietsschema möchten Sie möglicherweise Fehlermeldungen trennen. Ich wusste nicht, was ich in einem solchen Fall tun sollte, also habe ich nachgeschlagen.

translationstring

Verwenden Sie translationstring. Dies scheint für die Lokalisierung in den Paketen verwendet zu werden, die sich auf das Pyrons-Projekt beziehen. Es scheint, dass es den gettext-Mechanismus verwendet, der häufig für die allgemeine Übersetzung verwendet wird.

Python-Seitencode

"Fehler" im japanischen Gebietsschema. Betrachten Sie ansonsten eine Zeichenfolge, die "Fehler" anzeigt.

Es scheint, dass die von translationstring.TranslationStringFactory generierte Funktion für die Notation verwendet werden sollte. Wickeln Sie es in ein Übersetzerobjekt, um den Wert zu konvertieren.

Zusätzlich zum folgenden Code benötigen Sie eine .mo-Datei.

translationstring_example.py

# -*- coding:utf-8 -*-
import gettext
import translationstring

# .So arbeiten Sie gut mit dem Tool zur Generierung von Po-Dateien_Es ist besser, es zu nennen
_ = translationstring.TranslationStringFactory('sample')

lang = gettext.translation("sample", "./locale", languages=["ja"], codeset="utf8")
translator = translationstring.Translator(lang)

print(translator(_("failure")))

Generieren Sie eine .mo-Datei

Die .mo-Datei ist das von gettext verwendete Format. Generiert aus einer .po-Datei mit einem Befehl mit msgfmt. Generieren Sie eine .po-Datei vor der .mo-Datei. Verwenden Sie dazu pot-create.

Lingua installieren

Ein Paket namens lingua generiert eine .po-Datei für Sie. ligua selbst benötigt kein babel, aber babel wurde angefordert, als versucht wurde, pot-create auszuführen.

pip install lingua babel

Generieren Sie eine .po-Datei

Nach der Installation von Lingua können Sie Pot-Create verwenden. Generieren Sie eine POO-Datei

mkdir -p locale/ja/LC_MESSAGES/
pot-create translation_example.py -o locale/ja/LC_MESSAGES/sample.po

Der Dateiname zum Umschreiben der generierten sample.po sollte mit dem an TranslationStringFactory übergebenen Domänennamen übereinstimmen.

Schreiben Sie wie folgt um. Ursprünglich ist es besser, Teile wie den Namen des Übersetzers neu zu schreiben. Diesmal habe ich gerade den letzten Teil umgeschrieben

# 
# SOME DESCRIPTIVE TITLE
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2014.
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE 1.0\n"
"POT-Creation-Date: 2014-06-12 15:37+09:00\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"
"Language: \n"

#: ./translation_example.py:11
#, c-format
msgid "failure"
msgstr "Fehlerwert"

Der Unterschied ist wie folgt

diff --git a/locale/ja/LC_MESSAGES/sample.po b/locale/ja/LC_MESSAGES/sample.po
index 2559ffb..db040c4 100644
--- a/locale/ja/LC_MESSAGES/sample.po
+++ b/locale/ja/LC_MESSAGES/sample.po
@@ -18,4 +18,4 @@ msgstr ""
 #: ./translation_example.py:11
 #, c-format
 msgid "failure"
-msgstr ""
+msgstr "Fehlerwert"

Erstellen einer .mo-Datei

Verwenden Sie msgfmt, um eine .mo-Datei zu erstellen.

msgfmt locale/ja/LC_MESSAGES/sample.po -o locale/ja/LC_MESSAGES/sample.mo

$ tree
.
├── locale
│   └── ja
│       └── LC_MESSAGES
│           ├── sample.mo
│           └── sample.po
├── requirements.txt
└── translation_example.py

3 directories, 4 files

Jetzt wird "Fehler" in "Fehlerwert" übersetzt und angezeigt.

$ python translation_example.py
Fehlerwert

Informationen zum Speicherort von ja / LC_MESSAGES / sample.mo

gettext überprüft die Gebietsschemainformationen und fragt nach der Zuordnung, die beim Übersetzen verwendet werden soll.

LANG="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_CTYPE="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_ALL=

Es scheint gut, gettext.find zu verwenden, um zu überprüfen, ob die .mo-Datei erfolgreich gelesen werden kann.

# -*- coding:utf-8 -*-
import gettext
print(gettext.find("sample", "./locale",["ja"]))
# ./locale/ja/LC_MESSAGES/sample.mo

Sie können herausfinden, wo Sie die .po-Datei erstellen können, indem Sie sich den Code gettext.find ansehen.

gettext.py

# Locate a .mo file using the gettext strategy
def find(domain, localedir=None, languages=None, all=False):
    # Get some reasonable defaults for arguments that were not supplied
    if localedir is None:
        localedir = _default_localedir
    if languages is None:
        languages = []
        for envar in ('LANGUAGE', 'LC_ALL', 'LC_MESSAGES', 'LANG'):
            val = os.environ.get(envar)
            if val:
                languages = val.split(':')
                break
        if 'C' not in languages:
            languages.append('C')
    # now normalize and expand the languages
    nelangs = []
    for lang in languages:
        for nelang in _expand_lang(lang):
            if nelang not in nelangs:
                nelangs.append(nelang)
    # select a language
    if all:
        result = []
    else:
        result = None
    for lang in nelangs:
        if lang == 'C':
            break
        mofile = os.path.join(localedir, lang, 'LC_MESSAGES', '%s.mo' % domain)
        if os.path.exists(mofile):
            if all:
                result.append(mofile)
            else:
                return mofile
    return result

Holen Sie sich ungefähr Sprachen wie "ja" von ('LANGUAGE', 'LC_ALL', 'LC_MESSAGES', 'LANG'), Sie können sehen, dass versucht wird, den Wert aus der .mo-Datei unter localedir / ja / LC_MESSAGS / abzurufen.

Informationen zur Übersetzung von Zeichenfolgen, die Argumente enthalten

Übersetzungszeichenfolge kann auch Sätze übersetzen, die Argumente enthalten.

msg2 = _("add-number", default="Add ${number}", mapping={"number": 1})

lang = gettext.translation("sample", "./locale", languages=["ja"], codeset="utf8")
translator = translationstring.Translator()

print(translator(_("add-number", mapping={"number": 10})))
#10 hinzufügen

Schreiben Sie zu diesem Zeitpunkt den .placeholder in $ {} in die .po-Datei, wie unten gezeigt.

msgid "add-number"
msgstr "${number}Bitte hinzufügen"

Recommended Posts

Erstellen Sie eine Nachricht, die der Lokalisierung entspricht, mit einer Python-Übersetzungszeichenfolge
Senden Sie eine Nachricht mit Python an LINE (LINE Notify)
Schritte zum Erstellen eines Twitter-Bots mit Python
Erstellen Sie ein Verzeichnis mit Python
So konvertieren / wiederherstellen Sie einen String mit [] in Python
[Python] So erstellen Sie mit Matplotlib ein zweidimensionales Histogramm
So installieren Sie NPI + Senden Sie eine Nachricht an Python
Erstellen Sie einen Mastodon-Bot mit einer Funktion, die automatisch mit Python antwortet
Wahrscheinlich der einfachste Weg, um mit Python 3 ein PDF zu erstellen
Erstellen Sie eine virtuelle Umgebung mit Python!
Senden Sie eine Nachricht an Google Hangouts Chat mit einem Thread (Python)
5 Möglichkeiten zum Erstellen eines Python-Chatbots
Erstellen Sie eine zufällige Zeichenfolge in Python
Konvertieren Sie in eine Zeichenfolge, während Sie die Standardausgabe mit dem Python-Unterprozess ausgeben
[Einführung in Python] So teilen Sie eine Zeichenfolge mit der Funktion split
Versuchen Sie, eine Python-Umgebung mit Visual Studio Code & WSL zu erstellen
Versuchen Sie, mit Python3 eine Zeichenfolge aus einem Bild zu extrahieren
Ich habe versucht, mit Python eine Liste von Primzahlen zu erstellen
Python vba zum Erstellen einer Datumszeichenfolge zum Erstellen eines Dateinamens
Erstellen Sie mit Class einen Python-Funktionsdekorator
[Python] Erstellen Sie mit Anaconda eine virtuelle Umgebung
Erstellen wir mit Python eine kostenlose Gruppe
[Python] So invertieren Sie eine Zeichenfolge
Erstellen Sie mit Python 3.4 einen Worthäufigkeitszähler
Ich habe versucht, ein Programm zu erstellen, das Hexadezimalzahlen mit Python in Dezimalzahlen konvertiert
Erstellen Sie mit Mecab aus Python3 ein Tool, das Furigana automatisch mit HTML schüttelt
Vorgehensweise zum Erstellen einer virtuellen Python-Umgebung mit VS-Code unter Windows
Beachten Sie, dass Djangos Runserver in Python 2.7.11, das mit Homebrew geliefert wird, Moos ist
[Einführung in Python] So schreiben Sie eine Zeichenfolge mit der Formatierungsfunktion
[Outlook] Ich habe versucht, mit Python automatisch eine tägliche Berichtsmail zu erstellen
3. Verarbeitung natürlicher Sprache mit Python 1-2. So erstellen Sie einen Korpus: Aozora Bunko
Senden Sie eine Nachricht von Slack an einen Python-Server
Erstellen Sie mit tkinter [Python] einen Rahmen mit transparentem Hintergrund.
Bearbeiten Sie Excel in Python, um eine Pivot-Tabelle zu erstellen
Lesen einer CSV-Datei mit Python 2/3
So senden Sie eine Nachricht mit Curl an LINE
Einbetten von Variablen in Python-Strings
So erstellen Sie ein Funktionsobjekt aus einer Zeichenfolge
Versuchen Sie, mit Python eine Lebenskurve zu zeichnen
Erstellen Sie eine virtuelle Umgebung mit conda in Python
[Hinweis] Erstellen Sie mit Python eine einzeilige Zeitzonenklasse
Sie können auch mit Python problemlos eine GUI erstellen
Erstellen Sie mit Sublime Text3 eine Python3-Build-Umgebung
Versuchen Sie, in Python einen "Entschlüsselungs" -Code zu erstellen
Erstellen Sie eine Farbleiste mit Python + Qt (PySide)
Entscheide dich für einen Laborauftrag mit Python (Fiktion)
Python Hinweis: Wenn Sie einer Zeichenfolge einen Wert zuweisen
Erstellen Sie mit Python einen Entscheidungsbaum von 0 (1. Übersicht)
Erstellen Sie mit Python + Qt (PySide) ein farbspezifisches Widget.
Versuchen Sie, mit Python eine Diedergruppe zu bilden
Verfahren zur Erstellung plattformübergreifender Apps mit kivy
Erstellen Sie mit Python eine Datei im Photoshop-Format (.psd)
Erstellen Sie einfach eine Python-Konsolenanwendung mit Click
Entschlüsseln Sie eine unter iOS mit Python verschlüsselte Zeichenfolge
Ich möchte mit Python in eine Datei schreiben