uni-app APP名字使用国际化时 决定生效的居然是回退语言字段“fallbackLocale”而不是当前系统语言

发布于 1周前 作者 sinazl 来自 Uni-App

uni-app APP名字使用国际化时 决定生效的居然是回退语言字段“fallbackLocale”而不是当前系统语言

操作步骤

  1. 应用名称使用国际化 %app.name%,在 zh-Hans.jsonen.json 分别添加 "app.name" 字段
  2. 设置系统语言为中文,默认回退语言为英文
  3. 使用 plus.runtime.appid 获取 APP 名字

预期结果

使用 plus.runtime.appid 获取 APP 名字应该得到中文

实际结果

使用 plus.runtime.appid 获取 APP 名字得到的是英文

bug 描述

应用名称使用的国际化 %app.name% 来定义,当我系统语言为中文,默认回退语言设置为英文,使用 plus.runtime.appid 来获取 name 得到的是英文名,但 uni.getLocale() 得到的明明是 zh-Hans。当我设置默认回退语言为中文,plus.runtime.appid 拿到的 name 又变成中文了,系统语言为英文时亦是如此。默认语言设置的跟随系统。

开发环境与版本信息

项目创建方式 HBuilderX
PC开发环境操作系统 Windows
PC开发环境操作系统版本号 22H2
HBuilderX类型 正式
HBuilderX版本号 3.8.7
手机系统 iOS
手机系统版本号 iOS 16
手机厂商 苹果
手机机型 iPhone12
页面类型 vue
vue版本 vue2
打包方式 云端

17 回复

安卓机小米11,安卓版本13也是如此


最新hbuilder版本,ios测试也是如此。希望官方能回复解决下,还遇到相机读取权限和用户跟踪权限弹窗的提示语有同样这个bug

手机设置的是什么语言呢?

手机设置为英文、中文,问题都是一样的。
如果fallback=中文简体,那么开屏图的APP名字是中文、2个IOS权限弹窗(相册读取、用户跟踪)都是显示中英换杂(提示语标题是正确的中文,但副标题是英文),虽然手机语言=英文。
如果fallback=en,那么那么开屏图的APP名字是英文、2个IOS权限弹窗(相册读取、用户跟踪)都是显示中英混杂(提示语标题是正确的英文,但副标题是中文),虽然手机语言=中文。
这个换了测试手机和hbuilderX版本,问题同样,所以应该是框架组件多语言实现的bug。

什么权限呢?你看下在 “app-plus” -> “distribute” -> “android” 节点下,类似于 permissionPhoneState 节点,你看是自己配的么

IOS的权限勾选是在manifest图形页面,生成的源码如截图

再补充下其它manifest的配置截图



这个是IOS版本,不是安卓啊。你回的帖子我看了是安卓的,应该不适用IOS吧?

这个又重复测试了最新的hbuilderX版本,以及不同的manifest多语言设置(auto+中/英,中/中,英英),发现问题都是一样的,推测就是启动图和那几个框架组件用的是fallback语言,而不是手机os语言、也不是uni.getLocale()的值。
请官方确认修复一下?否则国际化在苹果的表现是明显有问题的。谢谢!

这个bug能否请官方确认回复一下吗?如果能排期解决就更感谢不尽。

能否烦请官方确认下这是是否是bug?试了各种变通方式,问题都是一样。搜索社区一些老的帖子,发现有多人反馈过同样问题,但都没有得到官方的正式回复。
理解官方技术支持的繁忙程度和优先级。
谢谢!

不知道这个bug为啥放那么久,难道uniapp官方一点都不在意?这里讲安卓的问题 当清单文件如下配置时,安卓打出来的包存在问题!!只要是en-US en,都有该问题。如果回退语言设置为中文,没有该问题。但国际化默认语言是英语。

“locale” : “auto”, “fallbackLocale” : “en-US”

提供一下可以复现问题的最近示例

直接你们官方demo,云打包自定义基座,打出来的包 应用名称全是英文。(自然手机系统切语言全是英文) 1、应用名称使用国际化%app.name%,在zh-Hans.json和en.json分别添加“app.name”字段 2、国际化如下配置 “locale” : “auto”, “fallbackLocale” : “en-US”

回复 hynson: 这段描述里可变地方太多了。你直接发我一个示例项目把

在处理uni-app国际化时,确实可能会遇到应用名称(或其他国际化内容)显示与预期不符的情况,特别是当系统语言与应用的配置不匹配时。如果决定生效的是回退语言字段“fallbackLocale”而不是当前系统语言,这通常是因为应用的国际化配置逻辑或者uni-app框架的默认行为导致的。

为了解决这个问题,并确保APP名字正确显示当前系统语言的翻译,你可以通过以下步骤和代码来确保国际化配置的正确性。

首先,确保你的pages.jsonmanifest.json(具体取决于uni-app的版本和配置方式)中正确设置了国际化信息。例如:

// manifest.json
{
  "mp-weixin": { // 或其他平台配置
    "appid": "...",
    "setting": {
      "i18n": {
        "locales": {
          "en": {
            "name": "AppName in English"
          },
          "zh": {
            "name": "应用名称(中文)"
          }
        },
        "defaultLocale": "en", // 默认语言
        "fallbackLocale": "en"  // 回退语言
      }
    }
  }
}

然而,由于你提到fallbackLocale覆盖了当前系统语言,你可能需要调整默认语言和回退语言的设置,或者确保系统语言被正确识别和处理。

接下来,你可以通过编程方式动态获取系统语言,并尝试强制设置应用的当前语言。虽然uni-app没有直接提供API来动态改变国际化设置,但你可以通过一些变通方法实现,比如使用全局变量或者Vuex来存储当前语言,并在组件或页面中根据这个变量来显示相应的内容。

以下是一个简化的示例,展示如何在Vue组件中根据当前语言显示不同的文本:

// 在main.js或App.vue中设置当前语言
const currentLanguage = (navigator.language || navigator.userLanguage).split('-')[0];
Vue.prototype.$currentLanguage = currentLanguage;

// 在组件中使用
<template>
  <view>
    <text>{{ getText('app_name') }}</text>
  </view>
</template>

<script>
export default {
  methods: {
    getText(key) {
      const translations = {
        en: { app_name: 'AppName in English' },
        zh: { app_name: '应用名称(中文)' }
      };
      return translations[this.$currentLanguage][key] || translations['default'][key];
    }
  }
}
</script>

注意,上述代码仅用于演示目的,并未直接处理uni-app的国际化配置。在实际应用中,你可能需要结合uni-app的国际化插件或自定义解决方案来更精确地管理语言设置和回退逻辑。

回到顶部