在AppleScript中格式化本地化字符串的最佳方法是什么?

时间:2008-09-15 15:52:11

标签: applescript

当脚本保存为捆绑包时,它可以使用localized string命令查找相应的字符串,例如在Contents/Resources/English.lproj/Localizable.strings。如果这是格式字符串,填写占位符的最佳方法是什么?换句话说,AppleScript等效于+[NSString stringWithFormat:]

我的一个想法是将do shell scriptprintf(1)一起使用。还有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

Since OS X 10.10,任何AppleScript脚本都可以使用Objective-C。有几种方法可以在AppleScript中调用Objective-C方法,详见this translation guide。像我这样的Objective-C开发人员会倾向于使用这种语法,该语法使用它们的值插入方法的参数:

use framework "Foundation"

tell the current application's NSWorkspace's sharedWorkspace to openFile:"/Users/me/Desktop/filter.png" withApplication:"Preview"

结果:

true

+[NSString stringWithFormat:]是一个棘手的案例。它需要一个vararg列表作为其第一个参数,因此您需要某种方法将格式字符串及其参数强制转换为相同的方法参数。以下结果导致错误,因为AppleScript最终将单个NSArray传递给参数,该参数在概念上是一个NSStrings的C数组:

use framework "Foundation"

the current application's NSString's stringWithFormat:{"%lu documents", 8}

结果:

error "-[__NSArrayM length]: unrecognized selector sent to instance 0x7fd8d59f3bf0" number -10000

相反,您必须使用看起来更像AppleScript处理程序调用而不是Objective-C消息的替代语法。您还需要将返回值(NSString对象)强制转换为text

use framework "Foundation"

the current application's NSString's stringWithFormat_("%lu documents", 8) as text

结果:

"2087 documents"

@nlanza提到的“with parameters”语法指出AppleScript正在使用类似于NSInvocation的东西。在Objective-C中,NSInvocation允许您向对象发送消息以及参数值数组,而不必将每个值与特定参数匹配。 (有关直接使用NSInvocation的一些示例,请参阅this article。)

答案 1 :(得分:0)

虽然很丑陋,但呼叫printf(1)是常见的解决方案。

更简洁但更复杂的解决方案是使用AppleScript Studio,它允许您使用call method语法记录here从AppleScript代码调用Objective-C对象/类。< / p>

有了这个,你就可以使用这样的东西:

call method "stringWithFormat:" of class "NSString" with parameters {formatString, arguments}

当然,这样做的缺点是你需要编写AppleScript Studio应用程序,而不是只编写一个简单的脚本。不过,对于Studio应用程序来说,你确实可以获得更大的灵活性,所以这并不是一条可怕的路线。