纯血鸿蒙HarmonyOS NEXT开发之多语言国际化i18n(单复数)

sj-next-pc.jpeg

随着HarmonyOS NEXT公测时间的逼近,公司即将迎来对纯血鸿蒙的适配,在搭建基础框架时遇到了很多的问题,第一个就是资料太少,第二个是资料过时,以下是实战中沉淀的多语言国际化精华,实现起来不难,难的是不管文档还是网上的资料都不全。本文包含单复数以及多参数的解决方案。最基本的国际化resources相关的在此不做多余的阐述!

相关功能如下:

  1. 切换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')
}
  1. 获取当前语言
  /**
   *获取当前应用语言
   *
   * @returns当前应用语言
   */
  public getLanguage(): string {
    return i18n.System.getAppPreferredLanguage();
  }

示例

// 返回语言字符串zh-CN/en-US/...
let language = I18nManager.getInstance().getLanguage()
  1. 设置国际化文字
/*
 * 设置国际化文字
 * 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"])

  1. 国际化单复数
/*
 * 单复数
 * 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个只会使用单数

具体效果如下:

image.png

如对您有帮助,帮忙点个“赞 、关注” 让更多的人受益~!

技术交流群可加wx“LB-9191” 备注NEXT

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容