【问题标题】:Localize a view within a storyboard using "User Defined Runtime Attributes"使用“用户定义的运行时属性”本地化情节提要中的视图
【发布时间】:2012-07-31 13:36:41
【问题描述】:

我目前有一个semi-automated way 来本地化我的观点。然而,今天我在 IB 中发现了一个有趣的部分,这似乎表明我可以在 Interface Builder 中本地化我的视图。

因此,在 IB 中,您可以在 Identity Inspector 中为选定对象定义运行时属性。所以对于我的UILabel,我可以将标签的text 键路径设置为字符串Hello World

但是,当我选择 Type = Localized StringLocalized.strings 中的键名时,我没有得到翻译后的字符串,而只是我在 IB 中输入的值(因此是键)。

我不明白,这个机制应该如何工作。我希望喜欢能够像这样翻译我的观点,有什么想法吗?

【问题讨论】:

  • 我正好在同一点上。你有什么发现吗?

标签: iphone ios localization interface-builder uistoryboard


【解决方案1】:

“本地化字符串”类型的目的是让您定义一个将参与本地化过程的运行时属性值(使用基本本地化)。例如,如果您定义一个自定义控件,将其包含在情节提要中并希望将可本地化的字符串分配给其属性之一,这将非常方便。 但这仅适用于 Mac OS,不适用于 iOS。

您可以通过以下实验轻松确认这一点:在情节提要中放置一个 UILabel / NSTextField 并使用用户定义的运行时属性设置“text”/“stringValue”属性。如果您使用“字符串”作为属性的类型并生成相应的字符串文件,您将不会在文件中的任何位置看到它。相反,如果您将类型更改为“本地化字符串”并生成字符串文件,您会发现如下条目:

/* Class = "IBUILabel"; wij-Kq-q92.ibExternalUserDefinedRuntimeAttributesLocalizableStrings[0] = "Localized value"; ObjectID = "wij-Kq-q92"; */
"wij-Kq-q92.ibExternalUserDefinedRuntimeAttributesLocalizableStrings[0]" = "Localized value";

然后你可以在对应的语言字符串文件中本地化这个值。同样,这适用于 Mac OS,但不适用于 iOS。

【讨论】:

  • 这在 2016 年是否继续仅适用于 Mac OS 而不适用于 iOS?
  • 不知道,最近没试过。无论如何,您可以使用答案中描述的过程轻松检查它。如果您这样做,请告诉我们:)
  • 我正要回来检查说运行时属性在这里是一个更好的选择,并且可以使用 setValue forKeyPath 的简单覆盖,所以这就是我要使用的选项。这个答案让我大部分时间到达那里:stackoverflow.com/questions/21870950/…
  • Xcode 8 与 iOS8 目标:不工作。同样在一个小测试项目中:Xcode8/iOS10.3 目标:不起作用(.strings 文件未读取用户定义的运行时属性)
  • 从带有 iOS 10 目标的 Xcode 9 开始:不起作用。我对这个问题的解决方案,而不是编写任何代码或实用程序,是将我的目标语言作为“Interface Builder Storyboard”而不是“Localizable Strings”。 (我只需要将整个源代码从繁体中文转换为简体中文)
【解决方案2】:

“用户定义的运行时属性”记录不充分。我从读过的一本书中记得,UDRA 最初是为 MacOSX 编程实现的,因此“本地化字符串”类型可能是目前 iOS 中不完全支持的功能。

有趣的是,他正在翻译情节提要预览中的字符串(xCode 4.5.1),但后来在编译的 iOS 应用程序中,他只是注入了关键字符串。

我现在正在考虑的一个解决方案是创建一个小助手类,即检查 viewDidLoad 上视图的标题/文本字符串是否有关键字,例如“key”,例如“XYControllerTitleKey”,然后在上面做NSLocalizedString-Method。

更新: 与此同时,似乎有一种方法可以使用 UDRA:

Storyboard/XIB and localization best practice

结果是一个教程 (link)

【讨论】:

  • 投反对票,因为答案不准确(至少在当前版本的 Xcode 中):类型“本地化字符串”意味着运行时属性将参与本地化过程,而不是使用普通的“字符串”类型。如果您从情节提要生成字符串文件,则可以检查这一点:如果您使用“字符串”,则该值不会包含在生成的字符串文件中;如果您使用“本地化字符串”,它将是。
  • 正如我在其他评论中提到的:本地化过程的工具负责 UDRA,但是,iOS 运行时没有。 UDRA 的值不是取自 .strings 文件。
【解决方案3】:

对我来说,使用 iOS 6,如果您从基本本地化故事板生成字符串(通过让 XCode 生成它们或使用ibtool --generate-strings-file,您将获得看起来像这样的自动生成字符串(应该进入MainStoryBoard.strings,例如):

/* Class = "IBUITextField"; b4a-O4-bNZ.ibExternalUserDefinedRuntimeAttributesLocalizableStrings[0] = "Event Name"; ObjectID = "b4a-O4-bNZ"; */
"b4a-O4-bNZ.ibExternalUserDefinedRuntimeAttributesLocalizableStrings[0]" = "Event Name";

不幸的是,最好让它们通过 Key Path 来识别,但至少您有用户定义的字符串应该本地化的位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-21
    • 1970-01-01
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多