Ошибка перевода языка в приложении Android - PullRequest
0 голосов
/ 17 октября 2019

У меня проблема с переводом языка English -> Spanish и наоборот. У меня есть два файла в строковых ресурсах:

strings.xml => Английский

<resources>
  <string name="gender_male">Male</string>
  <string name="gender_female">Female</string>
</resources>

strings.xml => Испанский

<resources>
  <string name="gender_male">pequeño</string>
  <string name="gender_female">hembra</string>
</resources>

По какой-то причине, когда приложение находится в оперативной памяти мобильного устройства, но не в фокусе, и я меняю системный язык, приложение выбирает ранее выбранный язык. Он читает неправильный файл регресса с неправильными строками (он читает предыдущий язык). Но когда я удаляю приложение из оперативной памяти, выбираю следующий язык на мобильном устройстве, снова захожу в приложение, все работает нормально. Он выбирает правильный ресурс с правильными строками. У кого-нибудь есть идеи о том, что происходит?

1 Ответ

0 голосов
/ 17 октября 2019

Для того, чтобы справиться с изменением языка, вы должны сделать это путем обработки изменений конфигурации.

https://developer.android.com/guide/topics/resources/runtime-changes

В вашем AndroidManifest.xml

<activity android:name=".MyActivity"
      android:configChanges="locale"
      android:label="@string/app_name">

Тогдав вашей деятельности:

@Override public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    // reapply your strings here
    // invalidating the views should work
    // the line below should force all the views to redraw
    // but you can do a more selective update to improve
    // performance 
    findViewById(android.R.id.content).invalidate()
}

В Котлине:

 override fun onConfigurationChanged(newConfig: Configuration) {
    super.onConfigurationChanged(newConfig);
    // reapply your strings here
    // invalidating the views should work
    // the line below should force all the views to redraw
    // but you can do a more selective update to improve
    // performance 
    findViewById(android.R.id.content).invalidate()
}
...