Можно ли программно изменить язык приложения, все еще используя ресурсы Android?
Если нет, можно ли запросить ресурс на определенном языке?
Я хотел бы позволить пользователю изменить язык приложения из приложения.
android
localization
resources
hpique
источник
источник
Ответы:
Возможно. Вы можете установить локаль. Однако я бы не рекомендовал это. Мы попробовали это на ранних стадиях, это в основном борьба с системой.
У нас есть такое же требование для изменения языка, но мы решили согласиться с тем, что пользовательский интерфейс должен совпадать с пользовательским интерфейсом телефона. Он работал через настройку локали, но был слишком глючным. И вы должны устанавливать его каждый раз, когда вы входите в действие (каждое действие) из моего опыта. вот код, если вам все еще нужно это (опять же, я не рекомендую это)
Если у вас есть контент для конкретного языка - вы можете изменить эту базу в зависимости от настроек.
Обновление от 26 марта 2020 года
источник
Context.createConfigurationContext()
, который можно использовать для обертывания контекста по умолчанию с помощью конфигурации, специфичной для локали, а затем вызывать ееgetResources
, не обновляя конфигурацию самих объектов ресурсов.conf.setLayoutDirection(locale)
вы можете заменитьconf.locale = new Locale(...))
наconf.setLocale(new Locale(...))
. Это будет внутренне звонитьsetLayoutDirection
.Этот код действительно работает:
Введите свой код языка в
languageToLoad
переменную:источник
Resources.updateConfiguration
метода. Я отступил в коде, чтобы сделать его более понятным.Я искал способ изменить язык системы программно. Хотя я полностью понимаю, что нормальное приложение никогда не должно этого делать, а вместо этого:
возникла необходимость реально изменить язык системы программно.
Это недокументированный API и, следовательно, не должен использоваться для приложений рынка / конечного пользователя!
В любом случае вот решение, которое я нашел:
источник
android.permission.CHANGE_CONFIGURATION
может быть предоставлено только приложением, подписанным с ключом выполнения.Если вы хотите сохранить язык, измененный во всем приложении, вам нужно сделать две вещи.
Во-первых, создайте базовую активность и сделайте так, чтобы все ваши действия расширялись от этого:
Обратите внимание, что я сохраняю новый язык в sharedPreference.
Во-вторых, создайте расширение Application следующим образом:
Обратите внимание, что getLocale () это то же самое, что и выше.
Это все! Я надеюсь, что это может кому-то помочь.
источник
Application
такое и как использовать. mobomo.com/2011/05/how-to-use-application-object-of-androidconfiguration.locate
устарела, setLocale требует API 17+, а updateConfiguration устарелаПо этой статье . Вам нужно будет загрузить
LocaleHelper.java
ссылку в этой статье.MyApplication
класс, который будет расширятьсяApplication
attachBaseContext()
чтобы обновить язык.Зарегистрируйте этот класс в манифесте.
Создать
BaseActivity
и переопределить,onAttach()
чтобы обновить язык. Требуется для Android 6+Сделать все действия в вашем приложении начинается с
BaseActivity
.источник
Просто добавляю лишнюю часть, которая сбила меня с толку.
В то время как другие ответы хорошо работают с "де", например
Вышеуказанное не будет работать, например, с
"fr_BE"
локалью, поэтому она будет использоватьvalues-fr-rBE
папку или подобное.Требуется следующее небольшое изменение для работы с
"fr_BE"
источник
activity.recreate()
android.content.res.Configuration conf = res.getConfiguration();
вместо создания новогоConfiguration
экземпляра? Есть ли польза от использования свежего?Я перешел на немецкий язык для запуска самого приложения.
Вот мой правильный код. Кто-нибудь хочет использовать это же для меня .. (Как программно изменить язык в Android)
мой код:
источник
Я знаю, что уже поздно отвечать, но я нашел эту статью здесь . Что очень хорошо объясняет весь процесс и дает вам хорошо структурированный код.
Класс Locale Helper:
Вам нужно переопределить attachBaseContext и вызвать LocaleHelper.onAttach () для инициализации настроек локали в вашем приложении.
Все, что вам нужно сделать, это добавить
везде, где вы хотите изменить локаль.
источник
createConfigurationContext
, что было полезноСоздать класс Extennds
Application
и создать статический метод. Затем вы можете вызвать этот метод во всех действиях раньшеsetContentView()
.Использование в деятельности:
источник
Для Android 7.0 Nougat (и ниже) следуйте этой статье:
Изменить язык программно в Android
Старый ответ
Это включает в себя поддержку RTL / LTR:
источник
Единственное решение, которое полностью работает для меня, - это сочетание кода Алексея Волового с механизмом перезапуска приложения:
источник
activity.recreate()
Я столкнулся с той же проблемой. На GitHub я обнаружил библиотеку Android-LocalizationActivity .
Эта библиотека позволяет очень просто изменить язык вашего приложения во время выполнения, как вы можете видеть в примере кода ниже. Пример проекта, включая приведенный ниже пример кода и дополнительную информацию, можно найти на странице github.
LocalizationActivity расширяет AppCompatActivity, поэтому вы также можете использовать его при использовании фрагментов.
источник
Время для обновления.
Во-первых, устаревший список с API, в котором он устарел:
configuration.locale
(API 17)updateConfiguration(configuration, displaymetrics)
(API 17)То, на что не отвечали ни на один вопрос в последнее время, стало правильным - это использование нового метода .
createConfigurationContext - это новый метод для updateConfiguration.
Некоторые использовали его как этот:
... но это не работает. Почему? Метод возвращает контекст, который затем используется для обработки переводов Strings.xml и других локализованных ресурсов (изображений, макетов и т. Д.).
Правильное использование так:
Если вы просто скопируете это в свою IDE, вы можете увидеть предупреждение о том, что API требует, чтобы вы настроили таргетинг на API 17 или выше. Это можно обойти, поместив его в метод и добавив аннотацию
@TargetApi(17)
Но ждать. Как насчет старых API?
Вам нужно создать другой метод, используя updateConfiguration без аннотации TargetApi.
Вам не нужно возвращать контекст здесь.
Теперь управлять ими может быть сложно. В API 17+ вам нужен созданный контекст (или ресурсы из созданного контекста), чтобы получить соответствующие ресурсы на основе локализации. Как вы справляетесь с этим?
Ну, вот как я это делаю:
Этот код работает, имея один метод, который выполняет вызовы соответствующего метода, в зависимости от того, какой API. Это то, что я сделал с множеством различных устаревших вызовов (в том числе Html.fromHtml). У вас есть один метод, который принимает необходимые аргументы, который затем разбивает его на один из двух (или трех или более) методов и возвращает соответствующий результат на основе уровня API. Он гибкий, так как вам не нужно проверять несколько раз, метод "entry" сделает это за вас. Метод входа здесь
setLanguage
ПОЖАЛУЙСТА, ПРОЧИТАЙТЕ ЭТО ПЕРЕД ИСПОЛЬЗОВАНИЕМ ЭТОГО
Вам нужно использовать контекст, возвращаемый при получении ресурсов. Почему? Я видел другие ответы, которые используют createConfigurationContext и не используют возвращаемый контекст. Чтобы заставить его работать так, необходимо вызвать updateConfiguration. Что не рекомендуется. Используйте контекст, возвращаемый методом, чтобы получить ресурсы.
Пример использования :
Конструктор или где-то подобное:
И затем, где бы вы ни хотели получить ресурсы, вы делаете:
Использование любого другого контекста (теоретически) сломает это.
AFAIK, вы все равно должны использовать контекст деятельности, чтобы показать диалоги или тосты. для этого вы можете использовать экземпляр действия (если вы находитесь за пределами)
И, наконец, используйте
recreate()
упражнение для обновления содержимого. Ярлык, чтобы не создавать намерение обновить.источник
Если ты пишешь
В каждом действии (в файле манифеста) нет необходимости устанавливать его каждый раз при вводе
Activity
.источник
configChanges
использовался только для взлома, чтобы сохранить состояние активности при поворотах / и т.д.Важное обновление:
Обратите внимание, что в SDK> = 21 вам необходимо вызвать 'Resources.updateConfiguration ()' , иначе ресурсы не будут обновлены.
источник
Context ctx = createConfigurationContext(args);
и получаете ресурсы от этогоисточник
activity.recreate()
Locale
configuration
должны быть установлены в каждомactivity
перед настройкой содержимого -this.setContentView(R.layout.main);
источник
activity.recreate()
Сначала создайте multi string.xml для разных языков; затем используйте этот блок кода в
onCreate()
методе:источник
Вот код, который работает для меня:
Источник: здесь
источник
Ни одно из перечисленных здесь решений не помогло мне.
Язык не включал android> = 7.0, если AppCompatDelegate.setDefaultNightMode (AppCompatDelegate.MODE_NIGHT_YES)
Этот LocaleUtils работает просто отлично: https://gist.github.com/GigigoGreenLabs/7d555c762ba2d3a810fe
LocaleUtils
Добавил этот код в приложение
Код в деятельности
источник
Ответ Алексея Волового работает только для меня, если он используется в методе действия onCreate.
Ответ, который работает во всех методах, находится в другом потоке
Изменить язык программно в Android
Вот адаптация кода
Надеюсь, что это поможет.
источник
Обратите внимание, что использование этого решения
updateConfiguration
больше не будет работать с выпуском Android M через несколько недель. Новый способ сделать это теперь используетapplyOverrideConfiguration
метод изContextThemeWrapper
см. API документВы можете найти мое полное решение здесь, так как я сам столкнулся с проблемой: https://stackoverflow.com/a/31787201/2776572
источник
Есть несколько шагов, которые вы должны реализовать
Во-первых, вам нужно изменить локаль вашей конфигурации
Во-вторых, если вы хотите, чтобы ваши изменения применялись непосредственно к отображаемому макету, вы можете либо обновить представления напрямую, либо просто вызвать action.recreate (), чтобы перезапустить текущее действие.
А также вы должны сохранить ваши изменения, потому что после того, как пользователь закроет ваше приложение, вы потеряете изменение языка.
Более подробное решение я объяснил в своем блоге « Смена языка программно в Android»
По сути, вы просто вызываете LocaleHelper.onCreate () для своего класса приложения, и если вы хотите изменить локаль на лету, вы можете вызвать LocaleHelper.setLocale ()
источник
Это работает, когда я нажимаю кнопку, чтобы изменить язык текста моего TextView. (Strings.xml в папке values-de)
источник
Добавить класс LocaleHelper
В действии или фрагменте
Теперь установите текст на каждый текст
источник
аналогично принятой версии с ответом, но версии 2017 года и добавленному перезапуску (без перезапуска, иногда следующее действие по-прежнему отображает английский):
источник
activity.recreate()
3) возвращенный контекст, я думаю, должен быть использован для получения ресурсовСначала вы создаете значения имени каталога - «Имя языка», например, хинди, затем пишете «hi» и копируете имя файла с той же строкой в этот каталог и изменяете значение, не меняя параметр после кода, указанного ниже в вашем действии, как кнопка и т. Д.
источник
conf.locale
устарелаисточник
В примере мы установили английский язык:
Пожалуйста, помните, что это работает только в том случае, если язык найден в системе устройства, а не только в приложении
источник
Для поддержки арабского языка / RTL
источник