资源匹配

应用使用某资源时,系统会根据当前设备状态优先从相匹配的限定词目录中寻找该资源。只有当resources目录中没有与设备状态匹配的限定词目录,或者在限定词目录中找不到该资源时,才会去base目录中查找。rawfile和resfile是原始文件目录,不会根据设备状态去匹配资源。

限定词目录与设备状态的匹配规则

  • 在为设备匹配对应的资源文件时,限定词目录匹配的优先级从高到低依次为:移动国家码和移动网络码 > 区域(可选组合:语言、语言_文字、语言_国家或地区、语言_文字_国家或地区)> 横竖屏 > 设备类型 > 颜色模式 > 屏幕密度。

  • 如果限定词目录中包含移动国家码和移动网络码、语言、文字、横竖屏、设备类型、颜色模式限定词,则对应限定词的取值必须与当前的设备状态完全一致,该目录才能够参与设备的资源匹配。例如,限定词目录zh_CN-car-ldpi不能参与en_US设备的资源匹配。

  • 如果存在多个屏幕密度限定词目录,则优先向上匹配最接近的屏幕密度限定词目录,否则向下匹配最为接近的屏幕密度限定词目录。例如,假设存在限定词目录xldpi和xxldpi,设备屏幕密度为xxldpi,则会匹配xxldpi限定词目录。

获取指定配置的资源

基本概念

开发者可以在工程的resources目录下添加限定词目录,满足多语言、深浅色模式等不同类型的系统设置。然而,在获取资源时,由于限定词目录匹配规则,只能筛选出最匹配的资源,无法获取其它目录资源。

应用如果有获取指定配置的资源的诉求,可以通过以下方法进行获取。

接口说明
接口名 描述
getOverrideResourceManager(configuration?: Configuration) : ResourceManager 获取可以加载指定配置的资源的资源管理对象,使用同步方式返回。
getOverrideConfiguration() : Configuration 获取指定的配置,使用同步方式返回。
updateOverrideConfiguration(configuration: Configuration) : void 更新指定的配置。

以获取非当前系统语言的资源为例,说明如何获取指定配置的资源。假设工程中定义了中文、英文、德文的同名资源如下:

  • entry/src/main/resources/zh_CN/element/string.json

{
  "string": [
    {
      "name": "greetings",
      "value": "你好,世界"
    }
  ]
}
  • entry/src/main/resources/en_US/element/string.json
{
  "string": [
    {
      "name": "greetings",
      "value": "Hello, world"
    }
  ]
}

  • entry/src/main/resources/de_DE/element/string.json

{
  "string": [
    {
      "name": "greetings",
      "value": "Hallo, Welt"
    }
  ]
}

在Index.ets中,分别获取三种语言的资源并显示在文本框中,运行设备当前系统语言为中文,entry/src/main/ets/pages/Index.ets的代码如下:


@Entry
@Component
struct Index {
  @State englishString: string = ""
  @State germanString: string = ""


  getString(): string {
    let resMgr = getContext().resourceManager
    let resId = $r('app.string.greetings').id


    //获取符合当前系统语言地区、颜色模式、分辨率等配置的资源
    let currentLanguageString = resMgr.getStringSync(resId)


    //获取符合当前系统颜色模式、分辨率等配置的英文资源
    let overrideConfig = resMgr.getOverrideConfiguration()
    overrideConfig.locale = "en_US" //指定资源的语言为英语,地区为美国
    let overrideResMgr = resMgr.getOverrideResourceManager(overrideConfig)
    this.englishString = overrideResMgr.getStringSync(resId)


    //获取符合当前系统颜色模式、分辨率等配置的德文资源
    overrideConfig.locale = "de_DE" //指定资源的语言为德语,地区为德国
    overrideResMgr.updateOverrideConfiguration(overrideConfig) //等效于resMgr.updateOverrideConfiguration(overrideConfig)
    this.germanString = overrideResMgr.getStringSync(resId)


    return currentLanguageString
  }


  build() {
    Row() {
      Column() {
        Text(this.getString())
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
        Text(this.englishString)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
        Text(this.germanString)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
      }
      .width('100%')
    }
    .height('100%')
  }
}
Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