2014-04-28 22 views
32

Po zainstalowaniu programu I moim Android sprawdzać lokalizacji urządzenia:Android locale urządzenie get

String deviceLocale=Locale.getDefault().getLanguage(); 

Jeśli deviceLocale jest wewnątrz moje obsługiwane języki (angielski, francuski, niemiecki) Nie zmieniać ustawienia regionalne.

Ale na przykład powiedz, że jeśli nie obsługuję języka urządzenia: na przykład hiszpański.
Ustawiam bieżące ustawienia narodowe na angielski, ponieważ większość osób może częściowo rozumieć angielski.

Locale locale = new Locale("en"); 
Locale.setDefault(locale); 
Configuration config = new Configuration(); 
config.locale = locale; 
pContext.getResources().updateConfiguration(config, null); 

Ale potem, w innych metodach, kiedy sprawdzić ustawienia narodowe urządzenia takiego:

String deviceLocale=Locale.getDefault().getLanguage(); 

otrzymuję wynik jako "English". Ale lokalizacja urządzenia to hiszpański.

Czy funkcja getLanguage() udostępnia lokalną lokalizację aplikacji?
Jak mogę uzyskać ustawienia regionalne urządzenia?

Edytuj: W pierwszym uruchomieniu aplikacji można zapisać ustawienia regionalne urządzenia. Ale jeśli użytkownik zmieni ustawienia regionalne urządzenia po zapisaniu, nie mogę znać nowych ustawień regionalnych urządzenia. Mogę znać tylko ustawienia narodowe, które zapisałem w instalacji aplikacji.

+0

Jeśli otrzymasz domyślne locale PO ustawieniu go ... 'otrzymasz to, co ustawiłeś'. Może to być opcja zapisania ustawień narodowych PRZED ich zmianą (powiedzmy, do SharedPreference), aby odzyskać je później - jeśli chcesz wrócić. –

+0

Kiedy jednak wracam i ładuję zapisaną lokalnie wartość, otrzymuję najnowsze znane ustawienia regionalne urządzenia. Ale po zapisaniu, jeśli użytkownik zmienia ustawienia regionalne urządzenia, nie mogę znać aktualnego ustawienia regionalnego urządzenia? – trante

+0

To dobry punkt. Mój był trochę hack. Nadal uważam, że nie masz dużo zabawy w zmianie ustawień regionalnych urządzenia więcej niż jeden raz w życiu telefonicznym ... lub bardziej "zabawnym", częściej niż raz dziennie. W każdym razie masz rację - mój hack tak naprawdę nie rozwiązuje problemu. –

Odpowiedz

60

Jest znacznie prostszy i bardziej przejrzysty sposób to zrobić, niż przy użyciu odbicia lub parsowania niektóre właściwości systemu.

Jak już zauważyłeś, po ustawieniu domyślnych ustawień regionalnych w aplikacji, nie masz już dostępu do domyślnych ustawień regionalnych systemu. Domyślne ustawienia regionalne ustawione w aplikacji są ważne tylko podczas cyklu życia aplikacji. Wszystko, co ustawisz w Locale.setDefault (Locale) zniknie po zakończeniu procesu. Po ponownym uruchomieniu aplikacji ponownie będzie można odczytać domyślne ustawienia regionalne systemu.

Wszystko, co musisz zrobić, to pobrać domyślne ustawienia regionalne systemu podczas uruchamiania aplikacji, zapamiętaj je tak długo, jak działa aplikacja i zaktualizuj ją, jeśli użytkownik zdecyduje się zmienić język w ustawieniach Androida. Ponieważ potrzebujemy tej informacji tylko tak długo, jak aplikacja działa, możemy po prostu przechowywać ją w zmiennej statycznej, która jest dostępna z dowolnego miejsca w aplikacji.

A oto jak to zrobić:

public class MyApplication extends Application { 

    public static String sDefSystemLanguage; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 

