Was ist der beste Weg, um eine lokalisierte Zeichenfolge in Applescript zu formatieren?
-
09-06-2019 - |
Frage
Wenn ein Skript als ein Bündel gespeichert wird, kann es den localized string
Befehl verwenden Sie die entsprechende Zeichenfolge zu finden, zum Beispiel in Contents/Resources/English.lproj/Localizable.strings
. Wenn dies ein Format-String ist, was ist die beste Art und Weise in den Platzhalter zu füllen? Mit anderen Worten, was ist das Äquivalent von Apple +[NSString stringWithFormat:]
?
Eine Idee, die ich hatte, war do shell script
mit printf(1)
zu verwenden. Gibt es einen besseren Weg?
Lösung
Seit OS X 10.10 , ist es möglich, für jedes Applescript-Skript Objective-C zu verwenden. Es gibt ein paar Möglichkeiten, Objective-C-Methoden aus Apple zu nennen, wie detailliert in diese Übersetzung Führung . Ein Objective-C-Entwickler wie mich wäre zu dieser Syntax gravitieren, die die Methode der Parameter mit ihren Werten interpoliert:
use framework "Foundation"
tell the current application's NSWorkspace's sharedWorkspace to openFile:"/Users/me/Desktop/filter.png" withApplication:"Preview"
Ergebnis:
true
+[NSString stringWithFormat:]
ist ein heikeler Fall. Es dauert eine Vararg Liste als erste Parameter, so müssen Sie einen Weg, sowohl den Format-String und seine Argumente in den gleichen Verfahrensparameter zu erzwingen. Die folgenden Ergebnisse in einem Fehler, weil Apple endet ein einzelnes NSArray in den Parameter übergeben, die vom Konzept her, eine C Array von NSStrings erwartet:
use framework "Foundation"
the current application's NSString's stringWithFormat:{"%lu documents", 8}
Ergebnis:
error "-[__NSArrayM length]: unrecognized selector sent to instance 0x7fd8d59f3bf0" number -10000
Stattdessen müssen Sie eine alternative Syntax verwenden, die eher wie ein Applescript-Handler Aufruf als eine Objective-C-Nachricht aussieht. Sie müssen auch den Rückgabewert (ein NSString-Objekt) in ein text
zwingen:
use framework "Foundation"
the current application's NSString's stringWithFormat_("%lu documents", 8) as text
Ergebnis:
"2087 documents"
Die „mit den Parametern“ Syntax, die @nlanza verweist auf die Tatsache erwähnt, dass Applescript ist mit so etwas wie dieser Artikel für einige Beispiele für die Verwendung NSInvocation direkt.)
Andere Tipps
So hässlich wie es ist, zu printf(1)
rufend ist die gemeinsame Lösung.
Ein sauberer, wenn auch etwas komplexere Lösung ist Applescript Studio zu verwenden, die Sie in Objective-C-Objekte / Klassen aus Ihrem Applescript-Code mit dem call method
Syntax dokumentiert hier .
Damit würden Sie in der Lage sein, so etwas zu verwenden:
call method "stringWithFormat:" of class "NSString" with parameters {formatString, arguments}
Die Kehrseite der Medaille, natürlich, ist, dass Sie ein Applescript Studio App statt nur ein einfaches Skript zu schreiben schreiben müssen. Sie tun ein gutes Stück mehr Flexibilität im Allgemeinen mit Studio-Anwendungen bekommen, aber es ist so nicht alle zusammen ein schrecklicher Weg zu gehen.