Localization 如何使用AppleScript’;s&x201C;本地化字符串”;在自动机工作流中

Localization 如何使用AppleScript’;s&x201C;本地化字符串”;在自动机工作流中,localization,applescript,automator,Localization,Applescript,Automator,我在MacOSX10.7(Lion)下创建了一个Automator工作流服务(不是Automator应用程序!),其核心是AppleScript操作。该操作需要在几个点上通知用户其操作(包括可能的中止),我希望消息以用户的语言本地化 继Apple之后,我在工作流包中创建了区域设置资源文件夹(即/Contents/Resources/.lproj/文件夹),并将可本地化的.strings文件放入其中,其中包含UTF-16编码的字符串映射。我使用AppleScript的结构的本地化字符串调用这些函数

我在MacOSX10.7(Lion)下创建了一个Automator工作流服务(不是Automator应用程序!),其核心是AppleScript操作。该操作需要在几个点上通知用户其操作(包括可能的中止),我希望消息以用户的语言本地化

继Apple之后,我在工作流包中创建了区域设置资源文件夹(即
/Contents/Resources/.lproj/
文件夹),并将
可本地化的.strings
文件放入其中,其中包含UTF-16编码的字符串映射。我使用AppleScript的
结构的
本地化字符串调用这些函数

当打包到AppleScript应用程序包(经过测试和确认)中时,这种方法可以很好地工作,但当在自动生成的服务中使用完全相同的脚本和结构时,本地化就会失败——我得到的只是原始令牌(请注意,
ServicesMenu.strings
中的字符串拾取得很好–资源文件夹结构本身似乎没有问题)

我猜问题在于,在Automator工作流中,与应用程序包相反,
本地化字符串的上下文是Automator(或Automator Runner,视情况而定),而不是包本身,因此本地化查找失败。我已尝试添加包标识符(
CbundleIdentifier
)通过Automator自己的
本地化字符串(位于带有标识符的bundle
构造中)引用服务,但这似乎仅限于向Automator注册的操作bundle


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

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

get localized string of "testing" in bundle file "path:to:your:bundle"
编辑:以下是一个对我有效的示例:

我创建了一个新的服务工作流,它接收任何应用程序中的文本,包括运行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属性中)。接下来是一个可本地化的.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脚本捆绑包并添加相同资源的附加测试也可以正常工作,因此,只要使用有效捆绑包目录结构的路径,似乎任何测试都可以完成。

它对我有效-是吗(re)在Automator构建应用程序后添加Localizable.strings文件?@Red\u威胁:问题是我构建的是Automator服务,而不是Automator应用程序。后者提供了一个本地化存根(如果我正确,每个支持的OS X语言都有一个伪
.nib
文件)如果在Automator每次生成后将
Localizable.strings
文件重新添加到其各自的
.lproj
文件夹,则支持本地化字符串。前者本身不提供任何本地化结构,但您可以手动添加。如我的问题所述,这适用于服务菜单项的本地化,但仅限于y表示可本地化。字符串被忽略。只是暗中捅一下:您使用的是缩写,例如“de”和“en”,对吗?我之所以这么问是因为在某些情况下,这些名称比较长,而且如果你真的在使用这些名称,也许这就是你必须改变的。除此之外,没有其他想法。@ThomasTempelmann:谢谢你的建议-尝试了长和短(我以前也看到过这是一个问题),但这似乎真的是一个关于
本地化字符串的上下文问题,在服务的情况下,它不是脚本本身——尽管红色威胁的解决方案起了作用。@kopischke链接断了,你能更新吗?我得到的只是一个AppleScript错误:“file”path:to:my:bundle“无法读取”(是的,只是想先回答这个问题:我使用的是捆绑包的实际路径;尝试使用别名作为文本和字符串文本,带文件夹和不带文件夹):“terminator.No dice”。根据Automator as dictionary,“foo”的
本地化字符串中的预期参数
bar
bundle bar中的
是一个Automator bundle对象。运行快速测试时,我无法将别名或文件对象强制到这样的bundle对象,但我可能遗漏了什么?我使用外部脚本捆绑包和服务工作流本身进行了测试,使用相应的.lproj文件夹中的Localizable.strings文件-我创建了中间折叠ers,但没有做其他更改。此方法适用于使用捆绑包路径的我(我刚刚测试了英语),虽然如果使用服务包,您可能需要玩游戏来动态定位它。是的,动态定位工作流是该方法的一个问题–但现在,我愿意让您的解决方案真正发挥作用。就目前情况而言,我无法摆脱AppleScript错误…我编辑了我的答案,以包含有关我的解决方案的详细信息工作解决方案。