Динамическая локализация приложений для Android

Я прочитал здесь, что локализация в приложениях Android происходит через файлы XML, которые развернуты с приложением.

Можно ли динамически загружать эти файлы XML во время выполнения в приложение?

Если нет, возможно ли переопределить привязку между XML-интерфейсом пользовательского интерфейса и ресурсами XML таким образом, чтобы я мог привязываться к моему, динамически загруженному XML файлу вместо одного в res/values?

Спасибо

Ответ 1

Можно ли динамически загружать эти файлы xml во время выполнения в приложение?

Нет, извините.

Если нет, возможно ли переопределить привязку между XML-интерфейсом UI и ресурсами XML таким образом, чтобы я мог привязываться к своему динамически загруженному XML файлу вместо одного значения res/values?

Ничего в res/values/ никогда не используется, если вы не используете его. Следовательно, нечего "переопределять".

Например, предположим, что у вас есть TextView. Вы хотите, чтобы он отображал текст. Вы хотите, чтобы текст был локализован. Как правило, вы должны установить ряд строковых ресурсов, по одному на перевод, а затем использовать эти строковые ресурсы с помощью TextView (например, android:text в макете или setText() в Java). В вашем случае вы не будете устанавливать строковые ресурсы, но "сделайте свое дело" и вызовите setText() по мере необходимости.

То, что вы теряете в своем подходе, - это автоматическое преобразование. Если пользователь переключает языки во время работы вашего приложения, Android будет рассматривать это как изменение конфигурации и перезапустить ваши действия по мере их возврата на передний план. Обычно это автоматически загружается в новые ресурсы строки. В вашем случае это не будет, потому что вы не используете строковые ресурсы. Вместо этого вам нужно будет сказать Android, чтобы он не перезапускал ваши действия (через android:configChanges) и вручную перезагружал все ваши виджеты TextView и т.д. Самостоятельно. И если вы забудете один, ну, пользователь просто ввернут.

ИМХО, если кто-то не укажет пистолет у вас в голове, чтобы заставить вас попытаться сменить перевод, не отправляя новые версии приложения, просто используйте строковые ресурсы и отправляйте новые версии приложения.

Ответ 2

Если вы хотите, вы можете изобрести колесо и реализовать свою собственную загрузку ресурсов на основе Locale.

Вы можете получить текущий Locale через

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

Затем используйте результаты, чтобы правильно загрузить свои собственные строки/чертежи/что угодно. Конечно, вы должны делать все это программно (макеты XML не будут автоматически использовать правильные ресурсы).

Я очень рекомендую придерживаться стандартных методов локализации.