HarmonyOS鸿蒙Next中如何定位单独设置APP偏好语言失败的问题

HarmonyOS鸿蒙Next中如何定位单独设置APP偏好语言失败的问题

【问题现象】

单独设置APP偏好语言失败,APP语言必须和系统语言保持一致。

1. 预期效果

应用可以根据用户的选择,自行变换应用内的语言。

2. 实际效果

应用内语言只能与系统的偏好语言保持一致。

点击放大

问题代码如下:

import I18n from '[@ohos](/user/ohos).i18n';
import { BusinessError } from '@kit.BasicServicesKit';

try {
  I18n.System.setAppPreferredLanguage('en-Latn-US'); // 设置应用当前的偏好语言为 "US"
} catch(error) {
  let err: BusinessError = error as BusinessError;
  console.error(`call System.setAppPreferredLanguage failed, error code: ${err.code}, message: ${err.message}.`);
}

@Component
@Entry
struct Index {

  build() {
    Column() {
      Text($r('app.string.module_desc'));
    }
  }
}

【背景知识】

【定位思路】

由于未找到能直接改变语言的接口,因此还是得通过setAppPreferredLanguage接口实现。主要实现思路有以下三步:

  1. setAppPreferredLanguage接口需要从资源文件中获取语言信息,资源文件中需要提前声明准备提供给用户的不同语言;
  2. 在用户界面提供可选语言的下拉框或按钮等交互组件,让用户进行自主选择;
  3. 记录用户的选择,并设置进偏好语言中。

【解决方案】

根据上述思路,下文中将以“通过点击按钮,自主切换中英文”进行说明:

1. 在资源文件中添加中/英文的value值

默认语言(base文件)以及中文语言(zh_CN文件)写的是中文,英文语言(en_US文件)写的是英文。因此在偏好语言为英文时,显示en_US文件的内容;偏好语言为中文时,显示zh_CN文件的内容;偏好语言为其他语言时,显示base文件的内容。

代码示例如下:

// base
{
  "string": [
    {
      "name": "module_desc",
      "value": "模块描述"
    },
    {
      "name": "language_button",
      "value": "改变语言"
    }
  ]
}

// zh_CN
{
  "string": [
    {
      "name": "module_desc",
      "value": "模块描述"
    },
    {
      "name": "language_button",
      "value": "改变语言"
    }
  ]
}

// en_US
{
  "string": [
    {
      "name": "module_desc",
      "value": "module description"
    },
    {
      "name": "language_button",
      "value": "Change Language"
    }
  ]
}

2. 点击按钮切换语言

  • 进入页面后,显示的语言将跟随系统偏好语言进行设置。
  • 设置语言状态status,当系统偏好语言为中文时,status设置为-1,英文时,status设置为1。
  • 因为本例子中仅有中英两种语言,所以点击按钮后status将切换状态。

代码示例如下:

import I18n from '[@ohos](/user/ohos).i18n';
@Component
@Entry
struct Index {
  // 获取当前系统语言。如果为中文,则设置status为-1;如果为英文,则设置status为1
  status: number = I18n.System.getSystemLanguage() === "zh-Hans" ? -1 : 1;

  build() {
    Column() {
      // 获取应用偏好语言
      Text($r('app.string.module_desc'));
      Button($r('app.string.language_button')).onClick(() => {
        if (this.status === 1) {
          I18n.System.setAppPreferredLanguage('zh-Hans');
        } else {
          I18n.System.setAppPreferredLanguage('en-Latn-US');
        }
        this.status = -this.status;
      })
    }
  }
}

效果:

点击按钮前:

点击放大

点击按钮后:

点击放大

即可实现当系统语言是中文时,用户仍然可以根据自己的喜好进行应用内的语言切换:

点击放大

【总结】

无论是在APP内单独切换语言设置,还是跟随系统语言切换,多语言都需要通过两个步骤:

  1. 定义资源文件
  2. 引用资源文件

另附跟随系统切换语言相关指南


更多关于HarmonyOS鸿蒙Next中如何定位单独设置APP偏好语言失败的问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于HarmonyOS鸿蒙Next中如何定位单独设置APP偏好语言失败的问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


问题定位步骤

  1. 检查资源文件:确保在basezh_CNen_US等资源文件中正确定义了多语言内容,且语言标识符与setAppPreferredLanguage中使用的标识符一致。

  2. 验证setAppPreferredLanguage调用:确保调用I18n.System.setAppPreferredLanguage时传入的语言标识符正确,如'en-Latn-US''zh-Hans'

  3. 检查语言切换逻辑:确保在点击按钮时,status状态正确切换,并根据状态调用setAppPreferredLanguage设置相应语言。

  4. 调试日志:在catch块中打印错误日志,检查是否有错误码或错误信息,帮助定位问题。

  5. 系统语言影响:确认系统语言设置是否影响应用语言切换,确保应用语言切换逻辑不受系统语言限制。

通过以上步骤,可以定位并解决单独设置APP偏好语言失败的问题。

回到顶部