Tôi có một ứng dụng Android có chuỗi tiếng Anh trong các giá trị/strings.xml. Đối với mỗi chuỗi trong tệp đó, tôi có một mục nhập trong các giá trị-ja/strings.xml với bản dịch tiếng Nhật của chuỗi đó. Nếu tôi đặt trình mô phỏng, Nexus One hoặc Nexus S sang tiếng Nhật, giao diện người dùng sẽ hiển thị văn bản tiếng Nhật trong suốt. Hầu hết thời gian.Tại sao có thể Resources.getString() liên tục trả về các chuỗi từ vị trí sai?
Đôi khi, một số phần của giao diện người dùng sẽ xuất hiện bằng tiếng Anh, mặc dù ngôn ngữ hiện tại là ja-JP. Ví dụ, tôi đã viết mã kiểm tra này trong phương thức onCreate() của một trong những hoạt động của tôi:
Log.e(TAG, "Default locale = '" + Locale.getDefault().toString() + "'");
Log.e(TAG, "My string = '" + getResources().getString(R.string.my_string) + "'");
Đôi khi tôi sẽ nhìn thấy trong LogCat:
Default locale is 'ja_JP'
My string is '日本'
lần khác, tôi sẽ thấy:
Default locale is 'ja_JP'
My string is 'English'
Đôi khi vấn đề này được giải quyết bằng cách xoay điện thoại. Đôi khi nó được giải quyết bằng cách thoát và khởi động lại ứng dụng. Đôi khi chỉ một phần của một màn hình duy nhất là tiếng Anh. Đôi khi vấn đề này xảy ra với các chuỗi được rút ra khỏi các tài nguyên thông qua mã, và đôi khi nó xảy ra với các chuỗi chỉ được tham chiếu bởi một bố trí. Không nơi nào trong ứng dụng của tôi, tôi gọi Locale.setDefault(), vì vậy điều đó không gây ra vấn đề.
CẬP NHẬT
Tôi đã tìm thấy một cách để sửa vấn đề cho một hoạt động cụ thể. Trong onCreate của hoạt động():
Log.e(TAG, "getString: '" + getString(R.string.my_string) + "'");
Log.e(TAG, "getResources().getConfiguration(): '" +
getResources().getConfiguration().toString() + "'");
Log.e(TAG, "getResources().getDisplayMetrics(): '" +
getResources().getDisplayMetrics().toString() + "'");
Log.e(TAG, "Setting configuration to getConfiguration()");
getResources().updateConfiguration(getResources().getConfiguration(),
getResources().getDisplayMetrics());
Log.e(TAG, "getString: '" + getString(R.string.my_string) + "'");
Log.e(TAG, "getResources().getConfiguration(): '" +
getResources().getConfiguration().toString() + "'");
Log.e(TAG, "getResources().getDisplayMetrics(): '" +
getResources().getDisplayMetrics().toString() + "'");
Điều này dẫn đến sau trong LogCat:
getString: 'English'
getResources().getConfiguration(): '{ scale=1.0 imsi=0/0 loc=ja_JP touch=3 keys=1/1/2 nav=3/1 orien=1 layout=34 uiMode=17 seq=8}'
getResources().getDisplayMetrics(): 'DisplayMetrics{density=1.5, width=480, height=800, scaledDensity=1.5, xdpi=254.0, ydpi=254.0}'
Setting configuration to getConfiguration()
getString: '日本'
getResources().getConfiguration(): '{ scale=1.0 imsi=0/0 loc=ja_JP touch=3 keys=1/1/2 nav=3/1 orien=1 layout=34 uiMode=17 seq=8}'
getResources().getDisplayMetrics(): 'DisplayMetrics{density=1.5, width=480, height=800, scaledDensity=1.5, xdpi=254.0, ydpi=254.0}'
Như bạn có thể nhìn thấy từ nhật ký, không có gì trong những thay đổi cấu hình hiện tại, nhưng getString() cung cấp khác nhau các kết quả. Việc sử dụng giải pháp này ở mọi nơi trong ứng dụng của tôi có thể sử dụng tài nguyên, nhưng hy vọng điều này sẽ cung cấp gợi ý về những gì đang xảy ra. Điều này là không thực tế.
Bạn đã thử trình theo dõi lỗi google android? http://code.google.com/p/android/issues/ –
bạn đang sử dụng phiên bản AVD nào? – rockeye
Tôi đã xem xét mọi lỗi trong trình theo dõi lỗi chứa "ngôn ngữ" hoặc "ngôn ngữ". Tôi không thấy ai khác báo cáo vấn đề này. –