     sDefSystemLanguage = Locale.getDefault().getLanguage(); 
    } 

    @Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 

     sDefSystemLanguage = newConfig.locale.getLanguage(); 
    } 

} 

Korzystanie z aplikacji (nie zapomnij zdefiniować go w swoim manifeście) otrzymujemy domyślne ustawienia podczas uruchamiania aplikacji (onCreate()) i aktualizujemy gdy użytkownik zmieni język w ustawieniach Androida (onConfigurationChanged (Configuration)). To wszystko. Ilekroć musisz wiedzieć, jaki był domyślny język systemu przed skorzystaniem z wywołania setDefault, sDefSystemLanguage udzieli odpowiedzi.

Jest jeden problem, który zauważyłem w twoim kodzie. Po ustawieniu nowego ustawienia narodowego:

Configuration config = new Configuration(); 
config.locale = locale; 
pContext.getResources().updateConfiguration(config, null); 

Po wykonaniu tej czynności zastępowane są wszystkie informacje dotyczące konfiguracji, które można zachować. Na przykład. Configuration.fontScale odzwierciedla ustawienia dostępności Duży tekst. Zgodnie z ustawieniami języka i utratą wszystkich innych konfiguracji, Twoja aplikacja nie będzie już odzwierciedlać ustawień Dużego tekstu, co oznacza, że ​​tekst jest mniejszy niż powinien (jeśli użytkownik włączył duże ustawienie tekstu). Poprawny sposób to zrobić to:

Resources res = pContext.getResources(); 
Configuration config = res.getConfiguration(); 
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { 
    configuration.setLocale(Locale.CANADA); 
} 
else { 
    configuration.locale = Locale.CANADA; 
} 
res.updateConfiguration(config, null); 

Więc zamiast tworzyć nowy obiekt konfiguracji po prostu zaktualizować bieżący.

+0

Dziękuję za informacje i dodatkowe informacje na temat problemu 'new Configuration()'. – trante

7

Najlepszym sposobem zaprojektowania aplikacji jest użycie domyślnego języka, angielskiego w twoim przypadku, pod wartościami/i możesz dodać języki dodatkowe w wartościach-XX /. W ten sposób, gdy język nie jest obsługiwany przez system operacyjny z Androidem, jest on domyślny, a więc angielski. Niech system operacyjny wykona pracę za ciebie :) Jednak, jeśli zmienisz ustawienia narodowe, otrzymasz swoje ostatnie ustawienia, więc musisz je gdzieś zapisać.

1

należy użyć String deviceLocale= Locale.getDefault().getDisplayLanguage(); aby wyświetlić język zamiast

String deviceLocale=Locale.getDefault().getLanguage(); 

Sprawdź tę odpowiedź może pomóc, jeśli powyżej nie. Clickable

-1

Aby korzystać z ustawienia regionalne Urządzenie to

Locale current = context.getResources().getConfiguration().locale; 

i current.toString() wrócisz „en”, „ar” itp

1

Chociaż odpowiedź przez @user2944616 jest politycznie poprawne, że nie otrzymując odpowiedź na postawione pytanie.

Tak więc, jeśli naprawdę musiał znać regionalnych systemu zestaw użytkownik, chciałbym użyć refleksji (nie wiem nic lepszego opcja ATM):

private String getSystemPropertyValue(String name) { 
    try { 
     Class<?> systemProperties = Class.forName("android.os.SystemProperties"); 
     try { 
      Method get = systemProperties.getMethod("get", String.class, String.class); 
      if (get == null) { 
       return "Failure!?"; 
      } 
      try { 
       return (String)get.invoke(systemProperties, name, ""); 
      } catch (IllegalAccessException e) { 
       return "IllegalAccessException"; 
      } catch (IllegalArgumentException e) { 
       return "IllegalArgumentException"; 
      } catch (InvocationTargetException e) { 
       return "InvocationTargetException"; 
      } 
     } catch (NoSuchMethodException e) { 
      return "SystemProperties.get(String key, String def) method is not found"; 
     } 
    } catch (ClassNotFoundException e) { 
     return "SystemProperties class is not found"; 
    } 
} 

