left menu mob button

Новое на канале:

Держи время! Стереги его любой час, любую минуту. Без надзора оно ускользнет, словно ящерица. Освещай каждый миг честным, достойным свершением! Дай ему вес, значение, свет. (Т. Манн)

только нужной информации

(серия статей):

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

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

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

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*:
Текст комментария*:
Код безопасности*: