HarmonyOS 应用国际化和主题适配:ResUtil 综合运用实战指南

HarmonyOS 应用国际化和主题适配:ResUtil 综合运用实战指南 文章目录背景方法总览场景一多语言文本显示场景二暗色模式检测与适配场景三根据屏幕密度选择图片质量场景四动态读取图片资源用于分享场景五获取原始资源文件ResUtil 使用小结写在最后背景近期发现一款很有意思的HarmonyOS 三方库, 地址 pura/harmony-utils(V1.4.0) , 作者是桃花镇童长老, 我这里也是直接通过该作者公布的源码进行案例编写进行,写了到目前写了一部分demo ,感觉确实很有帮助,这里呢也是开始写一个系列的演示demo 供大家参考。如有帮助可以在OpenHarmony中进行下载安装进行使用哦案例demo导航展示↓↓↓↓↓↓接下来言归正传 ↓↓↓↓前面讲了ResUtil各个方法的用法这篇来讲几个完整的业务场景把资源读取的知识串起来。方法总览场景一多语言文本显示应用多语言支持的核心是把文本放到资源文件里代码里通过ResUtil读取资源文件结构resources/ ├── base/ │ └── element/ │ └── string.json # 默认语言通常是中文 ├── zh_CN/ │ └── element/ │ └── string.json # 简体中文可覆盖 base └── en_US/ └── element/ └── string.json # 英文string.json示例{string:[{name:app_name,value:HoUtils},{name:welcome,value:欢迎使用}]}读取方式// Demo 中展示的资源读取方式this.Btn(getStringSync($r(app.string.app_name)),#27AE60,(){this.tryLog(getStringSync($r(app.string.app_name)),()ResUtil.getStringSync($r(app.string.app_name)));})this.Btn(getStringByNameSync(resName),#1E8449,(){this.tryLog(getStringByNameSync(${this.resName}),()ResUtil.getStringByNameSync(this.resName));})在组件里使用import{ResUtil}from../Utils/ResUtil;EntryComponentstruct WelcomePage{build(){Column(){// 方式1用 $r编译期检查Text($r(app.string.welcome)).fontSize(18)// 方式2用 ResUtil 运行时读取适合需要逻辑处理的场景Text(ResUtil.getStringSync($r(app.string.app_name))).fontSize(14).fontColor(#666)}}}检测当前语言this.Btn(getConfigurationSync() 获取设备配置,#16A085,(){this.tryLog(getConfigurationSync(),(){constcfgResUtil.getConfigurationSync();returnlocale${cfg.locale}direction${cfg.direction}colorMode${cfg.colorMode};});})constcfgResUtil.getConfigurationSync();constisChineseLocalecfg.locale.startsWith(zh);constisRTLcfg.direction1;// 从右到左阿拉伯语等场景二暗色模式检测与适配this.Btn(getConfigurationSync() 获取设备配置,#16A085,(){this.tryLog(getConfigurationSync(),(){constcfgResUtil.getConfigurationSync();returnlocale${cfg.locale}direction${cfg.direction}colorMode${cfg.colorMode};});})colorMode字段0 浅色1 深色。实现动态主题import{ResUtil}from../Utils/ResUtil;// 主题颜色工具functiongetThemeColors(){constisDarkResUtil.getConfigurationSync().colorMode1;return{background:isDark?#1A1A2E:#FFFFFF,text:isDark?#E0E0E0:#333333,card:isDark?#16213E:#F8F9FA,border:isDark?#2A2A4A:#E0E0E0};}EntryComponentstruct MainPage{StateisDark:booleanResUtil.getConfigurationSync().colorMode1;build(){Column(){Text(主页内容).fontColor(this.isDark?#E0E0E0:#333333)}.backgroundColor(this.isDark?#1A1A2E:#FFFFFF)}}场景三根据屏幕密度选择图片质量不同屏幕密度的设备显示不同质量的图片可以平衡清晰度和性能this.Btn(getDeviceCapabilitySync() 获取设备能力,#1ABC9C,(){this.tryLog(getDeviceCapabilitySync(),(){constcapResUtil.getDeviceCapabilitySync();returnscreenDensity${cap.screenDensity}deviceType${cap.deviceType};});})import{ResUtil}from../Utils/ResUtil;functiongetImageQuality():string{constcapResUtil.getDeviceCapabilitySync();if(cap.screenDensity4){// 高密度屏幕XLDPI 320dpi加载高清图returnhigh;}elseif(cap.screenDensity2){// 中等密度屏幕returnmedium;}else{// 低密度屏幕加载低清图节省流量returnlow;}}场景四动态读取图片资源用于分享把应用的图标/图片转成 Base64 用于分享或上传this.Btn(getMediaContentBase64Sync($r(app.media.startIcon)),#9B59B6,(){this.tryLog(getMediaContentBase64Sync($r(app.media.startIcon)),(){constb64ResUtil.getMediaContentBase64Sync($r(app.media.startIcon));return${b64.substring(0,40)}... (length${b64.length});});})// 获取应用图标的 Base64嵌入分享内容consticonBase64ResUtil.getMediaContentBase64Sync($r(app.media.startIcon));// iconBase64 格式data:image/png;base64,xxxxx// 可以直接放 Image 组件的 src或传给需要 Base64 图片的接口场景五获取原始资源文件rawfile目录适合存放 JSON 配置、音频等原始文件// 检查路径是否为目录this.Btn(isRawDir() 根路径,#E67E22,(){this.tryLog(isRawDir(),()ResUtil.isRawDir().toString());})// 在代码里判断 rawfile 路径constisDirResUtil.isRawDir(config);// 检查 rawfile/config 是否为目录if(isDir){// 读取目录下的文件列表}ResUtil 使用小结从 Demo 里可以看出资源读取有几个规律有$r引用和资源名两种方式$r在编译期检查类型安全资源名是字符串动态灵活有同步和异步两种同步简单直接适合初始化异步不阻塞 UI适合运行时按需加载颜色返回数字需要用.toString(16)转十六进制才好看媒体有 Base64 和字节两种格式根据后续用途选择写在最后ResUtil是 HarmonyOS 应用资源规范化管理的核心工具。把颜色、文字、图片都放资源文件里然后通过ResUtil读取这是做好多语言、暗色模式适配的必要前提。