Android应用出海必备技能 —— 多语言适配

引言:自杀式重生,他杀式淘汰。走别人的路,不是让别人无路可走,而是规避自己开辟一条新道路的风险。

软银集团创始人孙正义说过,在成熟的市场发生过的事情,在落后市场发生的概率就会增加。那么,创业这件事就是如此,如果国内市场饱和了,那么就换个地方。同样的模式,降维打击。你赚钱最稳的方式,就是把一个已经发生过的市场的业务,转移到还没有发生过的。因为坑都已经踩过了,所以相比做开创性的创新业务来说,风险更小。

那么就进入今天的主题,Android应用如何做多语言的适配?

Android多语言适配

切换语言

一行最关键的代码就是

java 复制代码
AppCompatDelegate.setApplicationLocales(LocaleListCompat.forLanguageTags("en"));

添加values文件夹

在多个国家的values文件中适配strings.xml,默认的values文件夹中字符串key的内容,尽量适配到所有本地化配置文件夹。如以下除了values-night是适配暗色模式的外,其他都要适配。

跟着系统语言设置联动

一行代码虽然能切换语言,但是在应用进程被杀掉重启应用后又会恢复到默认语言,为了保存状态还需要配置一下AndroidManifest.xml。那么,我们在application标签里面加入以下service。

xml 复制代码
<service 
    android:name="androidx.appcompat.app.AppLocalesMetadataHolderService" 
    android:enabled="true" 
    android:exported="true">
    <meta-data 
        android:name="autoStoreLocales" 
        android:value="true"/> 
</service>

注意事项

那么重点来了,如何完美实现应用内语言的实时更新呢?

java 复制代码
Intent intent = new Intent(context.getApplicationContext(), MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
context.startActivity(intent);

这样可不可以?可以,但是不建议,有bug,具体自己去实验 。如果到就写完了,我就不会写这篇文章了。既然你都看到这了,那么我不妨推荐一下我的框架,里面有对多语言的支持。里面有个github.com/dora4/dora/... ,可以实现世界各国语言的切换。你可以使用updateLang方法,我还是建议你使用包装的系统api,使用updateSysLang这个方法。虽然有些语言的映射需要做一些小的修改,把下划线修改为横线,但是使用系统的方案可能会更加稳定一点。

kotlin 复制代码
val lang = LanguageUtils.getLangTag(this)
if (lang.equals(LanguageUtils.LANG_ZH_CN)) {
    AppCompatDelegate.setApplicationLocales(LocaleListCompat.forLanguageTags("zh"))
} else if (lang.equals(LanguageUtils.LANG_ZH_TW)) {
    AppCompatDelegate.setApplicationLocales(LocaleListCompat.forLanguageTags("zh-TW"))
} else {
    AppCompatDelegate.setApplicationLocales(LocaleListCompat.forLanguageTags(lang))
}

以上的代码写在哪里呢?既然前文提到了,不建议使用重启activity的方式,那么建议使用的方式为,使用eventbus等消息框架发送消息通知语言设置页面上一个页面调用以上代码刷新界面,因为finish不会触发上个界面的生命周期。或者你也可以使用startActivityForResult和onActivityResult那一套。其他界面会在打开时重新创建并获取默认语言显示。

Dora SDK对多语言支持的源码

我们最后看一下Dora SDK的源代码。

dora.BaseActivity

java 复制代码
@Override
protected void attachBaseContext(Context newBase) {
    super.attachBaseContext(LanguageUtils.attachBaseContext(newBase));
}

dora.BaseApplication

java 复制代码
@Override
protected void attachBaseContext(Context base) {
    super.attachBaseContext(LanguageUtils.attachBaseContext(base));
    if (mAppDelegate == null) {
        mAppDelegate = new AppDelegate(base);
    }
    mAppDelegate.attachBaseContext(base);
}

如果你使用dora框架的话,会在继承Base类的情况下,自动帮你更新本地化配置。如果你使用系统的更新语言的方式,以上代码不会起作用,也不会影响业务逻辑。

相关推荐
恋猫de小郭8 小时前
Dart 4.0 要彻底移除 dart:mirrors,Augmentations 应该要来了
android·前端·flutter
Carson带你学Android9 小时前
Gemini 4 Argon 发布:对 Android 开发者意味着什么?
android·ai编程
事圆则缓10 小时前
Kotlin Flow、StateFlow、SharedFlow 全解析:冷流、热流与 Android 状态管理
android·kotlin·php
应用市场10 小时前
把旧 Pixel 变成相册备份中转站(上):Mac 到安卓的照片传输工具设计——流式上传、sha256 校验、adb forward 与 Bonjour
android·macos·adb·kotlin·swift
墨天梦10 小时前
B08_Fragment事务通信与双生命周期
android
Kapaseker11 小时前
Android 以后可能不会再有横竖屏适配了
android·kotlin
墨天梦11 小时前
B13_通知图片相机与影音
android·数码相机·kotlin
事圆则缓11 小时前
Android 一次性事件怎么设计:Channel、SharedFlow 还是 UI State?
android·ui
Android系统攻城狮1 天前
Linux Gstreamer深度解析之gst_audio_encoder_set_frame_max调用流程与实战(六十一)
android·linux·运维·音视频·gstreamer音视频·音视频进阶·gstreamer音视频进阶
传奇开心果编程1 天前
【Compose Multiplatform 跨端开发学与练】第7课 平台适配与互操作
android·windows·学习·ui·ios·kotlin·composer