具有 Interface Builder 用户定义的运行时属性的本地化字符串
Posted
技术标签:
【中文标题】具有 Interface Builder 用户定义的运行时属性的本地化字符串【英文标题】:Localized String with Interface Builder User Defined Runtime Attributes 【发布时间】:2014-02-19 04:18:58 【问题描述】:我目前正在尝试在情节提要中创建一个本地化的可访问性标签(我试图避免以编程方式进行)。似乎每当我使用 Localized String 选项时,accessibilityLabels 最终都会设置为我提供的本地化字符串键,而不是字符串本身。有没有人有这个问题的解决方案?任何帮助将不胜感激。
【问题讨论】:
Localize a view within a storyboard using "User Defined Runtime Attributes" 的可能副本(结论是这是从 OS X 遗留下来的,ios 不支持)。 我真的希望有人能对这个问题有更深入的了解。我已经阅读了这个主题,我真的希望情况并非如此。 请注意,您仍然可以像本地化任何其他资源一样本地化整个 Interface Builder 文件。 我对 iOS 开发比较陌生,但是故事板文件是否被视为 IB 文件? 啊,在这种情况下,您需要启用Use Base Internationalization
,然后为每个本地化创建一个字符串文件。
【参考方案1】:
我猜您希望本地化字符串取自 Localizable.strings。 “Localized String”类型不能以这种方式工作,它只是一个标记,表明用户定义的运行时属性的值将在您使用基本本地化时参与本地化过程。请查看https://***.com/a/24527990/2876231 以获得更详细的说明。
【讨论】:
【参考方案2】:属性类型需要为Localizable String
,然后您可以使用以下属性在.strings
文件中对其进行翻译:
"KLc-fp-ZVK.ibExternalUserDefinedRuntimeAttributesLocalizableStrings[0]" = "¡Hola!";
不幸的是,它似乎不适用于命名属性,而只能用于上面的 long 属性。
(基于 Andrew 在此处的回答:Localize a view within a storyboard using "User Defined Runtime Attributes")
【讨论】:
【参考方案3】:我通过代码本地化属性的简单解决方案对属性进行了自定义:
private struct AssociatedKeys
static var someTagKey = "someTag"
@IBInspectable var someTag: String?
get
return NSLocalizedString(
objc_getAssociatedObject(self, &AssociatedKeys.someTagsKey) as? String ?? "", comment: "")
set
if let newValue = newValue
objc_setAssociatedObject(
self,
&AssociatedKeys.someTagsKey,
newValue as NSString?,
objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC
)
之后,您可以使用 egrep 从 xib 和 storyboard 文件中轻松提取所有字符串:
egrep -ohr --include="*.xib" --include="*.storyboard" '<userDefinedRuntimeAttribute type="string" keyPath="someTag" value="[^"]+"/>' . >> extracted-strings.txt
然后通过以下 sed 消除字符串文件中的标签,然后您必须为 xcode 准备好纯字符串文件:
sed -i -e 's/^<userDefinedRuntimeAttribute type="string" keyPath="someTag" value=\("[^"]*"\)\/>/\1 = \1;/g' extracted-strings.txt
【讨论】:
以上是关于具有 Interface Builder 用户定义的运行时属性的本地化字符串的主要内容,如果未能解决你的问题,请参考以下文章
如何为 iPhone 创建自定义 Interface Builder 插件?
使用 Interface Builder 构建的自定义 UIView 可通过 Interface Builder 访问/定位
两个 UITableViewCell 具有相同的约束,但在 Interface Builder 中显示不同
Xcode Interface Builder加载XIB文件显示具有透明度的视图