Каков наилучший способ отформатировать локализованную строку в AppleScript?
-
09-06-2019 - |
Вопрос
Когда скрипт сохраняется в виде пакета, он может использовать localized string
команда для поиска соответствующей строки, напримерв Contents/Resources/English.lproj/Localizable.strings
.Если это строка формата, каков наилучший способ заполнить заполнители?Другими словами, что является эквивалентом AppleScript для +[NSString stringWithFormat:]
?
Одна из идей, которая у меня возникла, состояла в том, чтобы использовать do shell script
с printf(1)
.Есть ли способ получше?
Решение
Начиная с 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 в параметр, который концептуально ожидает массив 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, указывает на тот факт, что AppleScript использует что-то похожее на Вызов под капотом.В Objective-C NSInvocation позволяет вам отправлять сообщение объекту вместе с массивом значений параметров, не обязательно сопоставляя каждое значение с определенным параметром.(См . эта статья вот несколько примеров прямого использования NSInvocation.)
Другие советы
Как бы уродливо это ни было, взывая к printf(1)
это общее решение.
Более чистым, хотя и несколько более сложным решением является использование AppleScript Studio, которое позволяет вам вызывать объекты / классы Objective-C из вашего кода AppleScript с помощью call method
документированный синтаксис здесь.
При этом вы могли бы использовать что-то вроде этого:
call method "stringWithFormat:" of class "NSString" with parameters {formatString, arguments}
Недостатком этого, конечно, является то, что вам нужно написать приложение AppleScript Studio вместо простого скрипта.Однако в целом с приложениями Studio вы получаете гораздо больше гибкости, так что в целом это не такой уж ужасный путь.