ग्लेड लोड ट्रांसलेशन / ऑप्ट से कैसे करें


9

मैंने एक एप्लिकेशन बनाया है जिसे मैं उबंटू ऐप डेवलपर प्रक्रिया के माध्यम से सबमिट करना चाहता हूं । प्रक्रिया के लिए आवश्यकताओं में से एक यह है कि स्थापित होने पर, सभी फाइलें /opt/extras.ubuntu.com/<appname>निर्देशिका में जाती हैं।

पैकेजिंग में बदलाव और दूसरों की मदद से जो मैंने हासिल किया है, लेकिन अब मुझे एक नई समस्या का सामना करना पड़ रहा है: जब /optमेरे ऐप से अनुवाद से लोड नहीं हो रहा है।

निम्नलिखित क्या होता है: जब तक अन्यथा निर्दिष्ट नहीं किया जाता है, एक आवेदन के लिए अनुवाद /usr/share/locale(या उबंटू के मामले में /usr/share/locale-langpack) से भरी हुई बाइनरी फाइलें (एमओ फाइलें ), लेकिन मेरे ऐप में, /optआवश्यकता के कारण , वे स्थापित हैं /opt/extras.ubuntu.com/qreator/locale

सिद्धांत रूप में यह ठीक है, क्योंकि गेटटेक्स्ट अनुवादों को लोड करने के लिए एक वैकल्पिक स्थान निर्दिष्ट करने की अनुमति देता है, इसलिए मैं bindtextdomainइसे प्राप्त करने के लिए कॉल जोड़ता हूं :

import gettext
from gettext import gettext as _
gettext.bindtextdomain('qreator', '/opt/extras.ubuntu.com/qreator/share/locale/')
gettext.textdomain('qreator')

यह एक बिंदु तक अच्छी तरह से काम करता है: सभी संदेश जो कमांड लाइन पर आउटपुट होते हैं, फिर अपेक्षित रूप से अनुवादित होते हैं। लेकिन यह मुख्य समस्या को हल नहीं करता है : यूआई ग्लेड से अनुवादों को लोड करने के लिए अनुवाद डोमेन को एक बार फिर निर्दिष्ट करने की आवश्यकता है ( gettext.textdomain('qreator')ऊपर दी गई कॉल के बराबर ), लेकिन यह निर्दिष्ट नहीं होने देता है कि अनुवाद कहां से लोड करना है (यानी ग्लेड के बराबर) bindtextdomain, जो दुख की बात नहीं है)। यहां उस कोड का एक उद्धरण दिया गया है जिसका मैं उपयोग कर रहा हूं:

builder = Gtk.Builder()
builder.set_translation_domain('qreator')
# There isn't a way to tell glade to load translations from
# somewhere else than /usr/share/locale here
builder.add_from_file(ui_filename)

यह अनिवार्य रूप से इसका मतलब है कि यदि आपका ऐप इंस्टॉल है तो UI से अनुवाद लोड नहीं किया जा सकता है /opt

मैं इस बिंदु पर बहुत फंस गया हूं। के /opt/extras.ubuntu.com/qreator/share/locale/बजाय से ग्लेड लोड अनुवाद बनाने के लिए कैसे पर कोई विचार /usr/share/locale?


Gtk.Builder पर किसी अधिक जानकार से बात करने के बाद, मैंने एक बग दर्ज किया है: Bugzilla.gnome.org/show_bug.cgi?id=676543
डेविड प्लेनेला

मुझे वर्कअराउंड की ओर भी इशारा किया गया है, लेकिन यह मेरे लिए काम नहीं करता था - यहाँ यह है: Bugs.debian.org/cgi-bin/bugreport.cgi?bug=114461#12
David Planella

क्या आप अपने अजगर कोड में एक पूर्ण न्यूनतम रननीय उदाहरण शामिल कर सकते हैं? मुझे इसमें कमी करने की खुशी है, लेकिन मुझे यकीन नहीं है कि Gtk.Builder () पाने के लिए मैं क्या आयात कर रहा हूं।
स्लैंगसेक

n / m, जाहिरा तौर पर यह सिर्फ 'आयात gtk' है;)
slangasek

1
/: - सही मैंने छोड़ दिया, वहाँ gettext.bindtextdomain कोई समझदार तरीका करने के लिए मिलता है () Glade के लिए पकड़ लेने के लिए हो रहा है
slangasek

जवाबों:


10

मुझे एक समाधान मिला है: गेटटेक्स्ट के स्थान पर लोकल पायथन मॉड्यूल का उपयोग करें

import locale
from locale import gettext as _
locale.bindtextdomain('qreator', '/opt/extras.ubuntu.com/qreator/share/locale/')
locale.textdomain('qreator')

स्पष्टीकरण प्रदान करने के लिए # gtk + IRC चैनल पर जूहा सहंगास का धन्यवाद:

इस विशेष मामले के लिए लोकल मॉड्यूल को गेटटेक्स्ट के बजाय उपयोग करने की आवश्यकता है । पायथन का गेटटेक्स्ट मॉड्यूल शुद्ध पायथन है, यह वास्तव में टेक्स्ट डोमेन को इस तरह से सेट नहीं करता है कि C लाइब्रेरी पढ़ सकता है, लेकिन लोकेल करता है (libc कॉल करके)। जब तक ऐसा किया जाता है, तब तक GtkBuilder पहले से ही उस तरह से काम करता है जैसे आप उससे पूछ रहे हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.