Cách tạo bản dịch tải Glade từ / opt


9

Tôi đã tạo một ứng dụng mà tôi muốn gửi qua quy trình phát triển ứng dụng Ubuntu . Một trong những yêu cầu cho quy trình là khi được cài đặt, tất cả các tệp sẽ vào /opt/extras.ubuntu.com/<appname>thư mục.

Thông qua những thay đổi trong bao bì và với sự giúp đỡ từ những người khác tôi đã đạt được điều đó, nhưng bây giờ tôi đang phải đối mặt với một vấn đề mới: khi chạy từ /optbản dịch từ ứng dụng của tôi không được tải.

Điều gì xảy ra là như sau: trừ khi được chỉ định khác, các tệp nhị phân (tệp MO) có chứa bản dịch cho một ứng dụng được tải từ /usr/share/locale(hoặc trong trường hợp của Ubuntu, từ /usr/share/locale-langpack), nhưng trong ứng dụng của tôi, do /optyêu cầu, chúng được cài đặt trong /opt/extras.ubuntu.com/qreator/locale.

Về lý thuyết thì tốt, vì gettext cho phép chỉ định một vị trí thay thế để tải bản dịch, vì vậy tôi thêm lệnh bindtextdomaingọi để đạt được điều đó:

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

Điều đó hoạt động tốt đến một điểm: tất cả các thông báo được xuất ra trên dòng lệnh sau đó xuất hiện được dịch như mong đợi. Nhưng nó không giải quyết được vấn đề chính : để tải các bản dịch từ UI Glade yêu cầu chỉ định miền dịch thuật một lần nữa (tương đương với gettext.textdomain('qreator')cuộc gọi ở trên), nhưng nó không cho phép chỉ định nơi tải bản dịch từ (nghĩa là Glade tương đương với bindtextdomain, điều đáng buồn là không tồn tại). Đây là một trích xuất mã mà tôi đang sử dụng:

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)

Điều này về cơ bản có nghĩa là các bản dịch từ UI không thể được tải nếu ứng dụng của bạn được cài đặt /opt.

Tôi bị mắc kẹt khá nhiều vào thời điểm này. Bất kỳ ý tưởng về cách làm cho Glade tải bản dịch từ /opt/extras.ubuntu.com/qreator/share/locale/thay vì /usr/share/locale?


Sau khi nói chuyện với ai đó hiểu biết hơn về Gtk.Builder, tôi đã gửi một lỗi: bugzilla.gnome.org/show_orms.cgi?id=676543
David Planella

Tôi cũng đã được chỉ ra một cách giải quyết, nhưng dường như nó không hoạt động với tôi - đây là: bug.debian.org/cgi-bin/ormsreport.cgi?orms=114461#12
David Planella

Bạn có thể bao gồm một ví dụ có thể chạy tối thiểu đầy đủ trong mã python của bạn không? Tôi rất vui khi đi sâu vào vấn đề này, nhưng tôi không chắc mình đã nhập những gì để nhập Gtk.Builder ().
slangasek

n / m, rõ ràng đó chỉ là 'nhập gtk';)
slangasek

1
đúng - tôi từ bỏ, dường như không có cách nào lành mạnh để có được gettext.bindtextdomain () để giữ lấy glade: /
slangasek

Câu trả lời:


10

Tôi đã tìm thấy một giải pháp: sử dụng locale Python mô-đun thay vì gettext

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

Cảm ơn Juha Sahakangas trên kênh # gtk + IRC đã cung cấp lời giải thích:

Đối với trường hợp cụ thể này, mô đun miền địa phương cần được sử dụng thay vì gettext . Mô-đun gettext của Python là python thuần, nó không thực sự đặt miền văn bản theo cách mà thư viện C có thể đọc, nhưng ngôn ngữ thực hiện (bằng cách gọi libc). Chừng nào điều đó đã được thực hiện, GtkBuilder đã hoạt động theo cách bạn yêu cầu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.