Каков наилучший способ отформатировать локализованную строку в AppleScript? - PullRequest
2 голосов
/ 15 сентября 2008

Когда скрипт сохраняется в виде пакета, он может использовать команду localized string для поиска подходящей строки, например, в Contents/Resources/English.lproj/Localizable.strings. Если это строка формата, как лучше заполнить заполнители? Другими словами, что AppleScript эквивалентно +[NSString stringWithFormat:]?

У меня была идея использовать do shell script с printf(1). Есть ли лучший способ?

Ответы [ 2 ]

1 голос
/ 31 декабря 2016

Начиная с OS X 10.10 , любой сценарий AppleScript мог использовать Objective-C. Существует несколько способов вызова методов Objective-C из AppleScript, как подробно описано в этого руководства по переводу . Такой разработчик 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 в параметр, который концептуально ожидает массив C из NSStrings:

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, указывает на тот факт, что AppleScript использует нечто вроде NSInvocation под капотом. В Objective-C NSInvocation позволяет отправлять сообщение объекту вместе с массивом значений параметров, не обязательно сопоставляя каждое значение определенному параметру. (См. эту статью , где приведены некоторые примеры использования NSInvocation напрямую.)

0 голосов
/ 16 сентября 2008

Как бы ужасно это ни звучало, обращение к printf(1) является общим решением.

Более чистое, хотя и несколько более сложное решение - использовать AppleScript Studio, которая позволяет вам вызывать объекты / классы Objective-C из вашего кода AppleScript с документированным синтаксисом call method здесь .

С этим вы сможете использовать что-то вроде этого:

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

Недостатком этого, конечно, является то, что вам нужно написать приложение AppleScript Studio вместо простого сценария. Тем не менее, в целом вы получаете большую гибкость с приложениями Studio, так что не все вместе - ужасный путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...