2012-04-10 9 views
18

के तहत गेटटेक्स्ट के लिए स्थानीय फ़ोल्डर में एक टेक्स्ट डोमेन को बाध्य कैसे करें, आप या तो डिफ़ॉल्ट सिस्टम-व्यापी लोकेल निर्देशिका का उपयोग कर सकते हैं, या bindtextdomain का उपयोग करके स्वयं को निर्दिष्ट कर सकते हैं। यह तब उपयोगी होता है जब प्रोग्राम से सीधे प्रोग्राम चलाया जाता है जब संकलित .mo अनुवाद फ़ाइलें सिस्टम के डिफ़ॉल्ट स्थान में उपलब्ध नहीं होती हैं।<code>gettext</code> के साथ GT123

अजगर में आप इस करना होगा:

import gettext 
from gettext import gettext as _ 
gettext.bindtextdomain('nautilus-image-manipulator', '/path/to/mo/folder') 
gettext.textdomain('nautilus-image-manipulator') 

जहां /path/to/mo/folder परिचित fr/LC_MESSAGES/nautilus-image-manipulator.mo संरचना में शामिल है। इस तरह कॉल:

print _("Delete this profile") 

वापसी स्थानीय मो फाइलें से ठीक से अनुवादित स्ट्रिंग , आपको बहुत बहुत धन्यवाद।

जीटीके + 2/पायगेट में, gtk.glade.bindtextdomain मौजूद था, लेकिन मुझे आश्चर्य है कि क्या GTK + 3/PyGObject में कोई समकक्ष है।

from gi.repository import Gtk 
builder = Gtk.Builder() 
builder.set_translation_domain('nautilus-image-manipulator') 
builder.add_from_file(ui_filename) 
return builder 

यूआई कि Glade फ़ाइल से बनाया नहीं कर रहे हैं (यानी कोड से सेट) उचित ढंग से प्रदर्शित के हिस्से:

आप एक विशिष्ट उदाहरण के लिए, यह कैसे Nautilus Image Manipulator;s UI अपने Glade फ़ाइल से बनाया जाता है अनुवादित है, लेकिन ग्लैड फ़ाइल से तार अभी भी अंग्रेजी में दिखाई देते हैं।

ऐसा लगता है कि पर कॉल करने से पहले मुझे किसी प्रकार के builder.bind_text_domain('nautilus-image-manipulator', '/path/to/mo/folder') पर कॉल याद आ रही है ... कोई विचार यह कैसे करना है?

+0

क्या आपने सामान्य 'gettext.bindtextdomain() 'की कोशिश की है? – ptomato

उत्तर

12

पीईजीटीके में आप जीटीके.बिल्डर का भी उपयोग कर सकते हैं। तदनुसार PyGTK Gtk.Builder प्रलेखन के लिए:

http://developer.gnome.org/pygtk/stable/class-gtkbuilder.html#properties-gtkbuilder

अनुवाद जब वे गुण मान इंटरफ़ेस विवरण में अनुवाद के रूप में चिह्नित किया गया है अनुवाद करने के लिए इस्तेमाल किया डोमेन। यदि अनुवाद डोमेन कोई नहीं है, तो GtkBuilder gettext() का उपयोग करता है, अन्यथा dgettext()। डिफ़ॉल्ट मान: कोई नहीं

यही है, Gtk.Builder "सी लाइब्रेरी" से dgettext() का उपयोग करता है। समस्या यह है कि पायथन का गेटटेक्स्ट मॉड्यूल, bindtextdomain(), किसी कारण से मुझे अज्ञात, "सी लाइब्रेरी" सेट न करें। विकल्प लोकेल मॉड्यूल का उपयोग करना है जो उस इंटरफेस को भी उजागर करता है।

http://docs.python.org/library/locale#access-to-message-catalogs

स्थान मॉड्यूल सिस्टम कि इस इंटरफेस प्रदान पर सी पुस्तकालय के gettext इंटरफेस को उजागर करता है: अजगर स्थान मॉड्यूल प्रलेखन से। इसमें फ़ंक्शन gettext(), dgettext(), dcgettext(), textdomain(), bindtextdomain(), और bind_textdomain_codeset() शामिल हैं। ये गेटटेक्स्ट मॉड्यूल में समान कार्यों के समान हैं, लेकिन संदेश कैटलॉग के लिए सी लाइब्रेरी के बाइनरी प्रारूप का उपयोग करें, और संदेश कैटलॉग को ढूंढने के लिए सी लाइब्रेरी के खोज एल्गोरिदम का उपयोग करें।

