Lassen sich die in argparse eingebauten Meldungen übersetzen?, mit gettext ?
z.B. "usage", "error", "unrecognized arguments"
argparse i18n
Anscheinend aber nicht so wie in file:///usr/share/doc/python3/html/library/gettext.html#internationalizing-your-programs-and-modules beschrieben.
Wenn ich in argparse.py gettext abschalte,
Zeile 91 #from gettext import gettext as _
gemäß "22.1.3.2. Localizing your application", dann funktioniert alles. Aber so war das wohl nicht gedacht.
Welche .mo-Datei will argparse benutzen?
Wenn ich in argparse.py gettext abschalte,
Zeile 91 #from gettext import gettext as _
gemäß "22.1.3.2. Localizing your application", dann funktioniert alles. Aber so war das wohl nicht gedacht.
Welche .mo-Datei will argparse benutzen?
Ich versuche mich zu halten an
file:///usr/share/doc/python3/html/library/gettext.html#internationalizing-your-programs-and-modules
22.1.3.2. Localizing your application
$ grep -v '^#' gettext_argparse.pyIch lasse das Modul argparse unverändert, und provoziere mit einer ungültigen Option ein paar Meldungen von argparse. Sie werden nicht übersetzt :
$ grep 'from gettext import gettext as _' /usr/local/lib/python3.1/dist-packages/argparse-1.2.1-py3.1.egg/argparse.py
from gettext import gettext as _
$ p3 gettext_argparse.py -d unbekannt
usage: gettext_argparse.py [-h]
gettext_argparse.py: error: unrecognized arguments: -d unbekannt
Dann schalte ich versuchsweise im Modul argparse den Import der Funktion _() ab, woraufhin meine Übersetzungen erscheinen:
$ grep 'from gettext import gettext as _' /usr/local/lib/python3.1/dist-packages/argparse-1.2.1-py3.1.egg/argparse.py
# from gettext import gettext as _
$ p3 gettext_argparse.py -d unbekannt
Verwendung: gettext_argparse.py [-h]
gettext_argparse.py: Fehler: unbekannte Argumente: -d unbekannt
Aber ich will das Modul argparse eigentlich nicht ändern.
Meine globale Domain ist also 'kullulu' ?
Wie teile ich sie argparse mit ?
file:///usr/share/doc/python3/html/library/gettext.html#internationalizing-your-programs-and-modules
22.1.3.2. Localizing your application
$ grep -v '^#' gettext_argparse.py
Code: Alles auswählen
import gettext
gettext.install('kullulu', 'locale')
import argparse
parser = argparse.ArgumentParser( description='...' )
parser.parse_args()
$ grep 'from gettext import gettext as _' /usr/local/lib/python3.1/dist-packages/argparse-1.2.1-py3.1.egg/argparse.py
from gettext import gettext as _
$ p3 gettext_argparse.py -d unbekannt
usage: gettext_argparse.py [-h]
gettext_argparse.py: error: unrecognized arguments: -d unbekannt
Dann schalte ich versuchsweise im Modul argparse den Import der Funktion _() ab, woraufhin meine Übersetzungen erscheinen:
$ grep 'from gettext import gettext as _' /usr/local/lib/python3.1/dist-packages/argparse-1.2.1-py3.1.egg/argparse.py
# from gettext import gettext as _
$ p3 gettext_argparse.py -d unbekannt
Verwendung: gettext_argparse.py [-h]
gettext_argparse.py: Fehler: unbekannte Argumente: -d unbekannt
Aber ich will das Modul argparse eigentlich nicht ändern.
Meine globale Domain ist also 'kullulu' ?
Wie teile ich sie argparse mit ?
Warum importierst du argparse erst, nachdem du eine text-domain erstellt hast? Das koennte da seiteneffekte bewirken. Dafuer spricht auch, dass es ohne den import geht.
Weil ich mir vorstelle, dass während des Imports von argparse die Übersetzungen bekannt sein müssen.deets hat geschrieben:Warum importierst du argparse erst, nachdem du eine text-domain erstellt hast?
Das verstehe ich nicht. Durch das Abschalten von "from gettext import gettext as _" habe ich verhindert, dass meine Methode _ überschrieben wird. Sie konnte übersetzen. Das kann sie doch nur, wenn sie definiert ist, bevor argparse importiert wird. Wie würdest du die fünf Python-Zeilen anordnen?deets hat geschrieben:Dafuer spricht auch, dass es ohne den import geht.
Deine Vorstellung ist falsch. Der von Lunar gezeigte Quelltext zeigt, dass die _-Aufrufe dynamisch sind - nicht zur modul-lade-zeit, sonder wann auch immer die Funktion(alitaet) konkret benutzt wird.
Versuch also doch einfach mal, das argparse-modul *vor* gettext zu importieren.
Versuch also doch einfach mal, das argparse-modul *vor* gettext zu importieren.
Stimmt, das habe ich jetzt verstanden.deets hat geschrieben:Deine Vorstellung ist falsch. Der von Lunar gezeigte Quelltext zeigt, dass die _-Aufrufe dynamisch sind - nicht zur modul-lade-zeit, sonder wann auch immer die Funktion(alitaet) konkret benutzt wird.
Scheint trotzdem nicht zu funktionieren:deets hat geschrieben:Versuch also doch einfach mal, das argparse-modul *vor* gettext zu importieren.
Code: Alles auswählen
import argparse # darin Zeile 91 : from gettext import gettext as _
# doc/python3/html/library/gettext.html
# #internationalizing-your-programs-and-modules
# 22.1.3.2. Localizing your application
import gettext
gettext.install('kullulu', 'locale')
print( 'Test des Eintrags "usage: " in der Datei de/LC_MESSAGES/kullulu.mo' )
print( _( 'usage: ' ) )
parser = argparse.ArgumentParser( description='...' )
parser.parse_args()
Code: Alles auswählen
$ p3 gettext_argparse.py -falsch
Test des Eintrags "usage: " in der Datei de/LC_MESSAGES/kullulu.mo
Verwendung:
usage: gettext_argparse.py [-h]
gettext_argparse.py: error: unrecognized arguments: -falsch
Koenntest du ein Archiv zur Verfuegung stellen mit allem drin, damit ich mal damit spielen kann?
Ja, gerne, aber wie?
Ich finde keine Anhang-Möglichkeit und Pastebin hat etwas gegen meine Datei-Endungen.
Hier die Dateien de.po ( für kullulu.mo ) und gettext_argparse.py
Ich finde keine Anhang-Möglichkeit und Pastebin hat etwas gegen meine Datei-Endungen.
Hier die Dateien de.po ( für kullulu.mo ) und gettext_argparse.py
Code: Alles auswählen
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR ORGANIZATION
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"POT-Creation-Date: 2012-01-02 06:59+CET\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: pygettext.py 1.5\n"
msgid "Chit"
msgstr "Zettel"
msgid "'required' is an invalid argument for positionals"
msgstr "'required' ist für positionals ungültig"
msgid "usage: "
msgstr "Verwendung: "
Code: Alles auswählen
#@+leo-ver=5-thin
#@+node:gg.20120102160601.1165: * @file gettext_argparse.py
import argparse # darin Zeile 91 : from gettext import gettext as _
# doc/python3/html/library/gettext.html
# #internationalizing-your-programs-and-modules
# 22.1.3.2. Localizing your application
import gettext
gettext.install('kullulu', 'locale')
print( 'Test des Eintrags "usage: " in der Datei de/LC_MESSAGES/kullulu.mo' )
print( _( 'usage: ' ) )
parser = argparse.ArgumentParser( description='...' )
parser.parse_args()
#@-leo
kannst du nicht irgendwo einen pastebin oder upload-server finden? mir geht's ja genau darum *nicht* die mo-files und directory-strukturen anlegen zu muessen. Du kannst mir das auch privat mailen, ich schick dir meine mail per PM.
ok, so geht's - und der spaete import muss auch sein, denke ich - sonst kannst du die anderen texte (optional arguments usw) nicht uebersetzen, die werden tatsaechlich schon beim modul-laden erzeugt. Ehrlich gesagt halte ich das ganze fuer total beschissen gemacht - gettext ist in python wirklich scheisse, und die art, wie argparse damit umgeht auch nicht wirklich gut.
Ah, musste alles auf "messages" als domain umbiegen, aber das kriegt man vll. geregelt.
Ah, musste alles auf "messages" als domain umbiegen, aber das kriegt man vll. geregelt.
Code: Alles auswählen
#@+leo-ver=5-thin
#@+node:gg.20120102160601.1165: * @file gettext_argparse.py
# doc/python3/html/library/gettext.html
# #internationalizing-your-programs-and-modules
# 22.1.3.2. Localizing your application
import gettext
gettext.install('messages', 'locale')
gettext.bindtextdomain("messages", "locale")
import argparse # darin Zeile 91 : from gettext import gettext as _
print( 'Test des Eintrags "usage: " in der Datei de/LC_MESSAGES/kullulu.mo' )
print( _( 'usage: ' ) )
parser = argparse.ArgumentParser( description='...' )
parser.parse_args()
#@-leo