我发现某些 NSPredicateEditor
/NSPredicateEditorRowTemplate
值正在由 OS X 自动本地化。
.equalTo
这在 operator:到 string的映射中很容易观察到is
。
但我刚刚注意到 UTI 字符串被映射到该 UTI 的人类可读版本。
下面,我设置"public.image"
但它随后显示为"image"
.
func setupPredicateEditor() {
let left = [NSExpression(forKeyPath: "Type")]
let operators = [NSComparisonPredicate.Operator.equalTo.rawValue as NSNumber]
let right = [
NSExpression(forConstantValue: "public.image"),
NSExpression(forConstantValue: "public.text"),
NSExpression(forConstantValue: "public.fakeUTI"),
];
let rowTemplate = NSPredicateEditorRowTemplate.init(leftExpressions: left, rightExpressions: right, modifier: .all, operators: operators, options: 0)
predicateEditor.rowTemplates = [rowTemplate]
predicateEditor.addRow(self)
}
只有某些有效的 UTI 以这种方式映射。我不知道是否为运算符和 UTI 之外的其他格式提供了自动本地化字符串。
这是一个问题,因为我想本地化我的 NSPredicateEditor 和 Row Templates。
本地化谓词的过程涉及将键与本地化值匹配。
KEY: "%[left]@ %[is]@ %[right]@"
VAL: "%1$[left_display_string]@ %2$[is]@ %3$[right_display_string]@"
问题是键中的值必须与UI 中显示的字符串匹配。不是最初设置为行模板的左右表达式的字符串。
因此,我无法"public.image"
在密钥中使用本地化。UI 出于某种原因已经将其本地化为"image"
. 如果我想本地化行模板,我必须改用字符串"image"
。而且我不知道这个"image"
字符串是如何或为什么被选中的。
我可以通过测试确定这些字符串,然后编写一个将表达式映射到本地化字符串的表。但我更希望有一个禁用这种自动本地化的解决方案,这样我就不必担心我没有测试过的字符串。
为什么 UTI 会自动本地化?其他值是否接受相同的处理?
有没有办法禁用 UTI 字符串和/或整个谓词编辑器的自动本地化?