Знайте, видна ли панель инструментов на страницах Apple - PullRequest
0 голосов
/ 25 октября 2019

AppleScript и Apple Pages.

Можно ли узнать, видна ли панель инструментов?

Что я пробовал. Я могу получить доступ к Меню / Вид / Показать панель инструментов или Скрыть панель инструментов. Но проблема в том, что это зависит от языка, который пользователь использует в операционной системе. Итак, мне нужно решение, которое могло бы работать на любом языке.

1 Ответ

0 голосов
/ 25 октября 2019

Я предполагаю, что вы входили в меню с помощью сценариев пользовательского интерфейса с помощью 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...