虽然我已经成功地编写了一个功能脚本来更改选择层的词典语言,但它还不完全符合我的需求。
目前我正在检索所选层的索引,使用它们获取层名称——这是问题所在——然后根据自定义对话框中选择的选项来更改它们的语言。
使用层名称是一种非常笨拙的解决方案,我需要精度,我需要能够根据层ID或索引来更改语言。我的脚本不仅容易出现名称冲突,而且我也不知道选择的层将在哪里,是在文档的根部还是在5个层组堆栈中。
以下是我的当前代码:
主函数
function main() {
// Create window with language selection and retrieve selected value
var lang = createWindow();
// Retrieve selected layers
var selectedLayers = getSelectedLayersIdx();
// Look at each entry and change language when possible
for(var a in selectedLayers){
try {
setLangByIndex(Number( selectedLayers[a]), lang );
} catch(err) { }
}
}
(createWindow返回一个lang值,跳过该内容)
迈克的get Idx
function getSelectedLayersIdx(){
var selectedLayers = new Array;
var ref = new ActionReference();
ref.putEnumerated( charIDToTypeID('Dcmn'), charIDToTypeID('Ordn'), charIDToTypeID('Trgt') );
var desc = executeActionGet(ref);
if( desc.hasKey( stringIDToTypeID( 'targetLayers' ) ) ) {
desc = desc.getList( stringIDToTypeID( 'targetLayers' ));
var c = desc.count
var selectedLayers = new Array();
for(var i=0;i<c;i++) {
try{
activeDocument.backgroundLayer;
selectedLayers.push( desc.getReference( i ).getIndex() );
} catch(e) {
selectedLayers.push( desc.getReference( i ).getIndex()+1 );
}
}
} else {
var ref = new ActionReference();
ref.putProperty( charIDToTypeID('Prpr') , charIDToTypeID( 'ItmI' ));
ref.putEnumerated( charIDToTypeID('Lyr '), charIDToTypeID('Ordn'), charIDToTypeID('Trgt') );
try {
activeDocument.backgroundLayer;
selectedLayers.push( executeActionGet(ref).getInteger(charIDToTypeID( 'ItmI' ))-1);
} catch(e) {
selectedLayers.push( executeActionGet(ref).getInteger(charIDToTypeID( 'ItmI' )));
}
}
return selectedLayers;
}
设置语言的功能
function setLangByIndex(idx, lang){
ref = new ActionReference();
ref.putProperty( charIDToTypeID("Prpr") , charIDToTypeID( "Nm " ));
ref.putIndex( charIDToTypeID( "Lyr " ), idx );
var name = executeActionGet(ref).getString(charIDToTypeID( "Nm " ));
var el = activeDocument.layers.getByName( name );
// Temp quick block; MUST UPDATE IN CASE OF NEW LANGUAGES
if (lang == 'pt_br' )
el.textItem.language = Language.BRAZILLIANPORTUGUESE;
else if (lang == 'en_us' )
el.textItem.language = Language.ENGLISHUSA;
else
el.textItem.language = Language.ENGLISHUK;
}
我尝试的低效解决方法:
- 使用Adobe的脚本监听器和executeAction来更改语言,但无法使其正常工作。语言部分位于 ~4 个堆叠描述符(和一个列表!)中。我迷失了方向并不断出现错误8800。
- 试图通过使用 idx 来获取对象引用。失败了。