【问题标题】:Default Localization Language wrong on Apple WatchApple Watch 上的默认本地化语言错误
【发布时间】:2019-03-09 15:53:39
【问题描述】:

我遇到了 Apple Watch 本地化问题:默认语言不起作用!

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

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

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

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

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

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

这里是 WatchKit 扩展:

还有 info.plist 条目:

【问题讨论】:

    标签: swift localization watchkit apple-watch watchos-5


    【解决方案1】:

    以下是如何为典型的 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 个 Target,转到 Target->Build Settings->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 变得非常明显。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 非常感谢您的意见。不幸的是,WatchOS5 仍然存在这个问题,对许多用户产生了负面影响(甚至在你的雷达已经存在 2 年之后!)。我已经在 Watch Extension 中有一个 Localizable.strings (Base) 文件。我不确定的唯一问题是文件的物理位置是否重要(即它可以在子文件夹中吗?)。无论如何,我对它可能是什么一无所知,因为我认为我在本地化方面没有做错任何事情(至少与 iPhone 完全相同的方式现在在 Watch 上也不起作用)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多