Cara membuat Glade memuat terjemahan dari / opt

9

Saya telah membuat aplikasi yang ingin saya kirim melalui proses pengembang aplikasi Ubuntu . Salah satu persyaratan untuk proses ini adalah bahwa ketika diinstal, semua file masuk ke /opt/extras.ubuntu.com/<appname>direktori.

Melalui perubahan dalam pengemasan dan dengan bantuan dari orang lain saya telah mencapainya, tetapi sekarang saya menghadapi masalah baru: ketika menjalankan dari /optterjemahan dari aplikasi saya tidak dimuat.

Apa yang terjadi adalah sebagai berikut: kecuali ditentukan sebaliknya, file biner (file MO) yang berisi terjemahan untuk aplikasi diambil dari /usr/share/locale(atau dalam kasus Ubuntu, dari /usr/share/locale-langpack), tetapi dalam aplikasi saya, karena /optpersyaratan, mereka diinstal di /opt/extras.ubuntu.com/qreator/locale.

Secara teori itu bagus, karena gettext memungkinkan menentukan lokasi alternatif untuk memuat terjemahan, jadi saya menambahkan bindtextdomainpanggilan untuk mencapai itu:

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

Itu berfungsi dengan baik hingga titik: semua pesan yang dihasilkan pada baris perintah kemudian muncul diterjemahkan seperti yang diharapkan. Tapi itu tidak menyelesaikan masalah utama : untuk memuat terjemahan dari UI Glade memerlukan menentukan domain terjemahan sekali lagi (setara dengan gettext.textdomain('qreator')panggilan di atas), tetapi tidak membiarkan menentukan dari mana memuat terjemahan dari (yaitu setara dengan Glade untuk bindtextdomain, yang sayangnya tidak ada). Berikut ekstrak kode yang saya gunakan:

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)

Ini pada dasarnya berarti bahwa terjemahan dari UI tidak dapat dimuat jika aplikasi Anda diinstal /opt.

Saya cukup macet saat ini. Adakah ide tentang bagaimana membuat Glade memuat terjemahan /opt/extras.ubuntu.com/qreator/share/locale/alih-alih /usr/share/locale?

David Planella
sumber
Setelah berbicara dengan seseorang yang lebih berpengetahuan di Gtk.Builder, saya telah mengajukan bug: bugzilla.gnome.org/show_bug.cgi?id=676543
David Planella
Saya juga telah ditunjukkan solusi, tetapi sepertinya tidak berhasil bagi saya - ini dia: bugs.debian.org/cgi-bin/bugreport.cgi?bug=114461#12
David Planella
Bisakah Anda memasukkan contoh runnable minimal penuh dalam kode python Anda? Saya senang menelusuri ini, tapi saya tidak yakin impor apa yang saya lewatkan untuk mendapatkan Gtk.Builder ().
slangasek
n / m, ternyata itu hanya 'impor gtk';)
slangasek
1
benar - saya menyerah, sepertinya tidak ada cara yang waras untuk mendapatkan gettext.bindtextdomain () untuk menguasai glade: /
slangasek

Jawaban:

10

Saya telah menemukan solusi: gunakan modul Python lokal alih-alih gettext

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

Terima kasih kepada Juha Sahakangas di saluran # gtk + IRC untuk memberikan penjelasan:

Untuk kasus khusus ini, modul lokal perlu digunakan alih-alih gettext . Modul gettext Python adalah python murni, itu tidak benar-benar mengatur domain teks dengan cara yang bisa dibaca oleh pustaka C, tetapi lokal tidak (dengan memanggil libc). Selama itu selesai, GtkBuilder sudah berfungsi seperti yang Anda minta.

David Planella
sumber