是否可以在使用Android资源的同时以编程方式更改应用程序的语言?
如果没有,是否可以请求特定语言的资源?
我想让用户从应用程序更改应用程序的语言.
我的应用程序支持3种(很快4种)语言.由于几个语言环境非常相似,我想让用户选择在我的应用程序中更改语言环境,例如意大利人可能更喜欢西班牙语而不是英语.
有没有办法让用户在可用于应用程序的语言环境中进行选择,然后更改使用的语言环境?我不认为为每个Activity设置语言环境是一个问题,因为它是在基类中执行的简单任务.
就在最近的context.getResources().updateConfiguration()已在Android API 25中弃用,建议使用上下文.而是createConfigurationContext().
有谁知道createConfigurationContext如何用于覆盖android系统区域设置?
在此之前将通过以下方式完成:
Configuration config = getBaseContext().getResources().getConfiguration();
config.setLocale(locale);
context.getResources().updateConfiguration(config,
context.getResources().getDisplayMetrics());
Run Code Online (Sandbox Code Playgroud) 我发现非常奇怪的错误只能在Android N设备上重现.
在浏览我的应用程序时,有可能改变语言.这是改变它的代码.
public void update(Locale locale) {
Locale.setDefault(locale);
Configuration configuration = res.getConfiguration();
if (BuildUtils.isAtLeast24Api()) {
LocaleList localeList = new LocaleList(locale);
LocaleList.setDefault(localeList);
configuration.setLocales(localeList);
configuration.setLocale(locale);
} else if (BuildUtils.isAtLeast17Api()){
configuration.setLocale(locale);
} else {
configuration.locale = locale;
}
res.updateConfiguration(configuration, res.getDisplayMetrics());
}
Run Code Online (Sandbox Code Playgroud)
这段代码非常适合我的游览活动(通过recreate()调用),但在所有下一个活动中,所有String资源都是错误的.屏幕旋转修复它.我该怎么办这个问题?我应该以不同方式更改Android N的区域设置,还是只是系统错误?
PS这是我发现的.首次启动MainActivity(在我的巡演之后)Locale.getDefault()是正确的,但资源是错误的.但在其他活动中,它给了我错误的Locale和来自此语言环境的错误资源.旋转屏幕(或可能是其他一些配置更改)Locale.getDefault()是正确的.
我想改变应用程序的语言,直到API 26才能正常工作.
对于api> 25我Locale.setDefault(Locale.Category.DISPLAY, mynewlanglocale);之前提出setContentView(R.layout.activity_main);但没有任何变化.
该文档不解释太多关于这一点.
我想让用户使用微调器(或任何方式)更改我的应用程序的语言.我尝试了很多方法,但他们改变了这个活动的语言而不是所有的活动,我想保存它,所以当用户重启应用程序时,他会找到最后选择的语言.
我们有一个Android应用程序,可用作远程PC程序的客户端.我们想添加一个功能,以便PC可以指示Android应用程序在运行时更改其语言环境,即启动应用程序; 把它与PC通信; 一段时间后,PC告诉应用程序切换到西班牙语或中文.
我们已经为各自的语言环境设置了所有布局和字符串资源.我们的应用程序是用户看到的唯一应用程序,因此如果设备的其余部分保留英语则无关紧要.
在Android中以编程方式在Change语言上有另一个线程,但它似乎没有得出结论.
我可以...
Locale locale = new Locale(sTheNewLocale);
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config,
getBaseContext().getResources().getDisplayMetrics());
Run Code Online (Sandbox Code Playgroud)
...在setContentView ()之前的onCreate()中,但是如果我想在屏幕启动并运行后更改语言环境,则无法提供帮助.有没有办法在Activity已经运行后重新加载内容视图?所以是没有改变的即时语言环境中可靠地或做我要告诉我的老板也不能只是在开始应用之前整个设备设置成新的语言环境进行任何实际的方法?
最新的链接app-compat是1.1.0。
将我的应用程序升级到最新版本后,app-compat我的语言设置停止了对API 24以下版本的电话的运行(肯定不能在API 21及以下版本上运行)。
对于API 24及更高版本,我使用ContextWrapper并设置了locale因此有效的方法。
我的问题是,如果androidx.appcompat:appcompat:1.1.0是稳定版本,为什么它对我有用,alpha并且beta版本不同于此处的其他版本以及我尝试过的问题。
1.1.0)我应该再次等待正式的稳定版本并降级到最后一个稳定版本,还是让Google知道是否有效的有效方式(当然,我知道要提交错误)?
我们的应用程序要求我们能够根据用户选择更改语言,而不仅仅是依赖设备区域设置。这意味着我们必须实现一种方法来在用户进行此选择时包装上下文并在每个 Activity 中注入指定的语言。
@Override
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(LocaleProvider.getAppLocale().wrapContextWithAppLanguage(newBase));
}
Run Code Online (Sandbox Code Playgroud)
fun wrapContextWithAppLanguage(context: Context): Context {
val userLocale: Locale = localeProvider.getCurrentStoreLanguage(context)
Locale.setDefault(userLocale)
return when {
Build.VERSION.SDK_INT >= Build.VERSION_CODES.N -> updateResourcesLocale(
context,
userLocale
)
else -> updateResourcesLocaleLegacy(context, userLocale)
}
}
@TargetApi(Build.VERSION_CODES.N)
private fun updateResourcesLocale(context: Context, locale: Locale): Context {
val configuration = context.resources.configuration
configuration.setLocale(locale)
return context.createConfigurationContext(configuration)
}
private fun updateResourcesLocaleLegacy(context: Context, locale: Locale): Context {
val resources = context.resources
val configuration = resources.configuration
configuration.setLocale(locale)
resources.updateConfiguration(configuration, resources.displayMetrics)
return context
}
Run Code Online (Sandbox Code Playgroud)
这在过去对我们很有效,但现在我们已经实施了暗模式,我们注意到在使用 appcompat …
android android-appcompat android-support-library android-night-mode
我有一些代码可以在 Java 中以编程方式更改语言环境。但是当我的应用程序迁移到 Kotlin 时,我无法再更改语言环境。
例如,Java 中的这段代码效果很好:
public static final void setAppLocale(String language, Activity activity) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
Resources resources = activity.getResources();
Configuration configuration = resources.getConfiguration();
configuration.setLocale(new Locale(language));
activity.getApplicationContext().createConfigurationContext(configuration);
} else {
Locale locale = new Locale(language);
Locale.setDefault(locale);
Configuration config = activity.getResources().getConfiguration();
config.locale = locale;
activity.getResources().updateConfiguration(config,
activity.getResources().getDisplayMetrics());
}
}
Run Code Online (Sandbox Code Playgroud)
我在 Kotlin 中尝试了很多代码,但没有一个对我有用。这是我最后一次尝试:
fun changeLanguage(context: Context, language : String) {
val locale = Locale(language)
Locale.setDefault(locale)
val config = context.resources.configuration
config.setLocale(locale)
context.createConfigurationContext(config)
context.resources.updateConfiguration(config, context.resources.displayMetrics)
}
Run Code Online (Sandbox Code Playgroud)
如何在 Kotlin 中更改应用程序的本地?用 Java …
android ×10
locale ×4
localization ×3
java ×2
default ×1
kotlin ×1
resources ×1
runtime ×1
user-defined ×1