首页 > 解决方案 > Apple Watch 上的默认本地化语言错误

问题描述

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

(..取消 XCode 10.0、Swift4.2、iOS12 和 WatchOS4.2)

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

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

这一定是一个错误,对全球用户来说非常烦人。

关于如何克服这个问题的任何想法?

请参阅此处的一些图像,说明 WatchKit 应用程序中的本地化:

在此处输入图像描述

这里是 WatchKit 扩展:

在此处输入图像描述

和 info.plist 条目:

在此处输入图像描述

标签: swiftlocalizationwatchkitapple-watchwatchos-5

解决方案


以下是如何为典型的 WatchKit 应用程序 (Swift >v4.2) 正确设置默认语言和区域的说明:

预先声明:本文没有说明如何在整个项目中本地化故事板文件或字符串。本文仅限于 Apple Watch 的默认语言属性和 Info.plist 的本地化!

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

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

本地化如下:

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

在此处输入图像描述

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

在此处输入图像描述(...无需为 info.plist-File 添加其他语言... - 即其他语言将添加到额外的 infoPlist.strings 文件中,如本文后面的步骤所述...)

另外,请不要添加任何 Target Memberships(因为 Copy-Bundle 不允许将任何 info.plist 文件添加到二进制文件中(否则 App Store 验证会导致错误)。

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

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

在此处输入图像描述(当然,对于 3 个目标,在项目中每个目标文件夹的根目录下都有 3 个 Base.lproj 文件夹)

D)最终,如果 Xcode 在这一点上显示错误:对于所有 3 个目标,转到目标->构建设置->info.plist 文件...并更正路径以考虑到您的 info.plist 文件所在的事实在 Base.lproj 子文件夹中

在此处输入图像描述

E)如果一切设置正确,则所有 3 个目标的 Xcode Group 文件夹和 Base-setting 如下所示:

在此处输入图像描述

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

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

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

这篇文章在下面展示了如何本地化您的 infoPlist.strings 文件(不要与我们刚刚为仅负责 iPhone 和 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 变得非常明显。


推荐阅读