Android: Jak uzyskać ciąg w określonym locale BEZ zmiany bieżących ustawień regionalnych

Przypadek użycia: rejestrowanie komunikatów o błędach wyświetlanych użytkownikowi.

Jednak nie chcesz, aby wiadomości w dzienniku zależały od ustawień regionalnych urządzenia użytkownika. Z drugiej strony nie chcesz zmieniać lokalizacji urządzenia użytkownika tylko dla swojego logowania (technicznego). Czy można to osiągnąć? Znalazłem kilka potencjalnych rozwiązań tutaj na stackoverflow:

jak uzyskać ciąg z różnych lokalizacji w Androidzie?Czy mogę uzyskać dostęp do zasobów z różnych lokalnych wersji Androida?android - Uzyskaj ciąg z domyślnych ustawień narodowych za pomocą łańcucha w określonych ustawieniach regionalnychmoże nawetandroid - Zmiana ustawień regionalnych w samej aplikacji

Jednak wszystkie one powodują zmianę ustawień regionalnych mojego urządzenia (do następnej zmiany konfiguracji).

W każdym razie moje obecne obejście jest takie:

public String getStringInDefaultLocale(int resId) {
    Resources currentResources = getResources();
    AssetManager assets = currentResources.getAssets();
    DisplayMetrics metrics = currentResources.getDisplayMetrics();
    Configuration config = new Configuration(
            currentResources.getConfiguration());
    config.locale = DEFAULT_LOCALE;
    /*
     * Note: This (temporiarily) changes the devices locale! TODO find a
     * better way to get the string in the specific locale
     */
    Resources defaultLocaleResources = new Resources(assets, metrics,
            config);
    String string = defaultLocaleResources.getString(resId);
    // Restore device-specific locale
    new Resources(assets, metrics, currentResources.getConfiguration());
    return string;
}

Szczerze mówiąc, wcale nie podoba mi się to podejście. To nie jest wydajne i - myśląc o współbieżności i tym podobnych - może powodować pewne widoki w „niewłaściwych” lokalizacjach.

Więc - jakieś pomysły? Być może można to osiągnąć za pomocąResourceBundles, tak jak w standardowej Javie?

questionAnswers(4)

yourAnswerToTheQuestion