HarmonyOS 鸿蒙Next中取消授权后弹窗是否可以根据系统语言,为什么默认为英文

HarmonyOS 鸿蒙Next中取消授权后弹窗是否可以根据系统语言,为什么默认为英文 cke_537.png

点登录到授权,然后选择取消,会有这个提示,这个提示语应该是华为给的,这个为什么是英文,是不是跟着哪边设置来的


更多关于HarmonyOS 鸿蒙Next中取消授权后弹窗是否可以根据系统语言,为什么默认为英文的实战教程也可以访问 https://www.itying.com/category-93-b0.html

11 回复

你好,对于一键登录,错误处理时, 不直接使用 error.message 做 toast, 而是根据返回码,映射对应中文再做提示。error.message 给的是英文错误信息。参考错误码

cke_14609.png

import { authentication } from '@kit.AccountKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { util } from '@kit.ArkTS';
import { BusinessError } from '@kit.BasicServicesKit';

// 创建登录请求,并设置参数
const loginRequest = new authentication.HuaweiIDProvider().createLoginWithHuaweiIDRequest();
// 默认值为true,若账号未登录则强制拉起账号登录页
loginRequest.forceLogin = true;
loginRequest.idTokenSignAlgorithm = authentication.IdTokenSignAlgorithm.PS256;
loginRequest.state = util.generateRandomUUID(); // 建议使用generateRandomUUID生成state,可用于一致性比对,防止跨站攻击

// 执行登录请求,并处理结果
try {
  // 此示例为代码片段,实际需在自定义组件实例中使用,并传入有效的Context上下文对象
  const controller = new authentication.AuthenticationController(this.getUIContext().getHostContext());
  controller.executeRequest(loginRequest, (error: BusinessError<Object>, data) => {
    if (error) {
      dealAllError(error);
      return;
    }
    const loginWithHuaweiIDResponse = data as authentication.LoginWithHuaweiIDResponse;
    const state = loginWithHuaweiIDResponse.state;
    if (state && loginRequest.state !== state) {
      // state不一致,可能为跨站攻击,需重新登录
      hilog.error(0x0000, 'testTag', `Failed to login. The state is different, response state: ${state}`);
      return;
    }
    hilog.info(0x0000, 'testTag', 'Succeeded in login.');
    const loginWithHuaweiIDCredential = loginWithHuaweiIDResponse?.data;
    const code = loginWithHuaweiIDCredential?.authorizationCode;
    const idToken = loginWithHuaweiIDCredential?.idToken;
    // 开发者处理code, idToken
  });
} catch (error) {
  dealAllError(error);
}

// 错误处理, 不直接使用 error.message 做toast, 而是根据返回码,映射对应中文提示
function dealAllError(error: BusinessError<Object>): void {
  hilog.error(0x0000, 'testTag', `Failed to login. Code: ${error.code}, message: ${error.message}`);
  // 在应用登录涉及UI交互场景下,建议按照如下错误码指导提示用户
  if (error.code === ErrorCode.ERROR_CODE_LOGIN_OUT) {
    // 用户未登录华为账号,请登录华为账号并重试或者尝试使用其他方式登录
  } else if (error.code === ErrorCode.ERROR_CODE_NETWORK_ERROR) {
    // 网络异常,请检查当前网络状态并重试或者尝试使用其他方式登录
  } else if (error.code === ErrorCode.ERROR_CODE_INTERNAL_ERROR) {
    // 登录失败,请尝试使用其他方式登录
  } else if (error.code === ErrorCode.ERROR_CODE_USER_CANCEL) {
    // 用户取消授权
  } else if (error.code === ErrorCode.ERROR_CODE_SYSTEM_SERVICE) {
    // 系统服务异常,请稍后重试或者尝试使用其他方式登录
  } else if (error.code === ErrorCode.ERROR_CODE_REQUEST_REFUSE) {
    // 重复请求,应用无需处理
  } else {
    // 应用登录失败,请尝试使用其他方式登录
  }
}

export enum ErrorCode {
  // 账号未登录
  ERROR_CODE_LOGIN_OUT = 1001502001,
  // 网络错误
  ERROR_CODE_NETWORK_ERROR = 1001502005,
  // 内部错误
  ERROR_CODE_INTERNAL_ERROR = 1001502009,
  // 用户取消授权
  ERROR_CODE_USER_CANCEL = 1001502012,
  // 系统服务异常
  ERROR_CODE_SYSTEM_SERVICE = 12300001,
  // 重复请求
  ERROR_CODE_REQUEST_REFUSE = 1001500002
}

更多关于HarmonyOS 鸿蒙Next中取消授权后弹窗是否可以根据系统语言,为什么默认为英文的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


开发者你好,这个如果是你自己开发的应用,可以在代码中进行修改,可以参考华为账号一键登录开发文档(包含可能存在的异常场景及处理方法):

华为账号一键登录开发文档

这是你开发的App,还是你下载的别人的App?哪个结果都不是华为的锅。
如果是你开发的,可以修改。华为Account Kit在用户取消授权会返回错误码,App处理下就行。

if (businessError.code === 1001502012 || businessError.code === 1002500005) {
    // 用户取消,无需特殊处理,友好提示下就行
  } else {
    // 处理其他错误
  }

如果是别人的App,他们没做多语言适配的话,也改不了。

这个提示:

The user canceled the authorization.

确实大概率是:

华为账号登录 SDK / 系统账号服务
返回的默认文案

不是你自己 App 写的 toast。

