Czy można programowo zmienić język aplikacji, nadal korzystając z zasobów Androida?
Jeśli nie, to czy można poprosić o zasób w określonym języku?
Chciałbym umożliwić użytkownikowi zmianę języka aplikacji z aplikacji.
android
localization
resources
hpique
źródło
źródło
Odpowiedzi:
To jest możliwe. Możesz ustawić ustawienia regionalne. Jednak nie poleciłbym tego. Wypróbowaliśmy to na wczesnych etapach, w zasadzie walczy z systemem.
Mamy ten sam wymóg zmiany języka, ale postanowiliśmy zgodzić się na fakt, że interfejs użytkownika powinien być taki sam jak interfejs telefonu. Działało przez ustawienie regionalne, ale było zbyt błędne. I musisz to ustawić za każdym razem, gdy wprowadzasz aktywność (każdą aktywność) z mojego doświadczenia. oto kod, jeśli nadal go potrzebujesz (ponownie, nie polecam tego)
Jeśli masz treści specyficzne dla języka - możesz zmienić tę bazę w zależności od ustawienia.
aktualizacja 26 marca 2020 r
źródło
Context.createConfigurationContext()
, którego można użyć do zawinięcia domyślnego kontekstu konfiguracją specyficzną dla ustawień regionalnych, a następnie wywołaniagetResources
go bez konieczności aktualizacji konfiguracji samych obiektów zasobów.conf.setLayoutDirection(locale)
, można zastąpićconf.locale = new Locale(...))
zconf.setLocale(new Locale(...))
. Zadzwoni wewnętrzniesetLayoutDirection
.Ten kod naprawdę działa:
Wpisz swój kod języka w
languageToLoad
zmiennej:źródło
Resources.updateConfiguration
metody. Wciłem kod, aby był bardziej przejrzysty.Szukałem sposobu programowej zmiany języka systemu. Chociaż w pełni rozumiem, że normalna aplikacja nigdy nie powinna tego robić i zamiast tego albo:
istniała potrzeba naprawdę programowej zmiany języka systemu.
Jest to nieudokumentowane API i dlatego nie powinno się go stosować w aplikacjach rynkowych / końcowych!
W każdym razie oto rozwiązanie, które znalazłem:
źródło
android.permission.CHANGE_CONFIGURATION
może być przyznany tylko przez aplikację podpisaną kluczem perform.Jeśli chcesz zachować zmieniony język w całej aplikacji, musisz zrobić dwie rzeczy.
Najpierw utwórz podstawową aktywność i spraw, aby wszystkie Twoje działania obejmowały:
Pamiętaj, że zapisuję nowy język we wspólnej preferencji.
Po drugie, utwórz rozszerzenie aplikacji w ten sposób:
Zauważ, że getLocale () jest taki sam jak powyżej.
To wszystko! Mam nadzieję, że to może komuś pomóc.
źródło
Application
jest i jak korzystać. mobomo.com/2011/05/how-to-use-application-object-of-androidconfiguration.locate
jest przestarzałe, setLocale wymaga API 17+ i updateConfiguration jest przestarzałeZgodnie z tym artykułem . Będziesz musiał pobrać
LocaleHelper.java
odnośniki w tym artykule.MyApplication
klasę, która będzie rozszerzanaApplication
attachBaseContext()
aby zaktualizować język.Zarejestruj tę klasę w manifeście.
Utwórz
BaseActivity
i zastąp,onAttach()
aby zaktualizować język. Potrzebny do Androida 6+Spraw, by wszystkie działania związane z Twoją aplikacją były rozszerzone
BaseActivity
.źródło
Właśnie dodałem dodatkowy kawałek, który mnie potknął.
Podczas gdy inne odpowiedzi działają na przykład dobrze z „de”
Powyższe nie będzie działać na przykład z
"fr_BE"
ustawieniami regionalnymi, więc użyjevalues-fr-rBE
folderu lub podobnego.Wymaga następującej niewielkiej zmiany do pracy
"fr_BE"
źródło
activity.recreate()
android.content.res.Configuration conf = res.getConfiguration();
zamiast tworzenia nowejConfiguration
instancji? Czy jest jakaś korzyść z używania nowej?Zostałem zmieniony na język niemiecki, ponieważ moja aplikacja sama się uruchamia.
Oto mój poprawny kod. Każdy chce użyć tego samego dla mnie .. (Jak programowo zmienić język w Androidzie)
mój kod:
źródło
Wiem, że jest późno na odpowiedź, ale znalazłem ten artykuł tutaj . Co bardzo dobrze wyjaśnia cały proces i zapewnia dobrze ustrukturyzowany kod.
Klasa pomocnika ustawień regionalnych:
Musisz przesłonić attachBaseContext i wywołać LocaleHelper.onAttach (), aby zainicjować ustawienia regionalne w aplikacji.
Wszystko, co musisz zrobić, to dodać
gdziekolwiek chcesz zmienić ustawienia regionalne.
źródło
createConfigurationContext
, który był pomocnyUtwórz klasę Rozszerza
Application
i tworzy metodę statyczną. Następnie możesz wywołać tę metodę we wszystkich czynnościach wcześniejsetContentView()
.Zastosowanie w działaniach:
źródło
W przypadku Androida 7.0 Nougat (i niższych wersji) postępuj zgodnie z tym artykułem:
Programowo zmieniaj język w systemie Android
Stara odpowiedź
Obejmuje to obsługę RTL / LTR:
źródło
Jedynym rozwiązaniem, które w pełni działa dla mnie, jest połączenie kodu Alexa Volovoya z mechanizmem ponownego uruchamiania aplikacji:
źródło
activity.recreate()
Miałem do czynienia z tym samym problemem. Na GitHub znalazłem bibliotekę Android-LocalizationActivity .
Ta biblioteka ułatwia zmianę języka aplikacji w czasie wykonywania, co widać na poniższym przykładzie kodu. Przykładowy projekt zawierający poniższy przykładowy kod i więcej informacji można znaleźć na stronie github.
LocalizationActivity rozszerza AppCompatActivity, dzięki czemu można go również używać podczas korzystania z fragmentów.
źródło
Czas na odpowiednią aktualizację.
Po pierwsze, przestarzała lista z interfejsem API, w którym została wycofana:
configuration.locale
(API 17)updateConfiguration(configuration, displaymetrics)
(API 17)Rzeczą, na którą ostatnio nie udzielono odpowiedzi, jest zastosowanie nowej metody .
createConfigurationContext to nowa metoda updateConfiguration.
Niektórzy używali go jako samodzielnego:
... ale to nie działa. Dlaczego? Metoda zwraca kontekst, który jest następnie używany do obsługi tłumaczeń Strings.xml i innych zlokalizowanych zasobów (obrazów, układów, cokolwiek).
Prawidłowe użycie wygląda następująco:
Jeśli właśnie skopiowałeś to do swojego IDE, możesz zobaczyć ostrzeżenie, że API wymaga kierowania na API 17 lub nowszy. Można to obejść, wprowadzając metodę i dodając adnotację
@TargetApi(17)
Ale poczekaj. Co ze starszymi interfejsami API?
Musisz utworzyć inną metodę za pomocą updateConfiguration bez adnotacji TargetApi.
Nie musisz tutaj zwracać kontekstu.
Teraz zarządzanie nimi może być trudne. W API 17+ potrzebujesz utworzonego kontekstu (lub zasobów z utworzonego kontekstu), aby uzyskać odpowiednie zasoby w oparciu o lokalizację. Jak sobie z tym poradzisz?
Tak to robię:
Ten kod działa, ponieważ ma jedną metodę, która wywołuje odpowiednią metodę na podstawie interfejsu API. Zrobiłem to z wieloma przestarzałymi wywołaniami (w tym Html.fromHtml). Masz jedną metodę, która pobiera potrzebne argumenty, która następnie dzieli ją na jedną z dwóch (lub trzech lub więcej) metod i zwraca odpowiedni wynik na podstawie poziomu API. Jest elastyczny, ponieważ nie musisz sprawdzać wiele razy, metoda „wejścia” robi to za Ciebie. Oto metoda wprowadzania
setLanguage
PROSZĘ PRZECZYTAĆ TO PRZED ROZPOCZĘCIEM UŻYCIA
Musisz użyć kontekstu zwróconego po otrzymaniu zasobów. Dlaczego? Widziałem tutaj inne odpowiedzi, które używają createConfigurationContext i nie używają kontekstu, który zwraca. Aby to działało, należy wywołać updateConfiguration. Które jest przestarzałe. Użyj kontekstu zwróconego przez metodę, aby uzyskać zasoby.
Przykładowe użycie :
Konstruktor lub coś podobnego:
A potem, gdziekolwiek chcesz zdobyć zasoby, które robisz:
Użycie dowolnego innego kontekstu (teoretycznie) to złamie.
AFAIK nadal musisz używać kontekstu aktywności do wyświetlania okien dialogowych lub Toastów. w tym celu możesz użyć instancji działania (jeśli jesteś na zewnątrz)
I na koniec użyj
recreate()
tego działania, aby odświeżyć zawartość. Skrót, aby nie tworzyć zamiaru odświeżenia.źródło
Jeśli napiszesz
W każdej aktywności (w pliku manifestu) nie ma potrzeby ustawiania jej przy każdym wejściu
Activity
.źródło
configChanges
do hakowania, aby zachować stan Aktywności podczas rotacji / etc.Ważna aktualizacja:
Zauważ, że w SDK> = 21 musisz wywołać „Resources.updateConfiguration ()” , w przeciwnym razie zasoby nie zostaną zaktualizowane.
źródło
Context ctx = createConfigurationContext(args);
i otrzymujesz z tego zasobyźródło
activity.recreate()
Locale
configuration
należy ustawić w każdymactivity
przed ustawieniem treści -this.setContentView(R.layout.main);
źródło
activity.recreate()
Najpierw utwórz plik multi string.xml dla różnych języków; następnie użyj tego bloku kodu w
onCreate()
metodzie:źródło
Oto kod, który działa dla mnie:
Źródło: tutaj
źródło
Żadne z wymienionych tutaj rozwiązań nie pomogło mi.
Język nie włącza się w Androidzie> = 7.0, jeśli AppCompatDelegate.setDefaultNightMode (AppCompatDelegate.MODE_NIGHT_YES)
To LocaleUtils działa dobrze: https://gist.github.com/GigigoGreenLabs/7d555c762ba2d3a810fe
LocaleUtils
Dodano ten kod do aplikacji
Kod w działaniu
źródło
Odpowiedź Alex Volovoy działa tylko dla mnie, jeśli jest w metodzie onCreate działania.
Odpowiedź, która działa we wszystkich metodach, znajduje się w innym wątku
Zmień język programowo w Androidzie
Oto adaptacja kodu
Mam nadzieję, że to pomaga.
źródło
Należy pamiętać, że korzystanie z tego rozwiązania
updateConfiguration
nie będzie już działać z wydaniem Androida M za kilka tygodni. Nowym sposobem na to jest teraz użycieapplyOverrideConfiguration
metody zContextThemeWrapper
patrz dokumentacja APIMożesz znaleźć moje pełne rozwiązanie tutaj, ponieważ sam napotkałem problem: https://stackoverflow.com/a/31787201/2776572
źródło
Jest kilka kroków, które powinieneś wdrożyć
Najpierw musisz zmienić ustawienia regionalne swojej konfiguracji
Po drugie, jeśli chcesz, aby zmiany miały zastosowanie bezpośrednio do widocznego układu, możesz albo zaktualizować widoki bezpośrednio, albo po prostu wywołać activity.recreate (), aby zrestartować bieżącą aktywność.
Musisz także zachować zmiany, ponieważ po zamknięciu aplikacji przez użytkownika stracisz zmianę języka.
Bardziej szczegółowe rozwiązanie wyjaśniłem na moim blogu Zmień programowo język w systemie Android
Zasadniczo wystarczy wywołać funkcję LocaleHelper.onCreate () w klasie aplikacji, a jeśli chcesz zmienić ustawienia lokalne w locie, możesz wywołać funkcję LocaleHelper.setLocale ()
źródło
Działa to, gdy naciskam przycisk, aby zmienić język tekstu w TextView. (Strings.xml w folderze wartości)
źródło
Dodaj klasę LocaleHelper
W działaniu lub fragmencie
Teraz SetText na każdym tekście
źródło
podobna do przyjętej wersji z odpowiedzią, ale z 2017 r. i dodanego restartu (bez restartu, czasami następna czynność nadal wyświetla angielski):
źródło
activity.recreate()
3) zwrócony kontekst Myślę, że należy użyć, aby uzyskać zasobyNajpierw tworzysz wartości nazw katalogów - „Nazwa języka” jak hindi niż piszesz „cześć” i kopiujesz w tym katalogu nazwę pliku z ciągiem, a wartość nie zmienia parametru po ustawieniu poniżej kodu w akcji, takiej jak przycisk itp.
źródło
conf.locale
jest przestarzałeźródło
W przykładzie ustawiamy język angielski:
Pamiętaj, że działa to tylko wtedy, gdy język znajduje się również w systemie urządzeń, nie tylko w aplikacji
źródło
Do obsługi języka arabskiego / RTL
źródło