Multilinguale plugins: Gibt es nur eine Translation- Table für Texte ?

  • Ich wurstle mich grad so ein wenig durch Python- Quelltext und interpretiere da ein wenig was rein:
    Wenn ein Text so im Quelltext steht:


    _("This is a text")


    dann wird das von Python automatisch als zu "übersetzender" Text erkannt.
    Die Übersetzung holt er sich aus der de.po - Datei.


    Das würde aber bedeuten, dass man neue Texte aus seinen Plugins immer dort übersetzen lassen müsste. Wie geht sowas von statten ? Oder kann man auch "plugin-spezifische" übersetzungs- Dateien hinterlegen ?


    Gruß
    Tode

  • Dazu gibt es auf enigma2-devel und vermutlich auch hier im Forum diverse Diskussionen.


    Kurz: Python unterstützt nur eine Datenbank gleichzeitig via gettext, daher gibt es soweit keine Pluginspezifischen Übersetzungen. Es wurde bis jetzt noch kein zufriedenstellender Kompromiss gefunden und/oder implementiert.


    Zu dem "wie" kann ich dir die gettext Dokumentation nahe legen.
    Kurz: msgid der str in python, msgstr der übersetzte str. Die Einträge können auch automatisiert erstellt werden (ist auch sauberer so), dazu siehe wieder gettext Doku und die diversen e2 spezifischen Diskussionen :winking_face:

    Homescreen eurer Apple-Geräte noch nicht voll genug?


    dreaMote: Fernbedienung für Dreamboxen
    Mobile WOL: Wake-on-LAN Client für iOS mit optionalem Widget
    My Home Remote: Fernkontrolle für Homematic CCU/CCU2 optimiert für mobile Benutzung

  • na ja so ganz stimmt das nicht (mehr).


    Barry Allen hat seine eigenen po files und um leichter testen zu können habe ich mir auch eine eigene Language Umschaltung mit eingebaut statt die default language die im enigma2 verwendet wird zu benutzen (du kannst also deutsches BA in spanischem enigma2 haben und umgekehrt)


    Hintergrund war und ist das ich nicht nur Language support im python sondern auch im shell script von BA wollte (das die eigentliche Arbeit tut) und dafür pro sprache ein eigenes pofile verwenden wollte wo sowohl die plugin/Webif python messages als auch die shellmessages (die teilweise ident sind) drinnen sind.


    schau dir im plugin.py von BA an wie man die entsprechenden gettext Umgebungen setzt - sind nur ein paar codezeilen.


    Wenn du dir die sparen willst ist es natürlich aber am einfachsten die standard po files vom enigma2 zu erweitern oder sogar die dort verwendeten standard texte zu recyclen.


    Und im BA werden für die unterstützten sprachen auch die po files immer mitgeliefert (/media/ba/locale), aus denen du am PC beim editieren mit poedit auch gleich die mo files machen kannst di dann zur laufzeit verwendet werden.


    LG
    gutemine

    Einmal editiert, zuletzt von Lost in Translation ()

  • Hi gutemine.


    Das wäre auch ein Thema, das mich interessiert. Habs bei mir so gemacht...



    Ich muss nun bei mir in den Sourcen die getText Funktion importieren...danach werden aus einer Datei mit dem Namen der OSD-Sprache (z.B. de_DE) einmalig die Texte gelesen. Nur muss ich hier alle zu übersetzenden Texte mit:


    /usr/LTMenu/language/de_DE:

    Zitat

    "my friend" : "mein Freund"


    print getText("my friend")


    >mein Freund


    Und das ist sehr mühsam, alle Texte in den SOurcen anzupassen. Ich habe gerade deine Sourcen nicht zur Hand. Kannst du kurz beschreiben, wie du das machst?

    MfG Ali

    DM8000 | DM8000 | DM500HD | DM500HD | DM7020S


    Bash
    #!/bin/sh
    while [ 1 ]
    do
    	echo "i love my dreams!!!"
    	sleep 1
    done
  • so ist es wirklich mühsam.


    Hier der entsprechende code ausschnitt - im Prinzip musst du nur die Umgebungsavriablen richtig machen und die Pfade setzen - und ich habe im mittleren teil noch mein eigenes language einstellungsfile wo z.B. de drinnen steht und daraus wird de_de gemacht. Dann einfach _ auf gettext.gettext umdefinieren und schon geht es im Rest des plugin.py so wie am Anfang des Threads beschrieben.



    os.environ['LANGUAGE']='en'
    os.environ['TEXTDOMAIN']='barryallen'
    os.environ['TEXTDOMAINDIR']='/media/ba/locale'
    ba_language='en'


    if os.path.exists(barryallen_language) == True:
    fp = open(barryallen_language,"r")
    line =fp.readline()
    fp.close()
    ba_language = "%s%s" % (line[0], line[1])
    os.environ['LANGUAGE']='%s' % ba_language


    gettext.bindtextdomain('barryallen', '/media/ba/locale')
    gettext.textdomain('barryallen')


    _=gettext.gettext

    3 Mal editiert, zuletzt von Lost in Translation ()



  • Can you tell how this menu should start ?? Is it in Autostart mode ??

  • Here is the finished version:



    A little bit dirty in the getLanguage part, but E2 is setting too late the OSD-language and if you have an autostarting tool the language can be only loaded like this. :frowning_face: (the language.getLanguage() part caused problems)...


    You don't need to autostart this function. You can make it in an own Translation.py. Then you can import it in every .py file you want... maybe like this:


    Python
    from Components.Translation import getText
    __ = getText
    
    
    print _("This one is using the CVS-Translation")
    print __("This one is using my own Translation")


    Maybe not the best way but it works here perfect :winking_face:


    Good luck.

    MfG Ali

    DM8000 | DM8000 | DM500HD | DM500HD | DM7020S


    Bash
    #!/bin/sh
    while [ 1 ]
    do
    	echo "i love my dreams!!!"
    	sleep 1
    done
  • You only have to import the fileExists function from Tools.Directories :grinning_squinting_face:

    MfG Ali

    DM8000 | DM8000 | DM500HD | DM500HD | DM7020S


    Bash
    #!/bin/sh
    while [ 1 ]
    do
    	echo "i love my dreams!!!"
    	sleep 1
    done
  • AliAbdul1978
    bei uns ist das ein autostart plugin


    den teil versteh ich nicht


    ging doch einfacher mit:
    self.lng = config.osd.language.value

  • Es greifen beim Bootvorgang einige Sachen aus unseren Sourcen auf die zu übersetztenden Texte zu, wo die Configs nicht geladen sind.


    Ich habe weder mit config.osd.language.value noch mit language.getLanguage() was erreicht, daher die etwas dirty Variante.

    MfG Ali

    DM8000 | DM8000 | DM500HD | DM500HD | DM7020S


    Bash
    #!/bin/sh
    while [ 1 ]
    do
    	echo "i love my dreams!!!"
    	sleep 1
    done
  • und wenn ich die zur laufzeit von e2 ändere muss ich bei deiner version enigma2 neustarten
    um in eurem menu die sprache zuhaben oder ?

  • Naja, man flasht sich ein Image, stellt alles ein und startet neu. So macht es ein "normaler" User. Dann speichert nämlich auch E2 alle configs anständig.


    Und ich kenne jetzt Keinen, der die Sprachen stündlich/täglich ändert. Warum auch, man hat eine Muttersprache und die bleibt normalerweise über Nacht noch bestehen.

    MfG Ali

    DM8000 | DM8000 | DM500HD | DM500HD | DM7020S


    Bash
    #!/bin/sh
    while [ 1 ]
    do
    	echo "i love my dreams!!!"
    	sleep 1
    done
  • Screen <class 'test_menu.TEST'>((), {}): <type 'exceptions.TypeError'>
    Traceback (most recent call last):
    File "/usr/lib/enigma2/python/mytest.py", line 214, in create
    return screen(self, *arguments, **kwargs)
    File "/usr/lib/enigma2/python/Screens/test_menu.py", line 86, in __init__
    list.append(TestEntry(__("Test", "test.png")))
    TypeError: getText() takes exactly 1 argument (2 given)


    Error :frowning_face:


    in code:


    list.append(TestEntry(__("Test", "test.png")))



    :frowning_face:

  • Try this one:

    Code
    list.append(TestEntry(__("Test"), "test.png"))



    Good luck.

    MfG Ali

    DM8000 | DM8000 | DM500HD | DM500HD | DM7020S


    Bash
    #!/bin/sh
    while [ 1 ]
    do
    	echo "i love my dreams!!!"
    	sleep 1
    done
  • I have used following piece of code for my plugin:



    It works very well. Just import the "_" from the module where you have these definitions into modules that need your plugin translations.


    In this case the text domain is hard-coded into _() function, so you can have normal _("text") translations in your plugin.

    2 Mal editiert, zuletzt von tero_ ()

  • Zitat

    Originally posted by AliAbdul1978
    Try this one:

    Code
    list.append(TestEntry(__("Test"), "test.png"))



    Good luck.


    Yes, that way it was working.


    But, i think we need to change the code. Because native signs in your native language are not supported - for example in french.