Apple Watch 上的默认本地化语言错误

Default Localization Language wrong on Apple Watch

我对 Apple Watch 本地化有疑问:默认语言不工作!

(..unsing XCode 10.0、Swift4.2、iOS12 和 WatchOS4.2)

在我的代码中,我将英语设置为默认语言。此外,我将德语定义为本地化。对于这两种语言,一切正常,并且取决于 iPhone-Settings 的设置方式(即英语或德语),Apple Watch 会反映这些语言。

但是如果我将 iPhone 语言设置为法语,情况就会变得糟糕,例如(并且地区也设置为法国)然后手表上的所有内容都以德语显示(而不是默认语言英语!!).

这一定是一个错误,全世界的用户都非常讨厌。

知道如何解决这个问题吗?

在这里查看一些说明 WatchKit 应用程序内部本地化的图片:

这里是 WatchKit 扩展:

和 info.plist 条目:

我在 2 年前提交了一个雷达,直到今年的 WWDC 我找到工程师并抱怨这个问题时才得到任何更新。在 WWDC 之后,他们将我的雷达关闭为重复问题。

尝试在 Watch Extention 中添加 Localizable.strings(基本)文件,因为一些开发人员说这样做可以解决问题。

这里解释了如何为典型的 WatchKit 应用程序正确设置默认语言和区域 (Swift >v4.2):

预先声明:本文不介绍如何在整个项目中本地化情节提要文件或字符串。本文仅限于 Apple Watch 的默认语言属性和 Info.plist !

的本地化

首先,据了解您有 3 个目标:

  • MyApp-Target
  • MyApp WatchKit 目标
  • MyApp WatchKit 扩展目标

汉化如下:

A) 确保所有 3 个目标的 Info.plist 文件包含 属性-列表条目“CFBundleDevelopmentRegion”(您可以选择任何默认语言和地区,例如-例如:en_US

B) 确保所有 3 个目标都有一个 info.plist 文件 本地化为 Base

(...无需为 info.plist-文件添加其他语言... - 即其他语言将添加到额外的 infoPlist.strings 文件中,如步骤中所述在这篇文章的后面...)

此外,请不要添加任何目标成员资格(因为 Copy-Bundle 不允许将任何 info.plist 文件添加到二进制文件(否则 App Store 验证会导致错误)。

顺便说一句,如果您想测试 Apple Watch 的默认语言行为 - 请确保在更改模拟器上的 iPhone 语言之前完全擦除并重置两个模拟器。似乎也有必要删除并重新建立 Target-Schemes。这样做可以测试 Apple Watch 的语言行为,即使是非基本语言或本地化语言...

C) 确保所有 3 个目标的 info.plist 文件位于相应的 Base.lproj 文件夹中

(当然,对于 3 个目标,在项目中每个目标文件夹的根目录下有 3 个 Base.lproj 文件夹)

D) 最终,如果 Xcode 此时显示错误:对于所有 3 个目标,转到 Target->Build Settings->info.plist文件 ...并 更正路径 以考虑到您的 info.plist 文件位于 Base.lproj 子文件夹

E) 如果所有设置都正确,那么所有 3 个目标的 Xcode 组文件夹和基础设置如下所示:

// -----------------------------------------------------------------------------

此时,您应该已经有了所需的行为,例如当您的 iPhone 和 Watch 运行 使用非语言时,Apple Watch 将显示默认(基本)语言本地化。

现在,如果您想为 Info.plist 添加额外的语言功能,那就是本地化开始的时候,也就是您需要为每个希望拥有语言的目标引入 InfoPlist.strings 文件的时候-定制。

这篇文章在下面展示了如何本地化您的 infoPlist.strings 文件(不要与我们刚刚在上面对仅负责 [的默认语言设置的基本语言定义所做的混淆) =156=] 和 Apple Watch)。同样,本文没有显示故事板或字符串本地化。如果你想了解这个,请参考其他文章..

您的 info.plist 文件的本地化:

在您的目标中(或者至少是您想要在 info.plist 文件中本地化某些内容的目标)- 执行以下操作:

I) 转到文件 -> 新建 -> 文件...然后将字符串文件添加到您选择的目标

II) 将文件命名为 InfoPlist.strings 并将其保存在目标文件夹结构中的某处(以及任意位置Xcode 参考树组)

III) 在 InfoPlist.string(您选择的目标)中,写下您要本地化的密钥(在引号)后跟一个等号和您选择的语言的本地化文本(也在引号中,后跟一个分号)。

这是德语本地化的示例:

/* App name localization */
"CFBundleDisplayName" = "MyApp_Name_in_German";

/* Privacy - Health Share Usage Description */
"NSHealthShareUsageDescription" = "Erlaubnis für Herzfrequenz Messung nötig.";

/* Privacy - Health Update Usage Description */
"NSHealthUpdateUsageDescription" = "Erlaubnis für Herzfrequenz Messung nötig.";

IV) 确保每个 InfoPlist.strings 文件都选择了正确的目标和语言(对应每个目标 -而据了解,WatchKit 目标很可能不需要 InfoPlist.strings 本地化 - 但其他两个目标肯定需要 [即 MyApp-target 和 MyApp WatchKit Extension])。

V) 如果所有设置正确,您的目标文件夹组之一现在将如下所示:

(其中 InfoPlist.strings 是针对相应语言本地化的,Info.plist 是针对 Base 本地化的)

// -----------------------------------------------------------------------------

我们不要问为什么 Apple 让 Apple Watch 的正确归因于默认语言和地区变得如此复杂,并且还让 InfoPlist.strings 如何本地化不同语言变得非常明显。