2010-01-07 37 views
8

Tôi có vài ứng dụng được viết bằng PyQt4, nơi tôi đã sử dụng thư viện chuẩn gettext Python để quốc tế hóa và bản địa hóa GUI. Nó hoạt động tốt cho tôi. Nhưng tôi đã chọn gettext chỉ vì tôi đã có kiến ​​thức và kinh nghiệm sử dụng gettext, và không có kinh nghiệm với cách tiếp cận Qt4 tr().Ưu điểm và nhược điểm của việc sử dụng gettext thay vì QObject.tr() để bản địa hóa ứng dụng PyQt4?

Bây giờ tôi muốn so sánh tốt hơn cả hai cách tiếp cận và hiểu những gì tôi đang thiếu bằng cách sử dụng gettext thay vì QObject.tr, và có lý do nghiêm trọng nào không nên sử dụng gettext cho các ứng dụng Qt4/PyQt4?

Trong lợi thế hiểu biết của tôi sử dụng gettext là:

  • GNU gettext là trưởng thành và nó có vẻ là tiêu chuẩn de-facto trong GNU/Linux trên thế giới.
  • Có đủ trình chỉnh sửa đặc biệt cho tệp PO để đơn giản hóa công việc dịch, mặc dù bản chất văn bản của các mẫu PO khiến cho nó không thực sự cần thiết.
  • Thậm chí còn có các dịch vụ web có sẵn có thể được sử dụng cho các bản dịch cộng tác.
  • gettext là thư viện Python chuẩn, vì vậy tôi không cần phải cài đặt bất cứ điều gì đặc biệt để sử dụng nó trong thời gian chạy.
  • Nó có hỗ trợ rất tốt cho lựa chọn biểu mẫu số ít/số nhiều thông qua ngettext().

Những gì tôi thấy là lợi thế của QObject.tr():

  • Đây là công nghệ bản địa cho Qt4/PyQt4 như vậy có lẽ nó sẽ làm việc tốt hơn/nhanh hơn (mặc dù tôi không có dữ liệu để chứng minh).
  • Thư cần dịch có thể có thông tin ngữ cảnh bổ sung sẽ giúp người dịch chọn các biến thể tốt nhất cho các từ đồng nghĩa, ví dụ: từ tiếng Anh "Letter" có thể được dịch là "Character", "Mail" hoặc thậm chí là "Paper size" tùy thuộc vào ngữ cảnh thực tế.

Những gì tôi thấy như nhược điểm của QObject.tr() vs gettext:

  • tôi không tìm thấy trong tài liệu Qt như thế nào được hỗ trợ số ít lựa chọn số nhiều/ở đó.
  • Mẫu dịch Qt4 TS có định dạng XML và do đó phức tạp hơn để chỉnh sửa mà không cần trình soạn thảo đặc biệt (QT Linguist) và dường như không có giải pháp hoặc dịch vụ web của bên thứ ba nào khác. Vì vậy, nó sẽ yêu cầu cho các dịch giả để tìm hiểu công cụ mới (nếu họ đã quen thuộc với các công cụ PO).

Nhưng tất cả các mục ở trên không đủ quan trọng để nói rõ ràng rằng bất kỳ công cụ nào đều tốt hơn công cụ khác. Và tôi không muốn bắt đầu chiến tranh lửa về những gì tốt hơn bởi vì nó rất chủ quan. Tôi chỉ muốn biết những gì tôi thiếu là ưu và khuyết điểm của QObject.tr() vs gettext.

Trả lời

-1

Bạn có thể thêm arg được quản lý khác ...

Với gettext, chúng ta có thể làm

_("Hello %(name)s from %(city)s") % {person.__dict__}

trong khi ở PyQt, chúng tôi làm

self.tr("Hello %1 from %2").arg(person.name).arg(person.city)

2

Một lý do đơn giản để sử dụng QObject.tr() là:

Nó giúp bạn tiết kiệm cần cài đặt gettext trên Windows, làm cho công việc đa nền tảng dễ dàng hơn một chút. Tôi cố gắng có càng ít phụ thuộc nhị phân càng tốt trên Windows.

2

Tất cả đều có ưu và khuyết điểm của chúng, nhưng để xác định rõ ràng hơn, bạn sẽ phải xác định trước tiên nếu bạn đang nhắm mục tiêu môi trường di động hoặc môi trường làm việc.

Trong công ty chúng tôi, chúng tôi sử dụng các phương pháp khác nhau đơn giản vì giải pháp lý tưởng chưa tồn tại. Để phát triển máy tính để bàn, chúng tôi đang sử dụng tệp PO đơn giản chỉ vì các nút không được thu nhỏ và do đó văn bản sẽ phù hợp. Để phát triển di động, bản dịch của một chuỗi phụ thuộc vào kích thước nút có thể khác nhau trên các thiết bị ngang và dọc. Vì vậy, điều này làm phức tạp nó một chút vì tệp PO chỉ có thể có 1 bản dịch của một từ nhất định. Vì vậy, chúng tôi đã chọn XLIFF cho điều này, vì vậy chúng tôi có thể chỉ định ID duy nhất cho một chuỗi. Đây không phải là một nhiệm vụ dễ dàng, bởi vì không có giải pháp tốt để chuyển đổi tệp .RC thành tệp XLIFF. (Vì các công cụ hiện tại chuyển đổi TẤT CẢ các chuỗi giữa "" là hành vi không mong muốn của khóa học). Vì vậy, tôi đã viết một công cụ chuyển đổi cho nhiệm vụ này.

Tuy nhiên, khi suy nghĩ về bản địa hóa, các dạng số nhiều là rất quan trọng vì vậy không có điều này không phải là một giải pháp địa phương hóa tốt. Vì vậy, tôi sẽ nói để đi cho PO gettext.

Chúc mừng, Floris.

2

Tại thời điểm hiện tại, Qt không xử lý hình thức số nhiều khi bạn đang tận dụng các QT_TRANSLATE_NOOP

+1

tôi muốn thêm rằng 'tr ("Bạn đã chọn% n item (s)",, item.count()) 'trông như thể nó có thể hoạt động nhưng nó được viết rất kém trong hệ thống của Qt và thực sự không giải thích cách đặt mọi thứ nếu bạn thực sự muốn hai (hoặc nhiều) chuỗi khác nhau hơn là chỉ một hậu tố: 'tr (" % n item {is | s là} hiện đang được chọn. ",, item.count())' – SlySven

Các vấn đề liên quan