Доступ к скрипту из локализованного меню
В английской (нелокализованной) версии программы разместить ссылку на скрипт в любом меню проблем не составляет. Кратко напомню простейшие способы.
Код для добавления пункта в верхнее меню:
var menuName = "Текст, который будет отображаться в меню"; var myMenuItem = app.scriptMenuActions.add(menuName); myMenuItem.addEventListener('onInvoke', function(){main();}); //Строкой ниже пункт меню будет добавлен в меню Type (аналогично добавляется в меню Object, Table и др.) var mnu = app.menus.item("$ID/Main").submenus.item("$ID/Type"); mnu.menuItems.add(myMenuItem); function main(){ Содержимое скрипта, выполняемое при вызове из меню }
Аналогично добавляются пункты и в контекстные меню:
var mnuName = "Текст, который будет отображаться в меню"; var mnuItem = app.scriptMenuActions.add(mnuName); mnuItem.addEventListener('onInvoke', function(){main();}); //В строке ниже выбирается контекстное меню для инструмента "Текст" var rMouseMnu = app.menus.item("$ID/RtMouseText"); rMouseMnu.menuSeparators.add(); //Этой строка добавляет разделитель между пунктами меню rMouseMnu.menuItems.add(mnuItem); function main(){ //Содержимое скрипта, выполняемое при вызове из меню }
Список названий большинства используемых меню (таких, как $ID/RtMouseText) можно вывести в консоли ESTK простым скриптом:
for (var i=0; i<app.menus.length; i++){ $.writeln(i+": "+app.findKeyStrings(app.menus.item(i).name)); }
Какие же проблемы возникают в случае с локализованной версией программы? В случае с верхним меню, по большому счёту, никаких. Достаточно добавить стандартный для этого случая функционал, изобретённый как раз для этой цели. А именно, «обернуть» каждое имя меню в метод app.translateKeyString():
var mnu = app.menus.item(app.translateKeyString("$ID/Main")).submenus.item(app.translateKeyString("$ID/kTablePanelTitle"));
В некоторых случаях скрипт сработает даже если, особо не мудрствуя, просто вбить русский вариант меню:
var mnu = app.menus.item("$ID/Main").submenus.item("$ID/Текст");
Не так всё просто с контекстным меню. Там не только не пройдёт номер с «напрямую» заданными русскими словами. translateKeyString также не сработает. Скрипт выдаст сообщение об ошибке и прекратит работу:
Решить проблему можно, обратившись к нужному меню по его индексу в коллекции. Здесь важно отметить, что индексы эти могут быть разными от версии к версии, и от локализации к локализации. Например, индекс контекстного меню таблиц в английской версии CS5 — 103, а в русской локализации CS6 — 16. Получить же полный список индексов для нужной версии можно уже упомянутым скриптом:
for (var i=0; i<app.menus.length; i++){ $.writeln(i+": "+app.findKeyStrings(app.menus.item(i).name)); }
Строка получения доступа к нужному меню, таким образом, приобретает следующий формат:
var rMouseMnu = app.menus[16];
А если предполагается использование скрипта как в русской, так и в английской версиях, тогда можно позволить скрипту выбрать нужный вариант с помощью метода localize:
var cm = localize({en:"var rMouseMnu = app.menus[103]", ru:"var rMouseMnu = app.menus[16]"}); app.doScript(cm);
Допустимо также для английской локализации указать имя меню, а для русской — его индекс:
var cm = localize({en:"var mnu = app.menus.item(\"$ID/RtMouseTable\");",ru:"var mnu = app.menus[16]"}); app.doScript(cm);
В последнем варианте следует обратить внимание на необходимость использования обратных слешей при использованиии кавычек в строковой переменной.
Полный рабочий вариант включения в контекстное меню нового пункта будет выглядеть так:
var menuName = "Новый пункт табличного меню"; var myMenuItem = app.scriptMenuActions.add(menuName); myMenuItem.addEventListener('onInvoke', function(){main();}); var cm = localize({en:"var rMouseMnu = app.menus[103]",ru:"var rMouseMnu = app.menus[16]"}); app.doScript(cm); rMouseMnu.menuSeparators.add(); rMouseMnu.menuItems.add(myMenuItem);
И напоследок, для полноты информации (да и вдруг кто не знает), нужно, конечно, указать, что скрипты, которые содержат в себе код для добавления в меню, нужно складывать в папку c:\Program Files (x86)\Adobe\Adobe InDesign ***\Scripts\startup scripts. После размещения скрипта в этой папке надо перезапустить InDesign. И в случае внесения изменений в скрипты, лежащие в этой папке, программу надо перезапускать, чтобы эти изменения заработали.
Комментариев нет.
Ещё статьи:
- Быстрое форматирование
- Быстрое вращение разворота
- Перекрёстная ссылка в два клика
- Экспорт из InDesign в html: тегируем символьные стили
- Экспорт из InDesign в html-2: тегируем абзацы
- Экспорт из InDesign в html-3: таблицы
- Скрипт не появился в меню, или Ещё раз о локализации
- Экспорт из InDesign в html-4: работа с изображениями и гиперссылками
- Локализованное меню: приключения продолжаются
- Как организовать доступ к списку стилей через Пользовательский интерфейс