argparse i18n

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Georg
User
Beiträge: 18
Registriert: Mittwoch 29. August 2007, 17:01

Lassen sich die in argparse eingebauten Meldungen übersetzen?, mit gettext ?

z.B. "usage", "error", "unrecognized arguments"
lunar

@Georg: Ein Blick in den Quelltext zeigt, dass "argparse" "gettext" nutzt.
Georg
User
Beiträge: 18
Registriert: Mittwoch 29. August 2007, 17:01

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?
deets

Na, die globale Domain. Die kannst du setzen wie du willst.
Georg
User
Beiträge: 18
Registriert: Mittwoch 29. August 2007, 17:01

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.py

Code: Alles auswählen

import gettext
gettext.install('kullulu', 'locale')

import argparse
parser = argparse.ArgumentParser( description='...' )
parser.parse_args()
Ich 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 ?
deets

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.
Georg
User
Beiträge: 18
Registriert: Mittwoch 29. August 2007, 17:01

deets hat geschrieben:Warum importierst du argparse erst, nachdem du eine text-domain erstellt hast?
Weil ich mir vorstelle, dass während des Imports von argparse die Übersetzungen bekannt sein müssen.
deets hat geschrieben:Dafuer spricht auch, dass es ohne den import geht.
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

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.
Georg
User
Beiträge: 18
Registriert: Mittwoch 29. August 2007, 17:01

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.
Stimmt, das habe ich jetzt verstanden.
deets hat geschrieben:Versuch also doch einfach mal, das argparse-modul *vor* gettext zu importieren.
Scheint trotzdem nicht zu funktionieren:

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
argparse antwortet immer noch mit "usage: " anstatt "Verwendung: "
deets

Koenntest du ein Archiv zur Verfuegung stellen mit allem drin, damit ich mal damit spielen kann?
Georg
User
Beiträge: 18
Registriert: Mittwoch 29. August 2007, 17:01

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

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
deets

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.
deets

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.

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
Georg
User
Beiträge: 18
Registriert: Mittwoch 29. August 2007, 17:01

Dankeschön.
Mit "messages" hat es bei mir funktioniert, mit "kullulu" nicht.

Anscheinend
- gibt es eine Voreinstellung "messages"
- braucht es außer gettext.bindtextdomain(...) noch eine Reparatur.
Antworten