你现在这个场景本质上是:

  • 点击“华为账号登录”
  • 拉起系统授权页
  • 用户点“取消”
  • HMS Account Kit 返回错误
  • SDK 自动弹 toast

———————— 这个语言通常会跟:

系统语言(System Language)

走。

不是跟:

  • App语言
  • DevEco语言
  • AGC配置

走。

———————— 但为什么你是英文?

一般有几种常见情况。

1、手机系统语言是英文

最常见。

即使:

应用界面是中文

系统 HMS Core 组件可能还是英文。

因为:

这个 toast 是系统服务弹的
不是应用层弹的

————————

2、HMS Core / Account Kit 没拿到中文资源

这个在:

  • 海外版 HMS Core
  • 测试版系统
  • NEXT Beta
  • DevBeta ROM

里比较常见。

有时候:

SDK fallback 到英文默认文案

即使系统是中文。

————————

3、你使用的是 SDK 默认错误处理

很多账号登录 DEMO 里:

SDK 内部会直接:

toast(error.message)

而 HMS 返回的:

message

本身就是英文。

比如:

The user canceled the authorization.

———————— 实际上:

你最好不要直接展示 SDK message。

正常做法应该是:

自己拦截错误码。

例如:

.catch((err) => {
  if (err.code === 2002) {
    promptAction.showToast({
      message: '用户取消授权'
    })
  }
})

而不是:

promptAction.showToast({
  message: err.message
})

———————— 因为 HMS / 华为账号 SDK:

很多错误信息:

默认就是英文

这是 HMS Core 的历史问题。

Android HMS 上也长期存在。

———————— 建议:

最佳实践

不要依赖:

SDK 返回 message

而是:

根据 errorCode 自己做多语言

例如:

switch(code) {
  case 2002:
    return $r('app.string.auth_cancel')
}

这样:

  • 中文系统 → 中文
  • 英文系统 → 英文
  • 日文系统 → 日文

都能统一控制。

———————— 简单总结:

  • 这个提示通常是 HMS/华为账号服务返回的
  • 默认语言一般跟系统语言走
  • HMS 某些错误 message 本身只有英文
  • 不建议直接显示 SDK message
  • 建议根据 errorCode 自己做国际化提示
  • “用户取消授权”属于典型需要自己接管的场景

找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:https://www.bilibili.com/video/BV1S4411E7LY/?p=17,

首先你点 “登录 / 授权”→ 拉起华为账号授权页(系统级);你点 “取消”→ 弹出的英文提示是华为账号服务(HMS Core/Account Kit)的系统弹窗,文字由华为服务端 / 系统资源包提供,不归 App 字符串管的

一般来说,优先跟「系统语言」

设置 → 系统和更新 → 语言和输入法 → 语言和地区 → 首选语言(简体中文置顶)。

其次看「华为账号地区」

设置 → 华为账号 → 个人信息 → 国家 / 地区(要设为中国)。

不支持的语言 → 强制 fallback 到英文

比如:系统语言是 “繁体中文(台湾)” 但账号地区是美国;或系统语言是小语种,华为账号服务没做该语言包 → 直接显示英文华为。

模拟器 / 开发板常见:默认英文

模拟器镜像默认语言常为英文,账号地区也非中国,所以必出英文弹窗

华为的授权界面语言不是你的 App 控制的,而是跟随系统/华为服务语言设置

给你提供个检查思路吧

  1. 检查系统语言

进入手机 设置 → 系统和更新 → 语言和输入法, 如果系统语言是中文,但授权界面还是英文检查华为账号服务语言,那就检查一下华为账号有自己的语言设置,优先级比系统语言还高!

操作步骤:

  1. 打开 华为账号设置
  • 设置 → 华为账号 → 个人信息
  • 或者打开"我的华为" App → 账号中心
  1. 找到 语言设置(如果有)
  2. 确认语言是 简体中文

最后一步检查 App 本地化配置, 虽然华为授权界面不受 App 控制,但检查一下总没坏处

// AppScope/app.json5 路径

{
  "app": {
    "bundleName": "com.example.myapp",
    "vendor": "example",
    "versionCode": 1000000,
    "versionName": "1.0.0",
    "icon": "$media:app_icon",
    "label": "$string:app_name",
    "targetDeviceInfo": {
      "targetDeviceType": ["phone"]
    },
    // ✅ 声明支持的语言
    "language": ["zh", "en"]
  }
}

但是你要明白一点 这个配置只影响你的 App 内的 UI 文字,不影响华为授权界面。
我能想到的只有这三个地方 你检查一下再看看呢

系统默认进行设定的,

你可以在应用内处理。

在 HarmonyOS 鸿蒙 Next 中,取消授权后的弹窗(如权限二次确认弹窗)默认显示英文,且目前不跟随系统语言自动切换。这是因为该弹窗的文本字符串硬编码为英文,系统尚未提供多语言资源文件或国际化适配接口,导致无法根据系统语言动态变化。

该授权取消弹窗是华为帐号服务(Account Kit)提供的系统界面,其显示语言默认跟随设备的系统语言与地区设置。当手机语言设为简体中文时,提示语应自动切换为中文(如“授权已取消”);若始终显示英文,最常见的原因是当前系统首选语言被设置为英文(例如“English”排在第一位),或区域选择为美国/英国等英语地区。

如果确认系统语言为中文但弹窗仍是英文,可能是系统组件资源缓存未及时刷新或当前版本的多语言包未完全覆盖,可尝试重启手机或检查系统更新。开发者侧一般无需额外处理,系统会根据用户环境自动本地化;若自定义了授权按钮的语言参数,需确保未强制指定为英文。

回到顶部