2011-02-03 17 views
8

Tôi có một dự án Qt sử dụng các tệp XML. Các tệp XML đó chứa văn bản có thể đọc được và văn bản này nên được dịch bằng cách sử dụng các công cụ Qt (lupdate, lrelease, QtLinguist).Qt dịch các chuỗi từ các tệp không phải là nguồn

Câu hỏi đặt ra là liệu có thể tạo mục nhập trong tệp .ts qua lupdate mà không sao chép chuỗi từ tệp XML trong tệp mã nguồn bằng cách sử dụng macro và bạn bè QT_TR_NOOP() không? Hay nói chung, làm thế nào để bạn dịch các chuỗi trong các tệp không phải mã nguồn cho các dự án Qt?

+0

Sẽ rất tuyệt nếu lupdate chấp nhận các cặp chuỗi/bối cảnh thay vì chỉ các tệp; sau đó người ta chỉ có thể bao gồm những thứ như vậy trong hệ thống xây dựng. – Joey

+0

Tôi đã tìm thấy một cách dễ dàng hơn để làm điều đó. Kiểm tra câu trả lời của tôi tại: http://stackoverflow.com/questions/28166081/can-i-use-tr-and-lupdate-on-xml-files/28168782#28168782 –

Trả lời

5

Chúng tôi đã có cùng một vấn đề: tệp XML chứa chuỗi có thể đọc được của con người. Giải pháp của chúng tôi là đảm bảo rằng các chuỗi có thể đọc được trong các tệp XML dễ dàng trích xuất (chúng tôi đặt chúng trong thuộc tính LABEL) và chúng tôi phát triển một công cụ nhỏ phân tích các tệp XML, trích xuất các chuỗi, tạo ngữ cảnh (bằng cách trích xuất dữ liệu từ tệp XML), rồi tạo tệp tiêu đề CPP có chứa danh sách QT_TR_NOOP().

Tệp này đã được thêm vào tệp dự án của chúng tôi (.pro) đã được sử dụng bởi lupdate.

Giải pháp này là tốt cho chúng tôi, nhưng chúng tôi phải rất cẩn thận về hai điều:

  • chạy công cụ này mỗi lần nội dung của một tập tin XML thay đổi.
  • đảm bảo các tệp XML được mã hóa UTF-8.
+0

Điều đó nghe có vẻ giống như một giải pháp phổ quát, cũng áp dụng cho các tệp không phải XML. Tôi sẽ xem xét một cái gì đó như thế, cảm ơn! – Sascha

+0

Nó sẽ là tốt đẹp nếu bạn đăng công cụ trên github, mà sẽ làm cho câu trả lời này hữu ích hơn cho người khác. – sashoalm

3

Bạn có thể dịch bất kỳ thứ gì bạn muốn trong thời gian chạy bằng cách sử dụng tr(), miễn là tệp .qm có bản dịch/ngữ cảnh phù hợp. Nó sẽ không tạo ra bất kỳ sự khác biệt nào cho dù lupdate có trích xuất hay không.

Tôi không biết cách làm cho lupdate trích xuất các chuỗi từ XML tùy ý, nhưng điều đó không có nghĩa là bạn không thể sử dụng ngôn ngữ học.

  1. tệp .ts cũng là XML; sẽ dễ dàng tạo XSLT để biến đổi XML của bạn thành tệp .ts. Nếu bạn muốn nhắm mục tiêu tiêu chuẩn thay vì chỉ Qt, lupdate (và ngôn ngữ học) có thể xử lý các tệp XLIFF.
  2. bạn có thể có nhiều file .ts (chỉ cần gọi nhiều QTranslator :: tải hơn một lần khi cài đặt nó lên)

Nếu bạn thực sự muốn có nó tất cả trong một tập tin cho người dịch, có bản sao XSLT của bạn tệp được tạo ra lupdate vào đầu ra của nó. Miễn là bạn sử dụng một tên ngữ cảnh không trùng lặp một cái gì đó được sử dụng trong mã nguồn, điều này không phải là bất kỳ khác nhau (từ quan điểm của Qt) từ cách nhiều ứng dụng tải một .qm cho mỗi DLL có GUI.

+0

Ý tưởng XSLT thật tuyệt, cảm ơn! Tuy nhiên, dự án của tôi thực sự phức tạp hơn và người dùng có thể tích hợp các trình cắm thêm có thể chứa các tệp XML với các lược đồ do người dùng định nghĩa khác nhau. Làm thế nào một XSLT sẽ biến đổi ngay bây giờ những gì là con người có thể đọc được và những gì không? (Tôi không chắc liệu mình có thể/nên yêu cầu người dùng cung cấp XSLT của riêng họ với mọi tệp XML ...) – Sascha

+0

Nếu bạn không biết gì về lược đồ, bạn hy vọng rằng lupdate sẽ biết những gì cần lấy?Bạn có thể trích xuất tất cả nội dung văn bản không có khoảng trắng hoặc thậm chí tất cả các thuộc tính và các nút văn bản thuộc tính, nhưng điều đó dường như có thể là rất nhiều rác cho các dịch giả sàng lọc. Có thể có người dùng thêm thuộc tính đặc biệt vào các phần tử chỉ định bối cảnh cho văn bản này và chỉ trích xuất văn bản của các phần tử đó? một cái gì đó như // * [@ tr: context]/text() sẽ chọn các nút như vậy. – puetzk

+0

Vâng, tôi đã suy nghĩ về việc sử dụng một số loại quy ước. Đề xuất của bạn có ý nghĩa. – Sascha

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