Доступ к скрипту из локализованного меню

В английской (нелокализованной) версии программы разместить ссылку на скрипт в любом меню проблем не составляет. Кратко напомню простейшие способы.

Код для добавления пункта в верхнее меню:

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(){
	Содержимое скрипта, выполняемое при вызове из меню
}

localmenuen1

Аналогично добавляются пункты и в контекстные меню:

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(){
	//Содержимое скрипта, выполняемое при вызове из меню
}

localmenuen2

Список названий большинства используемых меню (таких, как $ID/RtMouseText) можно вывести в консоли ESTK простым скриптом:

for (var i=0; i<app.menus.length; i++){ 
	$.writeln(i+": "+app.findKeyStrings(app.menus.item(i).name)); 
	}

localmenuen3

Какие же проблемы возникают в случае с локализованной версией программы? В случае с верхним меню, по большому счёту, никаких. Достаточно добавить стандартный для этого случая функционал, изобретённый как раз для этой цели. А именно, «обернуть» каждое имя меню в метод app.translateKeyString():

var mnu = app.menus.item(app.translateKeyString("$ID/Main")).submenus.item(app.translateKeyString("$ID/kTablePanelTitle"));

localmenuru1

В некоторых случаях скрипт сработает даже если, особо не мудрствуя, просто вбить русский вариант меню:

var mnu = app.menus.item("$ID/Main").submenus.item("$ID/Текст");

localmenuru2

Не так всё просто с контекстным меню. Там не только не пройдёт номер с «напрямую» заданными русскими словами. translateKeyString также не сработает. Скрипт выдаст сообщение об ошибке и прекратит работу:

localmenuruerror

Решить проблему можно, обратившись к нужному меню по его индексу в коллекции. Здесь важно отметить, что индексы эти могут быть разными от версии к версии, и от локализации к локализации. Например, индекс контекстного меню таблиц в английской версии 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);

localmenuru3

И напоследок, для полноты информации (да и вдруг кто не знает), нужно, конечно, указать, что скрипты, которые содержат в себе код для добавления в меню, нужно складывать в папку c:\Program Files (x86)\Adobe\Adobe InDesign ***\Scripts\startup scripts. После размещения скрипта в этой папке надо перезапустить InDesign. И в случае внесения изменений в скрипты, лежащие в этой папке, программу надо перезапускать, чтобы эти изменения заработали.

Комментариев нет.

Оставить комментарий:

Имя*:
E-mail*:
Текст комментария*:
Код безопасности*:

expand other scripts list
наверх