पायथन अनुप्रयोगों को आम तौर पर इन कार्यों को आमंत्रित करने की आवश्यकता नहीं होती है, और इसके बजाय गेटटेक्स्ट का उपयोग करना चाहिए। इस नियम के लिए एक ज्ञात अपवाद वे अनुप्रयोग हैं जो अतिरिक्त सी पुस्तकालयों से लिंक करते हैं जो आंतरिक रूप से gettext() या dcgettext() को आमंत्रित करते हैं। इन अनुप्रयोगों के लिए, टेक्स्ट डोमेन को बाध्य करने के लिए आवश्यक हो सकता है, ताकि पुस्तकालय ठीक से उनके संदेश कैटलॉग का पता लगा सकें।

जो वर्तमान मामला है। क्या एक हैक: एस

यह बात करेंगे, test.py दायर:

from gi.repository import Gtk 
from os.path import abspath, dirname, join 
import gettext 
import locale 

APP = 'myapp' 
WHERE_AM_I = abspath(dirname(__file__)) 
LOCALE_DIR = join(WHERE_AM_I, 'mo') 

locale.setlocale(locale.LC_ALL, '') 
locale.bindtextdomain(APP, LOCALE_DIR) 
gettext.bindtextdomain(APP, LOCALE_DIR) 
gettext.textdomain(APP) 
_ = gettext.gettext 

print('Using locale directory: {}'.format(LOCALE_DIR)) 

class MyApp(object): 

    def __init__(self): 
     # Build GUI 
     self.builder = Gtk.Builder() 
     self.glade_file = join(WHERE_AM_I, 'test.glade') 
     self.builder.set_translation_domain(APP) 
     self.builder.add_from_file(self.glade_file) 

     print(_('File')) 
     print(_('Edit')) 
     print(_('Find')) 
     print(_('View')) 
     print(_('Document')) 

     # Get objects 
     go = self.builder.get_object 
     self.window = go('window') 

     # Connect signals 
     self.builder.connect_signals(self) 

     # Everything is ready 
     self.window.show() 

    def main_quit(self, widget): 
     Gtk.main_quit() 

if __name__ == '__main__': 
    gui = MyApp() 
    Gtk.main() 

मेरे Glade फ़ाइल test.glade:

<?xml version="1.0" encoding="UTF-8"?> 
<interface> 
    <!-- interface-requires gtk+ 3.0 --> 
    <object class="GtkWindow" id="window"> 
    <property name="can_focus">False</property> 
    <property name="window_position">center-always</property> 
    <property name="default_width">400</property> 
    <signal name="destroy" handler="main_quit" swapped="no"/> 
    <child> 
     <object class="GtkBox" id="box1"> 
     <property name="visible">True</property> 
     <property name="can_focus">False</property> 
     <property name="orientation">vertical</property> 
     <child> 
      <object class="GtkLabel" id="label1"> 
      <property name="visible">True</property> 
      <property name="can_focus">False</property> 
      <property name="label" translatable="yes">File</property> 
      </object> 
      <packing> 
      <property name="expand">False</property> 
      <property name="fill">True</property> 
      <property name="position">0</property> 
      </packing> 
     </child> 
     <child> 
      <object class="GtkLabel" id="label2"> 
      <property name="visible">True</property> 
      <property name="can_focus">False</property> 
      <property name="label" translatable="yes">Edit</property> 
      </object> 
      <packing> 
      <property name="expand">False</property> 
      <property name="fill">True</property> 
      <property name="position">1</property> 
      </packing> 
     </child> 
     <child> 
      <object class="GtkLabel" id="label3"> 
      <property name="visible">True</property> 
      <property name="can_focus">False</property> 
      <property name="label" translatable="yes">Find</property> 
      </object> 
      <packing> 
      <property name="expand">False</property> 
      <property name="fill">True</property> 
      <property name="position">2</property> 
      </packing> 
     </child> 
     <child> 
      <object class="GtkLabel" id="label4"> 
      <property name="visible">True</property> 
      <property name="can_focus">False</property> 
      <property name="label" translatable="yes">View</property> 
      </object> 
      <packing> 
      <property name="expand">False</property> 
      <property name="fill">True</property> 
      <property name="position">3</property> 
      </packing> 
     </child> 
     <child> 
      <object class="GtkLabel" id="label5"> 
      <property name="visible">True</property> 
      <property name="can_focus">False</property> 
      <property name="label" translatable="yes">Document</property> 
      </object> 
      <packing> 
      <property name="expand">False</property> 
      <property name="fill">True</property> 
      <property name="position">4</property> 
      </packing> 
     </child> 
     </object> 
    </child> 
    </object> 
</interface> 

में मो बनाने के लिए याद रखें mo/LANG/LC_MESSAGES/myapp.mo के साथ निकाले गए .po पर आधारित:

xgettext --keyword=translatable --sort-output -o en.po test.glade 

