2011-06-29 15 views
16

Ok, wiem, że tytuł jest szalony :)Uzyskaj ciąg znaków z domyślnych ustawień narodowych za pomocą ciągu znaków w określonych ustawieniach narodowych

Oto, czego chcę. Moja aplikacja jest zlokalizowana dla użytkownika urządzenia, ale informacje, które wysyłam do serwera, muszą być wszystkie po angielsku. Moja domyślna lokalizacja aplikacji w języku angielskim.

Na przykład, mieć tablicę:

  • jabłka
  • pomarańcze
  • brzoskwinie

I zlokalizowane tablicy:

  • Яблоки
  • Апельсины
  • Персики

Kiedy rosyjski użytkownik widzi listę i wybiera kilka przedmiotów - Muszę dostać odpowiada angielskiej wersji.

Myślę, że moja odpowiedź sprowadza się do sposobu getString() i przekazać locale? Albo jak uzyskać Array w określonych ustawieniach narodowych?

Odpowiedz

1

Musisz zidentyfikować element przez coś innego, np. Id, a nawet angielskie imię.

Nie można uzyskać oryginalnego ciągu znaków dla danego zlokalizowanego ciągu. Jednym z powodów jest to, że lokalizacja łańcuchów nie jest funkcją przechodnią, ale jest wiele innych powodów, dla których nie jest to dobry kierunek.

+0

To jest to, o czym myślałem .. – katit

23

Poniższa pobierze miejscowe ciąg dla języka polskiego, nawet jeśli domyślne ustawienia regionalne na urządzeniu jest inny kod:

Configuration conf = getResources().getConfiguration(); 
conf.locale = new Locale("pl"); 
DisplayMetrics metrics = new DisplayMetrics(); 
getWindowManager().getDefaultDisplay().getMetrics(metrics); 
Resources resources = new Resources(getAssets(), metrics, conf); 
/* get localized string */ 
String str = resources.getString(R.string.hello); 

Mam nadzieję, że również w odniesieniu do innych typów zasobów, takich jak tablica, więc powinno wystarczyć, aby zastąpić "pl" z "en" ...

+0

Naprawdę nie sądzę, że to dobry sposób na obsługę takiej lokalizacji. Jeśli dobrze rozumiem, muszę się upewnić, że przełącznik wyświetla właściwy język, zanim wszystkie inne zlokalizowane treści nie zaczną szaleć. – katit

+0

@katit Nie przetestowałem tego, ale jeśli będziesz nadal wywoływał 'getResources()' na obiekt kontekstowy zamiast używać utworzonych zasobów dla danego ustawienia narodowego, powinien zawsze zwracać prawidłowo zlokalizowane zasoby w odniesieniu do bieżących ustawień urządzenia i nie trzeba się z niego wycofywać, mam nadzieję, że poprawnie zrozumiałem Twoje obawy. – wjeshak

+0

Parametry wyświetlania wymagane do skonstruowania nowe 'Zasoby' mogą być również odzyskane przez' getResources(). getDisplayMetrics() '. Nie trzeba angażować menedżera okien. –

1

Lokalizacja "wymuszona" nie zadziała, jeśli twoje urządzenia nie mają ustawionych locale.

Nie mogę tego udowodnić "tak po prostu", ale właśnie teraz zmagam się z takim problemem, gdzie zmuszam zasób do lokalizacji/języka, którego nie zainstalowano na urządzeniu (w systemie Android 2.3.3) i wciąż pobiera ciągi z value-en (angielskich) zasobów.

Na innych urządzeniach, z ustawieniami regionalnymi, które wymuszasz (ale nie jest konieczne ustawienie jako bieżące ustawienia regionalne), otrzymasz prawidłowe zasoby.

0

wierzę, to jest bezpieczna droga (bez dotykania bieżącą konfigurację):

Configuration conf = new Configuration(); 
conf.setToDefaults(); // That will set conf.locale to null (current locale) 
// We don't want current locale, so modify it 
conf.locale = new Locale(""); // Or conf.locale = Locale.ROOT for API 9+ 
           // or conf.setLocale(Locale.ROOT) for API 14+ 
// Since we need only strings, we can safely set metrics to null 
Resources rsrcDflt = new Resources(getAssets(), null, conf); 
String apples = srcDflt.getString(R.string.apples); // Got it at last! 
+2

Właściwie konstruktor new Resources (getAssets(), null, conf) zastępuje konfigurację systemu dla pliku APK. Po utworzeniu tego obiektu zawsze otrzymasz domyślną wersję łańcucha. – ddmytrenko

2

Jeśli używasz JB 2.2.x lub nowszej (w zasadzie API> = 17) można użyć createConfigurationContext zrobić:

public String translate(Locale locale, int resId) { 
    Configuration config = new Configuration(context.getResources().getConfiguration()); 
    config.setLocale(locale); 
    return context.createConfigurationContext(config).getText(resId); 
} 
0

Miałem ten sam problem z ListPreference, który zapisał preferencje "nazwy stanu" i "sylwetki". ListPreference pobiera wartości i wpisy z tablicy zapisanej w zlokalizowanych folderach "values". Wartości listy były takie same (angielski), ale wpisy były zlokalizowane (angielski i hebrajski).

I wreszcie używany następujący kod:

public void OnSharedPreferenceChanged (SharedPreferences sharedPreferences, String key) 
{ 
    SharedPreferences.Editor editor = sharedPreferences.edit(); 
    Preference pref = settings.findPreference(key); 
    pref.setSummary(sharedPreferences.getString(key, "")); 

    if (key.equalsIgnoreCase(PREF_STATE) 
     || key.equalsIgnoreCase(PREF_BODY_FIGURE)) 
    { 
     editor.putString(key, ((ListPreference) pref).getValue()); 
     editor.commit(); 
    } 
} 

W ten sposób pierwszeństwo zawsze pokazał zlokalizowaną ciąg dla użytkownika (w postaci streszczenia), ale zapisany ciąg angielskiego w pamięci preferencji który ostatecznie został wysłany do serwer.

1

Ten ma żadnych skutków ubocznych: API17 i wyższe

Configuration config = new Configuration(context.getResources().getConfiguration()); 
config.setLocale(locale); 
return context.createConfigurationContext(config).getResources(); 
+0

To zadziałało dla mnie, dzięki! Uwaga: aby obsługiwać nope4561759

0

I połączyła dwa podejścia niezbędne do pracy na wszystkich wersjach Androida. See my answer here.

Powiązane problemy