วิธีทำให้ Glade โหลดการแปลจาก / opt


9

ฉันได้สร้างโปรแกรมประยุกต์ที่ฉันต้องการที่จะส่งผ่านUbuntu แอปนักพัฒนากระบวนการ หนึ่งในข้อกำหนดสำหรับกระบวนการคือเมื่อติดตั้งแล้วไฟล์ทั้งหมดจะเข้าสู่/opt/extras.ubuntu.com/<appname>ไดเรกทอรี

ผ่านการเปลี่ยนแปลงของบรรจุภัณฑ์และด้วยความช่วยเหลือจากผู้อื่นฉันได้รับสิ่งนั้น แต่ตอนนี้ฉันกำลังประสบปัญหาใหม่: เมื่อเรียกใช้จาก/optการแปลจากแอพของฉันไม่ได้ถูกโหลด

สิ่งที่เกิดขึ้นมีดังต่อไปนี้: เว้นแต่จะระบุไว้เป็นอย่างอื่นไฟล์ไบนารี (ไฟล์ MO) ที่มีการแปลสำหรับแอปพลิเคชันจะโหลดจาก/usr/share/locale(หรือในกรณีของ Ubuntu จาก/usr/share/locale-langpack) แต่ในแอปของฉันเนื่องจาก/optความต้องการ/opt/extras.ubuntu.com/qreator/locale.

เป็นไปตามทฤษฎีที่ดีเนื่องจากgettextอนุญาตให้ระบุตำแหน่งอื่นเพื่อโหลดการแปลดังนั้นฉันจึงเพิ่มการbindtextdomainโทรเพื่อให้บรรลุ:

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

ใช้งานได้ดีจนถึงจุดหนึ่ง: ข้อความทั้งหมดที่ส่งออกในบรรทัดคำสั่งจะปรากฏขึ้นตามที่คาดไว้ แต่มันไม่ได้แก้ปัญหาหลัก : การโหลดการแปลจาก UI Glade ต้องระบุโดเมนการแปลอีกครั้ง (เทียบเท่ากับการgettext.textdomain('qreator')โทรด้านบน) แต่มันไม่อนุญาตให้ระบุการโหลดการแปลจาก (เช่น Glade เทียบเท่ากับ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ไม่สามารถโหลดแอปของคุณถ้ามีการติดตั้งใน

ฉันติดอยู่ที่จุดนี้มาก แนวคิดใด ๆ เกี่ยวกับวิธีการแปล Glade ที่โหลดจาก/opt/extras.ubuntu.com/qreator/share/locale/แทนที่จะเป็น/usr/share/localeอย่างไร


หลังจากพูดคุยกับใครบางคนที่มีความรู้เกี่ยวกับ Gtk.Builder มากขึ้นฉันได้ยื่นข้อผิดพลาด: bugzilla.gnome.org/show_bug.cgi?id=676543
David Planella

ฉันยังได้รับการชี้ให้เห็นถึงวิธีการแก้ปัญหา แต่มันก็ไม่ได้ผลสำหรับฉัน - นี่คือ: bugs.debian.org/cgi-bin/bugreport.cgi?bug=114461#12
David Planella

คุณสามารถรวมตัวอย่างที่สามารถรันได้น้อยที่สุดในโค้ดไพ ธ อนของคุณได้ไหม? ฉันยินดีที่จะเจาะลึกลงไปในเรื่องนี้ แต่ฉันไม่แน่ใจว่าสิ่งใดที่การนำเข้าฉันขาดหายไปเพื่อรับ Gtk.Builder ()
slangasek

ไม่มี / เห็นได้ชัดว่าเป็นเพียง 'import gtk';)
slangasek

1
ถูก - ฉันยอมแพ้ดูเหมือนว่าจะไม่มีวิธีที่มีเหตุผลที่จะได้รับ gettext.bindtextdomain () เพื่อเก็บไว้สำหรับบึง: /
slangasek

คำตอบ:


10

ฉันพบวิธีแก้ปัญหา: ใช้มอดู Python แทนgettext

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

ขอบคุณ Juha Sahakangas ในช่อง # gtk + IRC ที่ให้คำอธิบาย:

สำหรับกรณีนี้โดยเฉพาะอย่างยิ่งสถานโมดูลความต้องการที่จะนำมาใช้แทนgettext โมดูลgettextของไพ ธ อนเป็นไพ ธ อนแท้ๆมันไม่ได้ตั้งค่าโดเมนข้อความในแบบที่ไลบรารี C สามารถอ่านได้ แต่โลแคลทำ (โดยการเรียก libc) ตราบใดที่คุณทำเช่นนั้น GtkBuilder จะทำงานในแบบที่คุณต้องการ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.