Я предполагаю, что вы входили в меню с помощью сценариев пользовательского интерфейса с помощью System Events
, который, если я правильно помню, содержит класс UI Element
с именем toolbar
. Вы можете попробовать и посмотреть, содержит ли переднее окно в Pages
элемент toolbar
. Если это так, то, вероятно, он находится на верхнем уровне иерархии.
tell application id "com.apple.systemevents" to ¬
tell the front window of the process "Pages" to ¬
set toolbarIsVisible to toolbar 1 exists
Если этот фрагмент является жизнеспособным, он назначит либо true
, либо false
переменной toolbarIsVisible
. Способ проверить, является ли этот фрагмент жизнеспособным, - запустить его, когда панель инструментов является видимой , которая должна вернуть true
.
Общие вопросы локализации
Имена приложений (и процессов) зависят от локали, поэтому приведенный выше фрагмент требует небольшой адаптации, чтобы полностью интернационализироваться, в случае, если Pages
будет иметь другое имя в других странах. Вот грубая разбивка различных методов, которые можно использовать, чтобы сделать этот язык более удобным:
Поиск процесса с использованием свойства bundle identifier
Идентификаторы пакетов - это еще один способ идентификации приложений, и этиявляются локаль- независимыми строками, которые зарегистрированы в системе и поэтому будут уникальными для одного приложения (тогда как несколько приложений могут иметь одно и то же имя).
process
для вашегона запущенный экземпляр Pages
можно ссылаться по его идентификатору пакета ("com.apple.Pages"
), например:
tell application id "com.apple.systemevents" to ¬
tell the first process whose bundle identifier ¬
is "com.apple.Pages" to ...
Ключевое слово whose
выполняет эффективный поиск по всем processes
, в каждом случае ищет значение свойства с именем bundle identifier
для каждого process
, возвращая первый соответствующий объект process
, с которым он сталкивается. В нашем случае это будет process
, на который вы обычно ссылаетесь с помощью process "Pages"
, но теперь он получил путь, который не поддерживает какой-либо конкретный язык.
Используйте идентификатор пакета application
object
Немного более прямой метод будет ссылаться на application "Pages"
, опять же, используя идентификатор пакета приложения, "com.apple.Pages"
. Вы делаете это, вставляя ключевое слово id
после application
, за которым следует его идентификатор пакета:
application id "com.apple.Pages"
--> application "Pages"
Поскольку каждое приложение имеет свойство name
, которое AppleScript может извлечь,затем:
name of application id "com.apple.Pages"
--> "Pages"
возвращает название приложения, которое в англоязычной системе будет "Pages"
, а в любой другой системе будет локализованная версия этого. Затем его можно использовать для ссылки на process
по имени:
tell application id "com.apple.systemevents" to tell the ¬
process named (application id "com.apple.Pages") to ...
Локализация строк
Вероятно, лучший и наиболее рекомендуемый способ - поиск локализованной строки из файла .strings
какие пакеты приложений хранятся в подпапках их папок Resources
, названных по локали. Это набор пар ключ-значение, которые содержат переводы для меток и сообщений, используемых приложением, включая имена элементов меню, имена приложений, диалоговые сообщения и т. Д.
AppleScript может считывать значения для данного ключаиспользуя команду localized string
. Конкретный файл .strings
, который нас интересует, называется "InfoPlist.strings"
(но мы пропускаем расширение при передаче его этой команде). Итак:
get the localized string "CFBundleName" from table "InfoPlist" in bundle application id "com.apple.Preview"
В моей системе, и я предполагаю вашу, это, конечно, просто вернет "Preview"
. В немецкоязычной системе, однако, он возвращает "Vorschau"
.
Собрав все это вместе, самый первый фрагмент вверху этого скрипта будет интернационализирован так:
set CFBundleName to the localized string of "CFBundleName" from table ¬
"InfoPlist" in bundle application id "com.apple.Pages"
tell application id "com.apple.systemevents" to tell ¬
the front window of the process named CFBundleName ¬
to set toolbarIsVisible to toolbar 1 exists