2012-01-05 39 views
10

Theo tham chiếu Java, Locale.getLanguage() được cho là trả về mã ISO chữ thường 2 chữ cái của ngôn ngữ (ví dụ "en"), trong khi getDisplayLanguage() là phương thức lấy tên có thể đọc được (ví dụ: "Tiếng Anh ").Tại sao Locale.getDefault(). GetLanguage() trong Android trả về tên hiển thị thay vì mã ngôn ngữ?

Vậy làm thế nào đến rằng đoạn mã sau trong Android:

Locale.getDefault().getLanguage() 

lợi nhuận "tiếng Anh" hay "Español" thay vì "en" và "es" ????

Tôi hoàn toàn bối rối ...

+0

@trante thậm chí không từ xa – matteo

Trả lời

6

Tôi đã tìm ra. Điều này xảy ra bởi vì trước đây tôi đã gọi Locale.setDefault() và chuyển cho nó một Locale mà tôi đã tạo ra bằng cách truyền đi sai tên toàn bộ ngôn ngữ (tôi lấy ngôn ngữ từ một thiết lập ưu tiên và tôi đã nhầm nhãn của mục nhập thay vào đó của giá trị).

Đó là, tôi đã làm:

String lang= //... here I assigned "English" while I thought 
      // I was assigning it "en" 
Locale locale=new Locale(lang); 
Locale.setDefault(locale);  // (*) 

// and later 
Locale.getLocale().getLanguage(); //returns "english" 

Vì vậy, khi tôi truy vấn cho miền địa phương mặc định, nó thực sự là miền địa phương tôi đã tạo ra mà mã ngôn ngữ tôi đã sai lầm thiết lập để "tiếng anh".

Có một vài điều buồn cười, mặc dù:

  1. Dòng (*) thực sự hoạt động và thực sự không thay đổi vị trí để tiếng Anh (hoặc tiếng Tây Ban Nha khi tôi sử dụng "Tây Ban Nha"), có nghĩa là, setDefault() dường như chấp nhận một miền địa phương "không đúng định dạng" và thậm chí hiểu được nó. Nhưng nó không khắc phục được.
  2. Lưu ý tôi đã sử dụng chữ hoa tiếng Anh khi đặt sai vị trí, nhưng cuối cùng nó trả về "tiếng Anh" tất cả chữ thường.
3

Tôi không biết tại sao vấn đề này xuất hiện, nhưng một tiêu chuẩn khác cho ngôn ngữ là mã ISO3. Bạn có thể gọi Locale.getDefault().getISO3Language() và nó sẽ trả lại "eng" hoặc "esp".

13

Sử dụng

getResources(). GetConfiguration(). Locale.getLanguage()

và nó sẽ chỉ làm việc tốt mặc dù tôi sẽ xem xét hành vi quan sát của bạn một lỗi đáng báo cáo ..

0

Android sẽ trả lại tên có thể đọc được thay vì mã.

Locale.getDefault() có chuỗi. Vì vậy, nếu bạn gọi bất kỳ bản in hoặc Nhật ký trên đó nó sẽ làm việc ... có nghĩa là Locale.getDefault(). ToString() có mã miền địa phương của bạn.

+1

Cảm ơn bạn Nhà phát triển Android về sự không nhất quán khác trong khuôn khổ: @ –

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