Chcę, aby moja aplikacja obsługiwała trzy języki: hiszpański, portugalski i angielski. I daj opcję wyboru języka w aplikacji
1) 3 foldery do rysowania drawable-es, drawable-pt, drawable.
2) Folder z 3 wartościami wartości-es, wartości-pt, wartości Zmień wartości String.xml według języków.
Mam imageView, aby wybrać język, po kliknięciu go otworzy się menu zawierające opcje angielski, hiszpański, portugalski.
Ustawiłem Locale wewnątrz aplikacji na wybór opcji za pomocą tego kodu
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.en:
Locale locale = new Locale("en");
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
Toast.makeText(this, "Locale in English !", Toast.LENGTH_LONG).show();
break;
case R.id.pt:
Locale locale2 = new Locale("pt");
Locale.setDefault(locale2);
Configuration config2 = new Configuration();
config2.locale = locale2;
getBaseContext().getResources().updateConfiguration(config2, getBaseContext().getResources().getDisplayMetrics());
Toast.makeText(this, "Locale in Portugal !", Toast.LENGTH_LONG).show();
break;
case R.id.es:
Locale locale3 = new Locale("es");
Locale.setDefault(locale3);
Configuration config3 = new Configuration();
config3.locale = locale3;
getBaseContext().getResources().updateConfiguration(config3, getBaseContext().getResources().getDisplayMetrics());
Toast.makeText(this, "Locale in Spain !", Toast.LENGTH_LONG).show();
break;
}
return super.onOptionsItemSelected(item);
}
Zadeklarowałem w Manifest- android: configChanges = "locale"
Działa, ale ma pewien problem.
Problem:-
1) Po wybraniu języka ekran zawierający obraz wyboru języka nie zmienia się, ale zmieniają się inne ekrany.
2) Po zmianie orientacji przywróć język aplikacji zgodnie z lokalizacją telefonu.
źródło
android:configChanges="locale"
dla swojej aktywności w pliku AndroidManifest.xmlOdpowiedzi:
To fragment strony internetowej: http://android.programmerguru.com/android-localization-at-runtime/
Zmiana języka aplikacji jest prosta, gdy użytkownik wybierze ją z listy języków. Miej metodę podobną do poniższej, która akceptuje ustawienia regionalne jako ciąg (np. „En” dla angielskiego, „hi” dla hindi), skonfiguruj ustawienia regionalne dla swojej aplikacji i odśwież swoją bieżącą aktywność, aby odzwierciedlić zmianę języka. Zastosowane ustawienia regionalne nie zostaną zmienione, dopóki nie zmienisz ich ręcznie ponownie.
Upewnij się, że zaimportowałeś następujące pakiety:
dodaj w manifeście do działania android: configChanges = "lokalizacja | orientacja"
źródło
finish()
należy wcześniej zadzwonićstartActivity(refresh)
. W przeciwnym razie aplikacja może zostać zamknięta zamiast ponownego uruchamiania działania.Dobre rozwiązania wyjaśniono tutaj całkiem dobrze. Ale oto jeszcze jeden.
Utwórz własną
CustomContextWrapper
rozszerzającą klasęContextWrapper
i użyj jej do zmiany ustawień regionalnych dla całej aplikacji. Oto GIST z użyciem.Następnie wywołaj
CustomContextWrapper
z zapisanym identyfikatorem ustawień regionalnych, np.'hi'
Dla języka hindi w metodzie cyklu życia działaniaattachBaseContext
. Użycie tutaj:źródło
MyContextWrapper.warp
sięonAttach
od jednego fragmentu mojego app ale język został zmieniony dla całej aplikacji, ale tytuły działalności nie uległy zmianie, myślę, że wynika z tego, że tytuły manifestu mają pierwszeństwo, ale jeśli wywołam tę samą metodę wonAttachBaseContex
mojej podklasie aplikacji, tytuły działań również zmienią się na wybrany język, ale wtedy zmiany zostaną zastosowane tylko do fragmentu, który wywołałem w metodzie warp, dlaczego tak jest ?warp
metody wonAttach
fragmencie, wcześniej powiedziałem, że muszę to zrobić z fragmentem mainactivity i zmienionym językiem cała aplikacja to prawda, ale dla wszystkich innych fragmentów język zmienia się na angielski przy zmianie konfiguracji, więc muszę wstawićonattach
wszystkie fragmenty i zamiast manifestu ustawić tytuły paska akcji w kodzie, teraz aplikacja działa zgodnie z oczekiwaniami. dziękiattachBaseContext
funkcji. I to dotyczy wszystkich ekranów. Czy utworzyłeś „BaseActivity” dla wszystkich działań w swojej aplikacji?wrap()
kod musi być wykonywany przy każdej zmianie konfiguracji, więc umieściłem go w Działalność abstrakcyjna, z której wszystkie inne działania się rozciągają, teraz działaNależy albo usunąć
android:configChanges="locale"
z manifestu, co spowoduje ponowne załadowanie działania, albo nadpisaćonConfigurationChanged
metodę:źródło
cały powyższy kod @ Uday jest doskonały, ale brakuje tylko jednej rzeczy (domyślna konfiguracja w build.gradle)
}
Mój nie działał tylko dlatego, że języki nie były wymienione w pliku konfiguracyjnym (build.gradle)
potem wszystkie języki zaczęły działać
źródło
Ci, którzy mają problem z wersją, wypróbuj ten kod.
źródło
Przykładowy kod Udhay działa dobrze. Z wyjątkiem kwestii Sofiane Hassaini i Chiraga Solanki, w przypadku ponownego wejścia to nie działa. Próbuję wywołać kod Udhaya bez ponownego uruchamiania działania w onCreate (), przed super.onCreate (saveInstanceState) ;. Wtedy jest OK! Tylko mały problem, ciągi menu nadal nie zmieniły się na ustawione Locale.
źródło
Intent refresh = new Intent(this, ThisActivity.class); startActivity(refresh);
?