【问题标题】:How to use AppleScript’s “localized string” inside an Automator workflow如何在 Automator 工作流程中使用 AppleScript 的“本地化字符串”
【发布时间】:2012-02-19 00:50:37
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 它适用于我 - 您是否在 Automator 构建应用程序后(重新)添加 Localizable.strings 文件?
  • @Red_Menace:问题是我正在构建 Automator 服务,而不是 Automator 应用程序。后者提供了一个本地化存根(如果我是正确的话,对于 OS X 的每种支持的语言都有一个虚拟的 .nib 文件)并支持本地化字符串,如果您在每个之后将 Localizable.strings 文件重新添加到其各自的 <lang>.lproj 文件夹中由 Automator 构建。前者本身不提供任何本地化结构,但您可以手动添加。正如我的问题中所述,这适用于服务菜单条目的本地化,但仅限于此 - Localizable.strings 被忽略。
  • 只是在黑暗中戳戳:您正在使用 的短名称,例如“de”和“en”,对吗?我只是问,因为在 some 情况下工作的名称较长,如果您实际使用这些名称,也许这就是您必须更改的内容。除此之外,没有任何想法。
  • @ThomasTempelmann:感谢您的建议 - 长期和短期都尝试过(我以前也看到过这也是一个问题),但这似乎确实是localized string 的上下文问题在服务的情况下不是脚本本身——但 Red_Menace 的解决方案有效。
  • @kopischke 链接已损坏,您能更新一下吗?

标签: localization applescript automator


【解决方案1】:

localized string 命令似乎在 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 脚本包并添加了相同资源的附加测试也可以正常工作,因此只要您使用有效包目录结构的路径,看起来任何事情都可以。

【讨论】:

  • 我得到的只是 AppleScript 错误:“无法读取文件“path:to:my:bundle””(是的,只是为了先发制人:我正在使用实际路径捆绑包;尝试使用别名作为文本和字符串文字,有和没有文件夹“:”终止符。没有骰子)。
  • 根据 Automator AS 字典,localized string of "foo" in bundle bar 中的预期参数 bar 是 Automator 捆绑对象。运行快速测试,我无法将别名或文件对象强制为这样的捆绑对象,但我可能遗漏了什么?
  • 我使用外部脚本包和服务工作流本身进行了测试,Localizable.strings 文件位于适当的 .lproj 文件夹中 - 我创建了中间文件夹,但没有进行其他更改。这种方法适用于我使用捆绑包的路径(我刚刚测试了英语),但如果使用服务捆绑包,您可能需要玩游戏才能动态定位它。
  • 是的,动态定位工作流是这种方法的一个问题——但现在,我愿意让你的解决方案真正发挥作用。就目前情况而言,我无法摆脱 AppleScript 错误……
  • 我编辑了我的答案以包含有关我的工作解决方案的细节。
猜你喜欢
  • 2011-12-27
  • 2020-04-30
  • 2020-12-27
  • 2013-10-06
  • 2010-11-04
  • 2016-01-11
  • 2013-03-17
  • 2013-08-21
  • 1970-01-01
相关资源
最近更新 更多