2008-09-15 4 views
1

Lorsqu'un script est enregistré en tant que groupe, il peut utiliser la commande localized string pour rechercher la chaîne appropriée, par ex. au Contents/Resources/English.lproj/Localizable.strings. S'il s'agit d'une chaîne de format, quel est le meilleur moyen de remplir les espaces réservés? En d'autres termes, quel est l'équivalent AppleScript de +[NSString stringWithFormat:]?Quel est le meilleur moyen de formater une chaîne localisée dans AppleScript?

Une idée que j'avais était d'utiliser do shell script avec printf(1). Y a-t-il un meilleur moyen?

Répondre

1

Since OS X 10.10, il est possible que n'importe quel script AppleScript utilise Objective-C. Il existe plusieurs façons d'appeler des méthodes Objective-C à partir d'AppleScript, comme indiqué dans this translation guide. Un développeur Objective-C comme moi gravitent vers cette syntaxe, qui interpole les paramètres de la méthode avec leurs valeurs:

use framework "Foundation" 

tell the current application's NSWorkspace's sharedWorkspace to openFile:"/Users/me/Desktop/filter.png" withApplication:"Preview" 

Résultat:

true 

+[NSString stringWithFormat:] est une affaire délicate. Il prend comme premier paramètre une liste vararg, vous avez donc besoin d'un moyen de forcer à la fois la chaîne de format et ses arguments dans le même paramètre de méthode. Les résultats suivants dans une erreur, car AppleScript finit par passer un NSArray dans le paramètre qui attend, sur le plan conceptuel, un tableau C de NSStrings:

use framework "Foundation" 

the current application's NSString's stringWithFormat:{"%lu documents", 8} 

Résultat:

error "-[__NSArrayM length]: unrecognized selector sent to instance 0x7fd8d59f3bf0" number -10000 

Au lieu de cela, vous devez utilisez une autre syntaxe qui ressemble plus à un appel de gestionnaire AppleScript qu'à un message Objective-C. Vous devez également exercer des pressions sur la valeur de retour (un objet NSString) dans un text:

use framework "Foundation" 

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

Résultat:

"2087 documents" 

La syntaxe « avec des paramètres » qui @nlanza mentionne des points au fait que AppleScript est en utilisant quelque chose de semblable à NSInvocation sous le capot. En Objective-C, NSInvocation vous permet d'envoyer un message à un objet, avec un tableau de valeurs de paramètres, sans nécessairement faire correspondre chaque valeur à un paramètre particulier. (Voir this article pour des exemples d'utilisation de NSInvocation directement.)

+0

Bonne réponse. Merci. –

0

Aussi laid que cela puisse paraître, l'appel à printf(1) est la solution courante. Une solution plus simple, quoique plus complexe, consiste à utiliser AppleScript Studio, qui vous permet d'appeler des objets/classes Objective-C à partir de votre code AppleScript avec la syntaxe documentée here.

Avec cela, vous seriez en mesure d'utiliser quelque chose comme ceci:

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

L'inconvénient de cela, bien sûr, est que vous devez écrire une application AppleScript Studio au lieu d'écrire juste un script simple . Cependant, vous bénéficiez d'un peu plus de flexibilité en général avec les applications Studio, ce qui fait que tout n'est pas terrible.

+0

Malheureusement, il existe des cas où un script est requis plutôt qu'une application, et AppleScript Studio n'est donc pas une option. –

+0

AppleScript Studio est maintenant obsolète. –

+0

[Depuis OS X 10.10] (https://developer.apple.com/library/content/releasenotes/AppleScript/RN-AppleScript/RN-10_10/RN-10_10.html), il est possible d'utiliser n'importe quel script AppleScript Objectif c. Voir [ma réponse] (http://stackoverflow.com/a/41405599/4585461) pour une alternative qui fonctionne dans l'éditeur de script. –

Questions connexes