z tym danym i urządzenia locale ustawione na hiszpańskim (Stany Zjednoczone)/Español (Estados Unidos) następujący ciąg

<string name="system_locale">System locale: <xliff:g id="profile_name">%1$s</xliff:g>&#95;<xliff:g id="device_name">%2$s</xliff:g></string> 

i ten kod

private static final String SYS_COUNTRY = "persist.sys.country"; 
private static final String SYS_LANG = "persist.sys.language"; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    TextView tv = (TextView)findViewById(R.id.locale); 
    tv.setText(getString(R.string.system_locale, getSystemPropertyValue(SYS_LANG), 
      getSystemPropertyValue(SYS_COUNTRY))); 
} 

yiel DS następujący ekran:

System locale screenshot

Jeśli jest to pożądane, może także z łatwością skonstruować Locale przykład poprzez zastosowanie powyżej: wyjście

Locale locale = new Locale(getSystemPropertyValue(SYS_LANG), 
     getSystemPropertyValue(SYS_COUNTRY)); 
Log.d(TAG, "Language: " + locale.getLanguage()); 
Log.d(TAG, "Country: " + locale.getCountry()); 

Log:

D/GetSystemLocale(5697): Language: es 
D/GetSystemLocale(5697): Country: US 

nadzieję, że to pomaga.

+1

Dla mnie wydaje się najlepszym sposobem to zrobić. Sposobem na uniknięcie refleksji byłoby po prostu wykonanie polecenia 'getprop' i przeanalizowanie danych wyjściowych. Możesz również uzyskać [kraj] (https://developer.android.com/reference/android/provider/Settings.Secure.html#TTS_DEFAULT_COUNTRY) i [język] (https://developer.android.com/ reference/android/provider/Settings.Secure.html # TTS_DEFAULT_LANG) systemu TTS. – naw

+0

Domyślny język silnika TTS może z łatwością różnić się od ustawień regionalnych systemu. – ozbek

3

Jak zmieniająApplication language programatically like

Locale locale = new Locale("en"); 
Locale.setDefault(locale); 
Configuration config = new Configuration(); 
config.locale = locale; 
pContext.getResources().updateConfiguration(config, null); 

I

But after that, in other methods, when I check device's locale like this: 

String deviceLocale=Locale.getDefault().getLanguage(); 
I get result as "English". But device's locale is Spanish. 

Więc zamiast tego użyć tego kodu poniżej, aby uzyskaćdevice's Local

try { 
    Process exec = Runtime.getRuntime().exec(new String[]{"getprop", "persist.sys.language"}); 
    String locale = new BufferedReader(new InputStreamReader(exec.getInputStream())).readLine(); 
    exec.destroy(); 
    Log.e("", "Device locale: "+locale); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

WYJŚCIE:SpanishCheck this

Mam nadzieję, że dokładnie to, czego szukasz.

29

Można uzyskać dostęp do globalnego locale przez -

defaultLocale = Resources.getSystem().getConfiguration().locale;

Spójrz na http://developer.android.com/reference/android/content/res/Resources.html#getSystem() -

Zwraca globalnych zasobów udostępnionych obiekt, który zapewnia dostęp do zasobów tylko System (bez zasobów aplikacji)

0 Aktualizacja

Aktualizacja: Jak wskazano w polu "locale" w komentarzach, jest ono przestarzałe i należy zamiast tego użyć numeru getLocales().

defaultLocale = Resources.getSystem().getConfiguration().getLocales().get(0);

+0

to jest właściwe rozwiązanie! Locale.getDefault(). GetLanguage() poda zestaw ustawiony przez twoją aplikację, a nie język telefonu. –

Powiązane problemy