यह क्या लगता है जैसे:

enter image description here

तरह

+0

धन्यवाद, यह ठीक काम करता है। लेकिन मैं सोच रहा हूं कि रेखा "locale.setlocale (locale.LC_ALL, '') वास्तव में क्या करती है - जब भी मैं इसे हटाता हूं तब भी मेरा एप्लिकेशन अनुवादित होता है ... क्या वह कॉल वास्तव में आवश्यक है? – oliver

+0

मैंने इसे यहां सुझाए गए अनुसार जोड़ा: http://docs.python.org/2/library/locale.html#locale.setlocale "यह उपयोगकर्ता की डिफ़ॉल्ट सेटिंग में सभी श्रेणियों के लिए लोकेल सेट करता है (आमतौर पर LANG में निर्दिष्ट वातावरण विविधता)।" यह उन मामलों में हो सकता है जहां आपकी रात किसी कारण से है LC_ * वैरिएबल एलसी_ALL से भिन्न है, मुझे लगता है, या मामले में कोई लोकेल चर नहीं है, लेकिन मुझे सच में यकीन नहीं है। – Havok

+0

मुझे पता है कि यह पुराना है, लेकिन मुझे अब इसका सामना करना पड़ रहा है ... यह विधि केवल लिनक्स पर काम करने लगती है, क्योंकि विंडोज में सीटे लाइब्रेरी नहीं है gettext – Zvika

0

समाधान का संबंध Windows के तहत जीटीके/अजगर में gettext अनुवाद को सक्रिय करने के elib_intl.py है यह गूगल के साथ फ़ाइल खोजने के लिए आसान है । यह एक ग्लैड यूआई में कोड और टेक्स्ट में पाठ के अनुवाद की अनुमति देता है।

विंडोज 7 अजगर 2.7 जीटीके 3+ द्वारा लोड:

यहाँ निम्नलिखित वातावरण के लिए इस्तेमाल किया कोड है pygi-aio-3.10.2-win32_rev18-setup.exe

यह काम करना चाहिए किसी भी खिड़कियों में और पायथन 3 के लिए भी। elib_intl.py का उपयोग pyGtk (gtk 2) के साथ किया जा सकता है।

from gi.repository import Gtk, Gdk 
import cairo 

import locale  #for multilanguage support 
import gettext 
import elib_intl 
elib_intl.install("pdfbooklet", "share/locale") 

आप जीटीके 3 उपयोग कर रहे हैं, तो आप शायद एक त्रुटि प्राप्त होगा: लाइन 447 के लिए:

libintl = cdll.intl 

यह त्रुटि इंगित करता है: मॉड्यूल नहीं मिला। कारण यह है कि जीटीके 3 में, डीएलएल का नाम बदल दिया गया है। यह अब intl.dll नहीं है। वर्णित पायगी स्थापना में नाम है: libintl-8। आप लाइन है जिसके द्वारा त्रुटि provoques बदलना होगा:

libintl = cdll.LoadLibrary("libintl-8.dll") 

आप एक पूरे उदाहरण यहाँ काम पा सकते हैं: pdfBooklet 2.4.0 (चेतावनी: अभी तक नहीं लाइन जब मैं लिखने में)

dieter Verfaillie करने के लिए धन्यवाद, जो है लिखित elib_intl

0

मैक ओएस एक्स उत्तर को आकर्षित करने के लिए इतनी दुखी विफलता के बाद, मुझे अपना खुद का शोध करना पड़ा।

import locale, ctypes, sys, os 
import gettext 

# setup textdomain and install _() for strings from python 
gettext.install('domain', '/path/to/locale/dir') 

try: 
    if hasattr(locale, 'bindtextdomain'): 
     libintl = locale 
    elif os.name == 'nt': 
     libintl = ctypes.cdll.LoadLibrary('libintl-8.dll') 
    elif sys.platform == 'darwin': 
     libintl = ctypes.cdll.LoadLibrary('libintl.dylib') 

    # setup the textdomain in gettext so Gtk3 can find it 
    libintl.bindtextdomain('domain', '/path/to/locale/dir') 

except (OSError, AttributeError): 
    # disable translations altogether for consistency 
    gettext.install('') 

बाद में, जब आप Gtk.Builder है, डोमेन सेट:: यहाँ टुकड़ा मैं का उपयोग करें

builder.set_translation_domain('domain') 

यह तभी gettext के पुस्तकालय libintl पुस्तकालय पथ में है काम करेंगे, नहीं तो असफल शान से। हस्तांतरण के लिए काम करने के लिए, आपको गेटटेक्स्ट को निर्भरता के रूप में स्थापित करने की आवश्यकता होगी।

संबंधित मुद्दे