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

Popular posts from this blog

javascript - Bootstrap Popover: iOS Safari strange behaviour -

Website Login Issue developed in magento -

Can the constants be defined inside a model file of a framework in PHP? -