javascript - Changing selected text layers language with photoshop script -
though managed put functional script change dictionary language of selected layers together, it's not quite need yet.
i'm retrieving index of selected layers, using them layer names—it's problematic part—then working magic change language based on option chosen in custom dialog box display.
the use of layers names half-assed solution, need precision, need able change language based on layer id or index. not script prone names conflicts have no idea of selected layers be, if on root of document or inside 5 groups stack.
here current code:
the main function
function main() { // create window language selection , retrieve selected value var lang = createwindow(); // retrieve selected layers var selectedlayers = getselectedlayersidx(); // @ each entry , change language when possible for(var in selectedlayers){ try { setlangbyindex(number( selectedlayers[a]), lang ); } catch(err) { } } } (createwindow returns lang value, skipping that)
mike's 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( ).getindex() ); } catch(e) { selectedlayers.push( desc.getreference( ).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; } the function sets language
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; } workarounds inefficiently tried:
- use adobe's script listener change language executeaction, couldn't make work. language part inside ~4 stacked descriptors (and list!). got lost , kept getting errors 8800.
- figure out how obtain object ref using idx. failed miserably.
after noticed annoying glitches related paragraph styles (the ones can define default text on ps, not js object) gave on being stubborn , stopped avoiding doing new loop through indexes array reselect layers when done.
/* * based in mike hale's "getselectedlayersidx" script , adobe's scripting listener dump. based panel on davide barranca's code: http://www.davidebarranca.com/2012/10/scriptui-window-in-photoshop-palette-vs-dialog/ useful resources: photoshop char list: http://www.pcpix.com/photoshop/char.htm actiondescriptor methods: http://jongware.mit.edu/pscs5js_html/psjscs5/pc_actiondescriptor.html textitem methods: http://jongware.mit.edu/pscs5js_html/psjscs5/pc_textitem.html can fish language codes here: http://wingp.googlecode.com/svn/photogp/photoshopapi/photoshop/pistringterminology.h */ /* ______________________________ script ______________________________ */ var scriptalert = "language change says"; // must update if want change available languages // available languages, { text displayed on dialog window : codename }. see notes above more language codes var langs = {}; langs['português (brasil)'] = 'brazilianportugueselanguage'; langs['english (uk)'] = 'ukenglishlanguage'; langs['english (usa)'] = 'englishlanguage'; if(app.documents.length>0){ // script executed if active document exists. var imgname = activedocument.name; var extreme= imgname.substr(imgname.length - 5, 5); var dot = extreme.lastindexof("."); if(dot == -1) { // checks if active document saved or not. alert("please, save document!", scriptalert, false); } else { main(); // if active document saved, go ahead! } } function createwindow() { // creates panel asking input var isdone, win, windowresource, radio_group, cancel, rb, i; //sentinel variable isdone = false; cancel = false; // build dialog radio buttons = 0; for( var k in langs ) { if( i==0 ) rb = "rb"+i+": radiobutton { text: '"+k+"', value: 1 }, \ "; else rb += "rb"+i+": radiobutton { text: '"+k+"' }, \ "; i++; } windowresource = "palette { \ orientation: 'column', \ alignchildren: ['fill', 'top'], \ preferredsize:[300, 130], \ text: 'change spell check language', \ margins:15, \ \ optpanel: panel { \ orientation: 'row', \ alignchildren: 'left', \ margins:15, \ text: ' select desired dictionary language select text ', \ "+ rb + " \ } \ \ bottomgroup: group{ \ cancelbutton: button { text: 'cancel', properties:{name:'cancel'}, size: [120,24], alignment:['right', 'center'] }, \ applybutton: button { text: 'ok', properties:{name:'ok'}, size: [120,24], alignment:['right', 'center'], active: true }, \ }\ }"; win = new window(windowresource); radio_group = win.optpanel; // set group // match options language function selected_rbutton (rbuttons) { (var = 0; < rbuttons.children.length; i++) if (rbuttons.children[i].value == true) return langs[rbuttons.children[i].text]; } win.bottomgroup.cancelbutton.onclick = function() { win.close(); return cancel = true; }; // button listeners win.bottomgroup.applybutton.onclick = function() { return isdone = true; }; // don't forget one! win.onclose = function() { return cancel = true; }; win.addeventlistener("keydown", function (k) { if (k.keyname == 'enter') return isdone = true; }); win.show(); while (isdone === false) { try { app.refresh(); } catch(err) { // esc cancels without errors return false; } } return cancel ? false : selected_rbutton (radio_group); // return value, or false if cancelled } function getselectedlayersidx(){ // gets array of indexes of selected layers 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( ).getindex() ); } catch(e) { selectedlayers.push( desc.getreference( ).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 selectlayerbyindex( selectedlayers, add ){ // selects layers index. if fed array + true add, selects them, otherwise provide single value selects single layer if (typeof(add)==='undefined') add = false; if ( add ) // if add it's array for(var in selectedlayers){ var desc = new actiondescriptor(); var ref = new actionreference(); ref.putindex( charidtotypeid( "lyr " ), number(selectedlayers[a]) ); desc.putreference( charidtotypeid( "null" ), ref ); desc.putenumerated( stringidtotypeid( "selectionmodifier" ), stringidtotypeid( "selectionmodifiertype" ), stringidtotypeid( "addtoselection" ) ); var idmkvs = charidtotypeid( "mkvs" ); desc.putboolean( charidtotypeid( "mkvs" ), false ); executeaction( charidtotypeid( "slct" ), desc, dialogmodes.no ); } else // else need make layer active, it's number { var desc = new actiondescriptor(); var ref = new actionreference(); var idlyr = charidtotypeid( "lyr " ); ref.putindex( charidtotypeid( "lyr " ), selectedlayers ); desc.putreference( charidtotypeid( "null" ), ref ); desc.putboolean( charidtotypeid( "mkvs" ), false ); executeaction( charidtotypeid( "slct" ), desc, dialogmodes.no ); } } function setlangbyindex( idx, lang ){ // sets dictionary language text layer based on index // make layer active selectlayerbyindex( idx ); // , tiny override var textobj = new actiondescriptor(); var target = new actionreference(); target.putproperty( charidtotypeid( "prpr" ), charidtotypeid( "txts" ) ); // desired property: text style target.putenumerated( charidtotypeid( "txlr" ), charidtotypeid( "ordn" ), charidtotypeid( "trgt" ) ); // active layer textobj.putreference( charidtotypeid( "null" ), target ); var textstyle = new actiondescriptor(); textstyle.putinteger( stringidtotypeid( "textoverridefeaturename" ), 808466225 ); textstyle.putinteger( stringidtotypeid( "typestyleoperationtype" ), 3 ); textstyle.putenumerated( stringidtotypeid( "textlanguage" ), stringidtotypeid( "textlanguage" ), stringidtotypeid( lang ) ); textobj.putobject( charidtotypeid( "t " ), charidtotypeid( "txts" ), textstyle ); // (end); text style, desc. executeaction( charidtotypeid( "setd" ), textobj, dialogmodes.no ); // execute } //////////////////////////////////// // main function function main() { // create window language selection , retrieve selected value var lang = createwindow(); if ( !lang ) // if cancelled please stop return; // retrieve selected layers var selectedlayers = getselectedlayersidx(); // @ each entry , change language when possible; otherwise skip next item for(var k in selectedlayers){ try { setlangbyindex(number(selectedlayers[k]), lang); } catch(err) { continue; } } selectlayerbyindex( selectedlayers, true ); }
Comments
Post a Comment