Iphone 使用“将视图本地化到情节提要中”;“用户定义的运行时属性”;

Iphone 使用“将视图本地化到情节提要中”;“用户定义的运行时属性”;,iphone,ios,localization,interface-builder,uistoryboard,Iphone,Ios,Localization,Interface Builder,Uistoryboard,我目前有一个方法来本地化我的观点。然而,今天我在IB中发现了一个有趣的部分,它似乎建议我可以从Interface Builder中本地化我的视图 因此,在IB中,您可以在Identity Inspector中为选定对象定义运行时属性。因此,对于我的UILabel我可以将标签的textkeypath设置为字符串Hello World 但是,当我选择Type=Localized String,然后选择Localized.strings中某个键的名称时,我得到的不是翻译后的字符串,而是我在IB中输入的

我目前有一个方法来本地化我的观点。然而,今天我在IB中发现了一个有趣的部分,它似乎建议我可以从Interface Builder中本地化我的视图

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

但是,当我选择
Type=Localized String
,然后选择
Localized.strings
中某个键的名称时,我得到的不是翻译后的字符串,而是我在IB中输入的值(因此是键)

我不明白,这个机制是怎么工作的。我希望能够像这样翻译我的观点,有什么想法吗?

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

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

我现在正在考虑的一个解决方案是创建一个小助手类,即在viewDidLoad上检查视图的标题/文本字符串,以查找诸如“key”之类的关键字,例如“XYControllerTitleKey”,然后在此基础上生成NSLocalizedString方法

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


作为一个教程()

对于我来说,使用iOS 6,如果您从基本的本地化故事板生成字符串(通过使用XCode生成字符串或使用
ibtool--generate strings file
您将得到如下自动生成的字符串(例如,应该在
MainStoryBoard.strings
):

不幸的是,通过键路径识别它们是很好的,但至少您有了用户定义字符串应该本地化的位置。

使用“本地化字符串”类型的目的是让您定义将参与本地化过程的运行时属性值(使用基本本地化)。例如,如果您定义自定义控件,将其包含在情节提要中,并希望将可本地化字符串指定给其属性之一,则此操作非常方便。但是,此操作仅适用于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上无效。

我的观点与此完全相同。您发现了与此相关的任何信息吗?因为答案不准确(至少在当前版本的Xcode中是这样):类型“本地化字符串”表示运行时属性将参与本地化过程,而不是使用普通的“字符串”类型。如果从情节提要生成字符串文件,则可以检查此项:如果使用“字符串”,则生成的字符串文件中将不包含该值;如果使用“本地化字符串”它将是。正如我在其他评论中提到的:本地化过程的工具会处理UDRA,但是iOS运行时不会。UDRA的值不会从.strings文件中获取。这是否在2016年仅在Mac OS上有效,而不会在iOS上有效?我不知道,我最近没有尝试过。无论如何,您可以使用该过程轻松检查它回答中描述的。如果您这样做了,请告诉我们:)我正要回来检查,说运行时属性在这里是一个更好的选项,并使用简单的setValue forKeyPath覆盖,所以这就是我要使用的选项。这个答案在很大程度上帮助了我:带iOS8目标的Xcode 8不工作。同样在一个小测试项目中:Xcode8/iOS10.3目标:不工作(.strings文件不读取用户定义的运行时属性),从xcode9开始,iOS10目标:不工作。我解决这个问题的方法,不是编写任何代码或UTIL,而是将我的目标语言设置为“Interface Builder情节提要”,而不是“可本地化字符串”。(我只需要将整个源代码从繁体中文转换为简体中文)
/* Class = "IBUILabel"; wij-Kq-q92.ibExternalUserDefinedRuntimeAttributesLocalizableStrings[0] = "Localized value"; ObjectID = "wij-Kq-q92"; */
"wij-Kq-q92.ibExternalUserDefinedRuntimeAttributesLocalizableStrings[0]" = "Localized value";