2

我在 Mac OS X 10.7 (Lion) 下创建了一个 Automator工作流服务(不是 Automator 应用程序!),其核心是 AppleScript 动作。该操作需要在多个点通知用户其操作(包括可能的中止),并且我希望将消息本地化为用户的语言。

遵循 Apple 的字符串本地化指南,我在工作流包(即<bundle>/Contents/Resources/<lang>.lproj/文件夹)中创建了语言环境资源文件夹,并将Localizable.strings包含 UTF-16 编码的字符串映射的文件放入其中。我使用localized string of <string_mapping_token>AppleScript 的构造来调用它们。

这在打包到 AppleScript 应用程序包(经过测试和确认)时工作得很好,但是当在 Automator 生成的服务中使用完全相同的脚本和结构时,本地化会失败——我得到的只是原始令牌(注意本地化的菜单名称ServicesMenu.strings捡起来就好了——资源文件夹结构本身似乎不是问题)。

我的猜测是问题在于,在 Automator 工作流程中,与应用程序包相反,它的上下文localized string是 Automator(或 Automator Runner,可能是),而不是正确的包,因此本地化查找失败。我已经尝试向CFBundleIdentifier服务添加一个 Bundle 标识符 ( ) 并通过 Automator 自己的构造引用它localized string in bundle with identifier <identifier>,但这似乎仅限于使用 Automator 注册的操作包。

是否有解决此问题的方法,允许我在自包含的 AppleScript 服务中使用 AppleScript 的本机本地化机制?

4

1 回答 1

3

本地化字符串命令似乎在 Automator 服务中没有正确的上下文,但您可以使用任何在通常位置具有资源的包。如果您知道捆绑包的位置(您的服务工作流程、包含的应用程序等),您可以在命令中指定该路径,例如

get localized string of "testing" in bundle file "path:to:your:bundle"

编辑:以下是对我有用的示例:

我创建了一个新的服务工作流,它可以在任何应用程序中接收文本,包括一个Run AppleScript操作:

property myPath : (path to library folder from user domain as text) & "Services:localize test.workflow"

on run {input, parameters}

    try
        display alert getLocalizedString("TESTING") & return & getLocalizedString("NO_ERROR") message "Input Text:    " & quoted form of (input as text)
    on error errmess number errnum
        display alert "Error" & errnum message errmess
    end try

    return input
end run

on getLocalizedString(theString)
    get localized string of theString in bundle file myPath
end getLocalizedString

我将工作流程命名为“本地化测试”,并将其保存在默认的~/Library/Services文件夹中(这是路径在myPath属性中)。接下来,将Localizable.strings文件(使用 BBEdit 创建的 UTF-16)放置在/Contents/Resources/English.lproj文件夹中的服务包中,其中包含以下内容:

/* Automator localization test */
"NO_ERROR" = "There seems to have been no error.";
"TESTING" = "Hmmm, works OK for me...";

在我的桌面上使用 AppleScript 脚本包并添加了相同资源的附加测试也可以正常工作,因此只要您使用有效包目录结构的路径,看起来任何事情都可以。

于 2012-02-19T18:43:42.370 回答