Android 14 之 国际化

994 阅读3分钟

1.可针对单个APP设置语言

针对单个 app 语言设置, android 14 更新了以下特性:

  1. 自动生成APP的localeConfig
  2. 可以LocaleManager # setOverrideLocaleConfig()动态更新localeConfig
  3. 输入法(IME) 可以根据getApplicationLocales()进行动态适配
标题是否支持多语言配置方式
Android 13以前跟随系统语言设置,如果不支持setting里面的语言,则展示默认
Android 13AndroidManifest.xml中配置一个android:localeConfig(静态配置)
Android 14AndroidManifest.xml中配置 &&动态更新

在 Android 13中,App需要设置某些语言为默认,需要在res下配置 locales_config.xml文件,并且在应用的Manifest里进行指向。

<?xml version="1.0" encoding="utf-8"?>
<locale-config xmlns:android="http://schemas.android.com/apk/res/android">
   <locale android:name="en"/>
   <locale android:name="en-GB"/>
   <locale android:name="fr"/>
   <locale android:name="ja"/>
   <locale android:name="zh-Hans-MO"/>
   <locale android:name="zh-Hant-MO"/>

<manifest>
    ...
    <application
        ...
        android:localeConfig="@xml/locales_config">
    </application>
</manifest>

image.png

可以看出,app要适配的语言需要提前在xml里写死,如果想适配所有语音,需要提前把所有的语言类型都写入locales_config 文件,这显得很笨重。

同样这里也提供了Android 14 动态设置语言的方法:

galleryBtn.setOnClickListener {
     //获取LocaleManager
    val localeManager = getSystemService( LocaleManager:: class .java)
    //创建LocaleConfig
 val localeConfig = LocaleConfig(LocaleList(Locale.CHINA, Locale.ITALY))
    localeManager?.overrideLocaleConfig = localeConfig
}

2.新增性别语法变形 API

新增Grammatical Inflection API 使用语法对于不同性别的用户添加语言支持。

要用法语提供类似的短语,有几个选项:

  • 男性表达形式:“Vous êtes abonné à...”(英语:“您已订阅...”)
  • 女性表达形式:“Vous êtes abonnée à ...”(英语:“你订阅了...”)
  • 中性措辞表达:“Abonnement à...activé”(英语:“订阅...启用”)

为了区分因为表达失误而产生用户对性别歧视的误解,Android 14引入了特定的参数,需要将针对不同性别的的res文字等放入对应的资源文件夹。

标题关键字资源文件
女性feminineres/values-fr-feminine/strings.xml
男性masculineres/values-fr-masculine/strings.xml
中性neuterres/values-fr-neuter/strings.xml

怎么针对性别来使用对应的res资源呢?

GrammaticalInflectionManagergetApplicationGrammaticalGender``()获取当前语法性别
setRequestedApplicationGrammaticalGender``()设置APP调用调用性别

只需要在应用启动时去调用GrammaticalInflectionManager设置对应的性别,就可以展示资源啦!

masculineBtn.setOnClickListener {
  grammaticalInflectionManager.setRequestedApplicationGrammaticalGender(Configuration.GRAMMATICAL_GENDER_MASCULINE)
  Toast.makeText(this, "masculineBtn   " +grammaticalInflectionManager.applicationGrammaticalGender, Toast.LENGTH_SHORT).show()
   textGender.setText(R.string.test_string)
   Toast.makeText(this, "masculineBtn   " +textGender.text, Toast.LENGTH_SHORT).show()

   }

性需要在com.android.library.gradle.plugin 版本8.1.X开始生效

测试条件需要选择与资源文件夹对应的系统语言

3.Regional preferences(地区首选项更改)

Android 14中,当用户更改其区域首选项选择时, APP 可以收到通知并且在应用中做出更改

上一个Feature主要是讲了针对性别来进行设置,Regional Preferences主要是针对不同的地区

区域首选项使用户能够个性化温度单位、一周的第一天和编号系统。例如:居住在美国的欧洲人可能更喜欢以摄氏度而不是华氏度为单位的温度单位,并且希望应用程序将星期一视为一周的开始,而不是美国默认的星期日。

 //需要注意的androidx.core:core-ktx需要达到一定的版本,才会有Android14的最新Feature
 implementation 'androidx.core:core-ktx:1.12.0-alpha01'
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    notificationManager1= getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
    btn = findViewById(R.id.btn1)
    textTemp=findViewById(R.id.text_temp)
    textDate=findViewById(R.id.text_date)

    textTemp.text= "Current Templature: ${when (lp.getTemperatureUnit()) {
       LocalePreferences.TemperatureUnit.CELSIUS -> "20 ℃"
       LocalePreferences.TemperatureUnit.FAHRENHEIT -> "68 ℉"
       else -> {
           ""
       }
   }}"
    textDate.text="First day of week:  ${
        lp.getFirstDayOfWeek().uppercase()
    }\n"+
    "Calendar Type:   ${
        lp.getCalendarType().uppercase()
    }"