2011-01-08 62 views
22

Tôi đang có tất cả các giá trị resourcebundle trong bảng và được định dạng theo yêu cầu.i phải thay đổi ngôn ngữ trong trang web dựa trên lựa chọn Người dùng thả xuống ở đầu trang. Nếu tôi sử dụng mã ngôn ngữ như en_ thì nó hoạt động tốt. nếu tôi Sử dụng en-Us làm Mã Ngôn ngữ thì nó không hoạt động. Rắc rối có thể là cái gì. Đó là chính xác để làm theo?Sự khác nhau giữa việc tạo ngôn ngữ cho en-US và en_ là gì?

Trả lời

17

"en" là mã ngôn ngữ theo quy định của ISO 639. trong khi Mỹ là mã quốc gia theo quy định của 3166.
Trong Java, đối tượng Locale nhận ngôn ngữ như languageCode_countryCode (ví dụ en_US) và không phải là languageCode- countryCode.

21

"en-US" là IETF language tag. Trong khi lớp Java'a Locale rõ ràng dựa trên các thẻ ngôn ngữ IETF, nó sử dụng dấu gạch dưới thay cho dấu gạch nối khi tách mã ngôn ngữ khỏi mã quốc gia (và cả các biến thể), vì vậy hãy gọi toString() trên số Locale tương đương sẽ cung cấp cho bạn en_US.

Kể từ Java 7, bạn có thể sử dụng Locale.forLanguageTag(String)toLanguageTag() để chuyển đổi giữa các thẻ ngôn ngữ và các đối tượng Locale.

Khi chuyển đổi chuỗi thành Locale đối tượng là một ý tưởng tốt để bình thường hóa bằng cách tách các thành phần trên dấu gạch nối và dấu gạch dưới, giảm thành phần đầu tiên (mã ngôn ngữ) và vỏ trên thành phần thứ hai (mã quốc gia).

+0

Câu trả lời này là câu trả lời tốt nhất cho những gì cần làm trong mã java. Đối với các ngôn ngữ/khuôn khổ khác, không quá nhiều. Khi thực hiện các cuộc gọi giữa các khung công tác với các công ước khác nhau, bạn có một "sự đổ vỡ" của trình coder cần phải biết chuyển đổi là bắt buộc. khuyên bạn nên sử dụng quy ước của khung bạn đang gọi. Khi bạn thực hiện cuộc gọi đến một khung công tác khác, hãy cung cấp "proxy" thực hiện chuyển đổi. Tại sao? nó giúp loại bỏ sự cần thiết phải biết rằng khung được gọi sử dụng một quy ước khác. Những người đóng góp sẽ chỉ "nhìn thấy" một quy ước bằng cách sử dụng cái đó sẽ tránh được sự đổ vỡ. – DaBlick

6

Hoặc bạn có thể sử dụng Locale us = Locale.forLanguageTag("en-US")us.toLanguageTag() và điều đó sẽ thực hiện chuyển đổi cho bạn mà không phải tạo triển khai dễ bị lỗi.

1

Kể từ Java8, Khởi tạo ngôn ngữ phải được thực hiện bằng thẻ ngôn ngữ "en-US" Locale.forLanguageTag ("en-US"). ToString(); trả về kết quả đầu ra: en_US

Nơi Locale.forLanguageTag ("en_US") không tạo ngôn ngữ được yêu cầu. Nó sẽ mặc định cho ngôn ngữ hệ thống. Locale.forLanguageTag ("en_US"). ToString() trả về null

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