Каков наилучший способ отформатировать локализованную строку в AppleScript?

StackOverflow https://stackoverflow.com/questions/64146

  •  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 вы получаете гораздо больше гибкости, так что в целом это не такой уж ужасный путь.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top