2009-01-30 22 views
11

Chúng tôi đang bản địa hóa văn bản giao diện người dùng cho ứng dụng web chạy trên Java 5 và có tình trạng khó xử về cách chúng tôi xuất các thư được xác định trong tệp thuộc tính - loại được sử dụng bởi java.util.Properties.Tôi có nên sử dụng java.text.MessageFormat cho các thư được bản địa hóa mà không có trình giữ chỗ không?

Một số thư bao gồm trình giữ chỗ sẽ được điền bằng cách sử dụng java.text.MessageFormat. Ví dụ:

search.summary = Your search for {0} found {1} items. 

MessageFormat gây phiền toái, vì một dấu nháy đơn là ký tự đặc biệt, mặc dù thông dụng trong văn bản tiếng Anh. Bạn phải nhập hai cho một dấu nháy đơn bằng chữ:

warning.item = This item''s {0} is not valid. 

Tuy nhiên, ba phần tư trong số 1000 ứng dụng hoặc các thư của ứng dụng không bao gồm trình giữ chỗ. Điều này có nghĩa rằng chúng ta có thể xuất chúng trực tiếp, tránh MessageFormat, và để lại các dấu nháy đơn một mình:

help.url = The web page's URL 

Câu hỏi: chúng ta nên sử dụng MessageFormat cho tất cả các bài viết, cho cú pháp nhất quán, hoặc tránh MessageFormat nơi chúng ta có thể, vì vậy hầu hết các tin nhắn không cần phải thoát?

Có những ưu điểm và nhược điểm rõ ràng.

Lưu ý rằng các tài liệu API cho MessageFormat thừa nhận vấn đề và đề nghị một tổ chức phi-giải pháp:

Các quy tắc sử dụng dấu ngoặc kép trong nhắn dạng mẫu may đã cho thấy được phần nào khó hiểu. Cụ thể, không phải lúc nào cũng rõ ràng là đối với người bản địa hóa cho dù dấu nháy đơn có cần phải được tăng gấp đôi hay không. Đảm bảo để thông báo cho người bản địa về các quy tắc, và cho họ biết (ví dụ: bằng cách sử dụng nhận xét trong nguồn gói nguồn tệp).

Trả lời

2

Chỉ cần viết thực hiện riêng của bạn về MessageFormat mà không có tính năng gây phiền nhiễu này. Bạn có thể xem mã số SLF4J Logger.

Họ có phiên bản riêng của họ về định dạng thông điệp mà có thể được sử dụng như sau:

logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT); 

placeholders rỗng có thể được sử dụng với tự mặc định và đánh số cho một số trường hợp địa hóa nơi ngôn ngữ khác nhau làm hoán vị các từ hoặc các bộ phận của câu phù hợp.

+0

Có thể sử dụng thư viện mà chỉ cần định dạng một chuỗi mặc dù? –

+0

có vẻ như cơ chế này được chôn sâu vào mã. có thể bạn sẽ có nhiều may mắn hơn: http://logback.qos.ch/download.html –

+0

Thật vậy, vì vậy tôi đoán tôi sẽ tìm một triển khai thay thế. –

-1

Một giải pháp thay thế khác ... Khi tải tệp thuộc tính, chỉ cần đóng luồng nhập vào trong một FilterInpuStream tăng gấp đôi từng trích dẫn.

+0

Không phải tất cả các tin nhắn của anh đều cần hai dấu nháy đơn. Có nghĩa là anh ta phải hack để nhận ra các chuỗi tin nhắn. Eek. – JonMR

1

Sử dụng ký tự `thay vì 'để trích dẫn. Chúng tôi sử dụng nó mọi lúc mà không gặp vấn đề gì.

Sử dụng MessageFormat chỉ khi bạn cần, nếu không chúng chỉ làm nổi bật mã và không có thêm giá trị.

0

Theo tôi, tính nhất quán là quan trọng đối với loại điều này. Các tệp thuộc tính và MessageFormat đã có rất nhiều hạn chế.Nếu bạn thấy những rắc rối này, bạn có thể "biên dịch" các tệp thuộc tính của bạn để tạo ra các tệp được định dạng đúng. Nhưng tôi muốn nói với việc sử dụng MessageFormat ở khắp mọi nơi. Bằng cách này, khi bạn duy trì mã, bạn không cần phải lo lắng về chuỗi nào được định dạng và chuỗi nào không. Nó trở nên đơn giản hơn để giải quyết, vì bạn có thể xử lý thông báo cho thư viện và không phải lo lắng về chi tiết ở mức cao.

2

Cuối cùng chúng tôi quyết định sang bên kia-bước vấn đề dấu nháy đơn bằng cách luôn luôn sử dụng ‘xoăn’ trích dẫn:

warning.item = This item\u2019s {0} is not valid. 
Các vấn đề liên quan