2014-06-19 20 views
5

Tôi đang xem xét cách quốc tế hóa các dự án C++ của mình và không mất nhiều thời gian để tự hỏi cách người ta xử lý bản dịch của văn bản được truyền đi xen kẽ với các giá trị không phải chuỗi. Trang duy nhất tôi đã tìm thấy cho đến nay thậm chí đề cập đến điều này sẽ là this C++ FQA page, mặc dù trang đó không may không phải là quá quan tâm đến việc cung cấp bất kỳ giải pháp. Ngoài ra còn có this Boost mailing list thread from 2000 không xuất hiện ở bất cứ đâu.Có hệ thống quốc tế hóa luồng C++ không?

Như một ví dụ, đối với C-phong cách này printf tuyên bố:

printf("There are %d lines in '%s'.", numlines, filename); 

Đó là tầm thường để bọc toàn bộ tin nhắn trong một số loại chức năng dịch thuật, chẳng hạn như các chức năng khác nhau gettext, và cho phép các văn bản và các thành phần nonliteral của nó di chuyển xung quanh khi cần thiết. Nếu bạn có quyền truy cập vào phiên bản POSIX của printf (hoặc một số thư viện khác cung cấp các cải tiến đối với định dạng printf), bạn thậm chí có thể sắp xếp các giá trị theo thứ tự khác nếu cần.

Tuy nhiên, đối tương đương với C++ tuyên bố dựa trên luồng:

std::cout << "There are " << numlines 
      << "lines in '" << filename << "'."; 

tôi vẫn chưa tìm ra cách để đánh dấu toàn bộ thông điệp cho dịch. Bạn có thể quấn lên từng chuỗi trong các hàm thích hợp, nhưng điều đó đòi hỏi người dịch phải biết rằng tất cả ba chuỗi này là một phần của một thông điệp và những gì xuất hiện giữa chúng. Ngoài ra, ít nhất một số giải pháp i18n cần được thông báo rằng các lần xuất hiện khác của cùng một chuỗi ký tự là khác nhau, đối với các ngôn ngữ mà nội dung của các thay đổi đó dựa trên ngữ cảnh. Và quên đi những tình huống mà bạn phải sắp xếp lại các giá trị không phải chuỗi ký tự.

Vì vậy, câu hỏi của tôi là có giải pháp quốc tế hóa hỗ trợ việc sử dụng các hoạt động truyền trực tuyến hay chỉ có các giải pháp kiểu printf cho các mối quan tâm tôi nêu ra?

Trả lời

1

Boost.Format có thể giúp:

cout << boost::format("There are %d lines in '%s'.") % numlines % filename; 

hoặc

cout << boost::format("There are %1% lines in '%2%'.") % numlines % filename; 
Các vấn đề liên quan