随着HarmonyOS NEXT公测时间的逼近,公司即将迎来对纯血鸿蒙的适配,在搭建基础框架时遇到了很多的问题,第一个就是资料太少,第二个是资料过时,以下是实战中沉淀的多语言国际化精华,实现起来不难,难的是不管文档还是网上的资料都不全。本文包含单复数以及多参数的解决方案。最基本的国际化resources相关的在此不做多余的阐述!
相关功能如下:
- 切换App语言
/**
*切换语言
*
* @param language语言类型
*/
public setLanguage(language: string): void {
i18n.System.setAppPreferredLanguage(language);
}
示例
let language = I18nManager.getInstance().getLanguage()
if (language == 'en-US') {
// 切换成中文
I18nManager.getInstance().setLanguage('zh-CN')
} else {
// 切换成英文
I18nManager.getInstance().setLanguage('en-US')
}
- 获取当前语言
/**
*获取当前应用语言
*
* @returns当前应用语言
*/
public getLanguage(): string {
return i18n.System.getAppPreferredLanguage();
}
示例
// 返回语言字符串zh-CN/en-US/...
let language = I18nManager.getInstance().getLanguage()
- 设置国际化文字
/*
* 设置国际化文字
* key 国际化key
* values 国际化需要替换的参数,value 参数统一用%s
* */
export function tr(key: string, values?: string[]): Resource {
let key_one = `app.string.${key}`;
return $r(key_one, ...(values ?? []));
}
示例
// 无参数的key
tr('language')
// 有参数的key 如"this is %s"
// 多参数时使用多个%s 按顺序放在数组里面即可
tr('language', ["apple"])
- 国际化单复数
/*
* 单复数
* key 单复数key
* nums 单复数数字 一行如果多个单复数需要拆分多个 key value用%d
* */
export function trPlural(key: string, nums: number[]): Resource {
let key_one = `app.plural.${key}`
let resource = $r(key_one, nums[0], ...nums);
return resource;
}
json资源示例
单参数
{
"plural": [
{
"name": "eat_apple",
"value": [
{
"quantity": "one",
"value": "%d apple"
},
{
"quantity": "other",
"value": "%d apples"
}
]
}
]
}
多单参数
{
"plural": [
{
"name": "eat_apple",
"value": [
{
"quantity": "one",
"value": "%d apple %d xxxxs"
},
{
"quantity": "other",
"value": "%d apples %d xxxxs"
}
]
}
]
}
使用示例
// 单参数
trPlural('eat_apple', [2])
// 多参数
trPlural('eat_apple', [2, 3])
注意
同一字符串中如有多个需要根据单复数展示的,需要拆分字符串,目前单复数置灰根据第一个参数来确定是否使用复数;通俗易懂的例子:如 2筐梨子一共4个会使用复数.1筐梨子一共4个只会使用单数
具体效果如下:
如对您有帮助,帮忙点个“赞 、关注” 让更多的人受益~!
技术交流群可加wx“LB-9191” 备注NEXT