UWAGA Jeśli minimalna API jest 17+, idź prosto do dołu tej odpowiedzi. W przeciwnym razie, czytaj dalej ...
Jeśli masz różne res foldery dla różnych lokalizacjach, można zrobić coś takiego:
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);
Alternatywnie, można po prostu ponownie uruchomić działalność stosując metodę wskazywanego przez @ jyotiprakash.
UWAGA Wywołanie konstruktora takiego, jak to, zmienia coś wewnętrznie w systemie Android. Będziesz musiał wywołać konstruktora z oryginalnymi ustawieniami narodowymi, aby odzyskać dane z powrotem.
EDIT nieznacznie różnić (i nieco czystsze) przepis na pobieranie zasobów z określonej lokalizacji jest:
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);
Jak z poziomu API 17, należy użyć conf.setLocale()
zamiast bezpośredniego ustawiania conf.locale
. Spowoduje to prawidłową aktualizację kierunku układu konfiguracji, jeśli przełączasz się między ustawieniami od prawej do lewej i od lewej do prawej. (Kierunek Układ został wprowadzony w 17.)
Nie ma sensu w tworzeniu nowej Configuration
przedmiot (jak sugeruje @Nulano w komentarzu), ponieważ wywołanie updateConfiguration
zamierza zmienić pierwotną konfigurację uzyskać dzwoniąc res.getConfiguration()
.
Chciałbym zawęzić to do metody getString(int id, String locale)
, jeśli zamierzasz ładować kilka zasobów ciągów dla lokalizacji. Zmiana ustawień narodowych (przy użyciu dowolnego przepisu) wymaga, aby struktura wykonała wiele pracy, ponownie wiążąc wszystkie zasoby. Znacznie lepiej jest raz zaktualizować ustawienia lokalne, pobrać wszystko, czego potrzebujesz, a następnie przywrócić ustawienia regionalne.
EDIT (Dzięki @Mygod):
Jeżeli minimalny poziom API jest 17+, jest znacznie lepszym rozwiązaniem, jak pokazano na this answer w innym wątku. Na przykład, można utworzyć wiele Resource
przedmiotów, po jednym dla każdego ustawienia trzeba, wraz z:
@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();
}
Następnie wystarczy pobrać zasoby chcesz z miejscowego Resource
obiektu zwróconego przez tą metodą. Po odzyskaniu zasobów nie trzeba resetować niczego.
jak to właściwie wdrożyłeś? Proszę o odpowiedź :) –
jako zaakceptowana odpowiedź –
to "ResourceBundle", które ma odnosić się do aktywów? lub czy mogą uzyskać dostęp do naszego folderu res? –