2 Stimmen

Wie formatiert man am besten eine lokalisierte Zeichenkette in AppleScript?

Wenn ein Skript als Bundle gespeichert wird, kann es die localized string Befehl, um die entsprechende Zeichenkette zu finden, z. B. in Contents/Resources/English.lproj/Localizable.strings . Wenn es sich um eine Formatzeichenfolge handelt, wie lassen sich die Platzhalter am besten ausfüllen? Mit anderen Worten, was ist die AppleScript-Entsprechung von +[NSString stringWithFormat:] ?

Eine Idee, die ich hatte, war die Verwendung von do shell script con printf(1) . Gibt es einen besseren Weg?

2voto

Minh Nguyễn Punkte 801

Seit OS X 10.10 war es für jedes AppleScript-Skript möglich, Objective-C zu verwenden. Es gibt ein paar Möglichkeiten, Objective-C-Methoden aus AppleScript heraus aufzurufen, wie in diese Übersetzungshilfe . Ein Objective-C-Entwickler wie ich würde zu dieser Syntax tendieren, die die Parameter der Methode 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 kniffliger Fall. Sie nimmt eine vararg-Liste als ersten Parameter an, so dass Sie eine Möglichkeit benötigen, sowohl die Formatzeichenkette als auch ihre Argumente in denselben Methodenparameter zu zwingen. Das Folgende führt zu einem Fehler, weil AppleScript am Ende ein einzelnes NSArray in den Parameter übergibt, der konzeptionell ein 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. Außerdem müssen Sie den Rückgabewert (ein NSString-Objekt) in eine text :

use framework "Foundation"

the current application's NSString's stringWithFormat_("%lu documents", 8) as text

Ergebnis:

"2087 documents"

Die von @nlanza erwähnte Syntax "mit Parametern" deutet darauf hin, dass AppleScript etwas verwendet, das mit NSInvocation unter der Haube. In Objective-C können Sie mit NSInvocation eine Nachricht zusammen mit einem Array von Parameterwerten an ein Objekt senden, ohne dass jeder Wert unbedingt mit einem bestimmten Parameter übereinstimmen muss. (Siehe dieser Artikel für einige Beispiele zur direkten Verwendung von NSInvocation).

0voto

nlanza Punkte 104

So hässlich es auch sein mag, der Ruf nach printf(1) ist die gängige Lösung.

Eine sauberere, wenn auch etwas komplexere Lösung ist die Verwendung von AppleScript Studio, mit dem Sie Objective-C-Objekte/Klassen von Ihrem AppleScript-Code aus mit der Funktion call method Syntax dokumentiert ici .

Damit könnten Sie so etwas wie das hier verwenden:

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

Der Nachteil dabei ist natürlich, dass Sie eine AppleScript Studio Anwendung schreiben müssen, anstatt nur ein einfaches Skript zu schreiben. Mit Studio-Apps erhalten Sie jedoch generell ein gutes Stück mehr Flexibilität, so dass es insgesamt kein schlechter Weg ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X