Qual é a melhor maneira de formatar uma string localizada em AppleScript?

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

  •  09-06-2019
  •  | 
  •  

Pergunta

Quando um script é salvo como um pacote, ele pode usar o localized string comando para encontrar a string apropriada, por ex.em Contents/Resources/English.lproj/Localizable.strings.Se esta for uma string de formato, qual é a melhor maneira de preencher os espaços reservados?Em outras palavras, qual é o equivalente AppleScript de +[NSString stringWithFormat:]?

Uma ideia que tive foi usar do shell script com printf(1).Existe uma maneira melhor?

Foi útil?

Solução

Desde OS X 10.10, é possível que qualquer script AppleScript use Objective-C.Existem algumas maneiras de chamar métodos Objective-C no AppleScript, conforme detalhado em este guia de tradução.Um desenvolvedor de Objective-C como eu gravitaria em torno desta sintaxe, que interpola os parâmetros do método com seus valores:

use framework "Foundation"

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

Resultado:

true

+[NSString stringWithFormat:] é um caso complicado.É necessária uma lista vararg como seu primeiro parâmetro, então você precisa de alguma maneira de forçar a string de formato e seus argumentos no mesmo parâmetro do método.O seguinte resulta em um erro, porque o AppleScript acaba passando um único NSArray para o parâmetro que espera, conceitualmente, um array C de NSStrings:

use framework "Foundation"

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

Resultado:

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

Em vez disso, você deve usar uma sintaxe alternativa que se pareça mais com uma chamada de manipulador AppleScript do que com uma mensagem Objective-C.Você também precisa forçar o valor de retorno (um objeto NSString) em um text:

use framework "Foundation"

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

Resultado:

"2087 documents"

A sintaxe “com parâmetros” mencionada por @nlanza aponta para o fato de que o AppleScript está usando algo semelhante a NSInvocação sob o capô.No Objective-C, NSInvocation permite enviar uma mensagem para um objeto, junto com uma matriz de valores de parâmetros, sem necessariamente corresponder cada valor a um parâmetro específico.(Ver Este artigo para obter alguns exemplos de uso direto de NSInvocation.)

Outras dicas

Por mais feio que seja, chamando printf(1) é a solução comum.

Uma solução mais limpa, embora um pouco mais complexa, é usar o AppleScript Studio, que permite chamar objetos/classes Objective-C a partir do seu código AppleScript com o call method sintaxe documentada aqui.

Com isso, você seria capaz de usar algo assim:

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

A desvantagem disso, claro, é que você precisa escrever um aplicativo AppleScript Studio em vez de apenas escrever um script simples.No entanto, você obtém um pouco mais de flexibilidade em geral com os aplicativos Studio, portanto, nem tudo é um caminho terrível a seguir.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top