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ừ /opt
bả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 /opt
yê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 bindtextdomain
gọ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
?