Quel est le meilleur moyen de formater une chaîne localisée dans AppleScript?

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

  •  09-06-2019
  •  | 
  •  

Question

Lorsqu'un script est enregistré en tant qu'ensemble, il peut utiliser la commande chaîne localisée pour rechercher la chaîne appropriée, par exemple. dans Sommaire / Ressources / 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:] ?

L’une de mes idées était d’utiliser un script shell avec printf (1) . Y a-t-il un meilleur moyen?

Était-ce utile?

La solution

Depuis OS X 10.10 , il était possible pour n'importe quel script AppleScript d'utiliser Objective-C. Il existe plusieurs façons d'appeler des méthodes Objective-C à partir d'AppleScript, comme indiqué dans ce guide de traduction . Un développeur Objective-C comme moi s’engagerait dans 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 un cas délicat. Il prend une liste vararg en tant que premier paramètre. Vous avez donc besoin d'un moyen de forcer la chaîne de format et ses arguments dans le même paramètre de méthode. Ce qui suit entraîne une erreur, car AppleScript finit par transmettre un seul NSArray au paramètre qui attend, conceptuellement, 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 utiliser une syntaxe alternative qui ressemble davantage à un appel de gestionnaire AppleScript qu’à un message Objective-C. Vous devez également forcer la valeur de retour (un objet NSString) dans un texte :

use framework "Foundation"

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

Résultat:

"2087 documents"

Le & # 8220; avec les paramètres & # 8221; La syntaxe que @nlanza mentionne souligne le fait qu'AppleScript utilise quelque chose de similaire à NSInvocation sous la hotte. Dans Objective-C, NSInvocation vous permet d’envoyer un message à un objet, ainsi qu’un tableau de valeurs de paramètre, sans nécessairement faire correspondre chaque valeur à un paramètre particulier. (Consultez cet article pour des exemples d'utilisation directe de NSInvocation.)

Autres conseils

Aussi moche qu’il soit, appeler la printf (1) est la solution courante.

Une solution plus propre, mais un peu plus complexe, consiste à utiliser AppleScript Studio, qui vous permet d’appeler des objets / classes Objective-C à partir de votre code AppleScript avec la syntaxe call method documentée ici .

Avec cela, vous pourrez utiliser quelque chose comme ceci:

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

L’inconvénient, bien sûr, est que vous devez écrire une application AppleScript Studio au lieu d’écrire un simple script. Cependant, les applications Studio offrent en général une plus grande flexibilité, de sorte que la route à parcourir n’est pas terrible.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top