LƯU Ý Nếu API tối thiểu của bạn là 17+, đi thẳng xuống đáy của câu trả lời này. Nếu không, hãy đọc tiếp ...
Nếu bạn có thư mục res khác nhau cho miền địa phương khác nhau, bạn có thể làm một cái gì đó như thế này:
Configuration conf = getResources().getConfiguration();
conf.locale = new Locale("pl");
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
Resources resources = new Resources(getAssets(), metrics, conf);
String str = resources.getString(id);
Ngoài ra, bạn có thể chỉ cần khởi động lại hoạt động của bạn sử dụng phương pháp này được trỏ đến bởi @ jyotiprakash.
LƯU Ý Gọi hàm tạo Resources
như thế này sẽ thay đổi nội dung nào đó trong Android. Bạn sẽ phải gọi hàm tạo với ngôn ngữ gốc của bạn để lấy lại mọi thứ.
EDIT Một hơi khác nhau (và hơi bụi) công thức để lấy nguồn từ một miền địa phương cụ thể là:
Resources res = getResources();
Configuration conf = res.getConfiguration();
Locale savedLocale = conf.locale;
conf.locale = desiredLocale; // whatever you want here
res.updateConfiguration(conf, null); // second arg null means don't change
// retrieve resources from desired locale
String str = res.getString(id);
// restore original locale
conf.locale = savedLocale;
res.updateConfiguration(conf, null);
Tính đến mức API 17, bạn nên sử dụng conf.setLocale()
thay vì trực tiếp thiết conf.locale
. Điều này sẽ cập nhật chính xác hướng bố cục của cấu hình nếu bạn tình cờ chuyển đổi giữa các ngôn ngữ từ phải sang trái và từ trái sang phải. (Hướng bố cục được giới thiệu trong 17.)
Không có điểm khi tạo đối tượng Configuration
mới (như @Nulano gợi ý trong nhận xét) vì gọi updateConfiguration
sẽ thay đổi cấu hình ban đầu thu được bằng cách gọi res.getConfiguration()
.
Tôi sẽ ngần ngại đưa gói này vào phương thức getString(int id, String locale)
nếu bạn sắp tải một số tài nguyên chuỗi cho một ngôn ngữ. Thay đổi ngôn ngữ (sử dụng một trong hai công thức) các cuộc gọi cho khuôn khổ để làm rất nhiều công việc rebinding tất cả các nguồn lực. Tốt hơn hết là cập nhật miền địa phương một lần, truy xuất mọi thứ bạn cần và sau đó đặt lại ngôn ngữ.
EDIT (Nhờ @Mygod):
Nếu mức API tối thiểu của bạn là 17+, có một cách tiếp cận tốt hơn nhiều, như trong this answer trên thread khác. Ví dụ, bạn có thể tạo nhiều Resource
đối tượng, một cho mỗi miền địa phương bạn cần, với:
@NonNull Resources getLocalizedResources(Context context, Locale desiredLocale) {
Configuration conf = context.getResources().getConfiguration();
conf = new Configuration(conf);
conf.setLocale(desiredLocale);
Context localizedContext = context.createConfigurationContext(conf);
return localizedContext.getResources();
}
Sau đó chỉ cần lấy tài nguyên mà bạn thích từ các địa phương Resource
đối tượng được trả về bởi phương pháp này. Không cần phải đặt lại bất cứ điều gì khi bạn đã truy xuất tài nguyên.
bạn đã thực sự triển khai điều này như thế nào ?? Vui lòng trả lời :) –
làm câu trả lời được chấp nhận –
là 'ResourceBundle' nghĩa vụ phải tham chiếu đến nội dung ?? hoặc họ có thể truy cập thư mục res của chúng tôi không? –