Photoshop script to translate text layers based on language JSON files, then export project to PNG images for each language. Save a lot of time!
Usage: generate screenshots files for your app (ex: Googleplay, etc).
One project is converted to X languages screenshots. With the seconde script, you can also convert each group layer as a separate files (for multi-screenshots project).
Getting started (one screenshot by project)
- Open test photoshop file
./test/project-to-screenshot.psd
- Execute
text-project-translate.bat
- Get your results from your
Documents
folder
NOTE: Edit output
value in text-project-translate.jsx
with you want to change the target folder
NOTE: Edit project-to-screenshot-fr.json
or project-to-screenshot-en.json
content to change translation text.
NOTE: Edit same keys in Photoshop projet AND *.json
files.
NOTE: Use ‘Unicode’ type for universal support (asian and russian fonts).
Example – Test with 1 Screenshot (project)
text-project-translate.bat
"C:\Program Files (x86)\Photoshop\Photoshop.exe" c:\Users\damien\git\photoshop-script-text-translator\text-project-translate.jsx
text-project-translate.jsx
/**
* Photoshop script to translate text layers based on lang
* JSON file, then export project to PNG images for each
* language.
*
* Usage: generate screenshots files for your app (ex:
* Googleplay, etc).
*
* @param langs array of languages, linked to translation
* files named like '-.json'
* @param langFallback language to use when json file does
* not exist.
* @param (input) Current Photoshop project
* @param (output) Current Photoshop project
*/
var langs = ["en", "ja", "ko", "zh-TW", "de", "fr", "pt", "es", "it", "ru", "hi"];
var langFallback = "en";
// get the path of currently opened photoshop document
var output = app.activeDocument.path;
var input = app.activeDocument.path;
/* UTILS *************************************************** */
// Because Photoshop doesn't
function JSON_parse(fileContent) {
/// Extend script doesn't support JSON. Are you fucking kidding?
// obj = JSON.parse(file_to_read .read());
// Worry not. We got potentially harmful, yet useful, `eval` function.
var jsonFile = eval("(" + fileContent + ")");
return jsonFile;
}
function FILE_toString(fileToRead) {
if (fileToRead === false) {
alert("File read error:" + jsonFilePath);
}
fileToRead.open('r');
var fileContent = fileToRead.read();
fileToRead.close();
return fileContent;
}
function loadLangFile(langKey) {
}
/* EXECUTION *************************************************** */
//Get the currently opened Photoshop document
var doc = app.activeDocument;
// get filename without extension
var filename = doc.name;
filename = filename.slice(0, filename.lastIndexOf(".")); //just add this line to the construction.
// execute for eqch languages
for (var t = 0; t < langs.length; t++) {
var currentLang = langs[t];
var fileContent;
// Use absolute path for the JSON file.
var langFilePath = input + "/" + filename + "-" + currentLang + ".json";
var fileToRead = File(langFilePath);
fileContent = FILE_toString(fileToRead);
// Use default language if file not found!
if (fileContent === "") {
var langFilePath2 = input + "/" + filename + "-" + langFallback + ".json";
var fileToRead2 = File(langFilePath2);
fileContent = FILE_toString(fileToRead2);
}
var messages = JSON_parse(fileContent);
// Translate each text layers and sub layers
for (var i = 0; i <span id="mce_SELREST_start" style="overflow:hidden;line-height:0;"></span>< doc.layers.length; i++) {
var currLayer = doc.layers[i];
// check layer is visible
if (currLayer.visible === false) {
break;
}
// check layer is text
if (currLayer.kind != LayerKind.TEXT) {
break;
}
// get translation
var translation = messages[currLayer.name];
// check translation founded
if (!translation) {
break;
}
// set new text
currLayer.textItem.contents = translation;
}
// save
var file = new File(output + "/" + filename + "-" + currentLang + ".png");
var saveOptions = new PNGSaveOptions();
doc.saveAs(file, saveOptions, true, Extension.LOWERCASE);
}
Getting started (multiple screenshot layers by project)
- Open test photoshop file
./test/layers-to-screenshots.psd
- Execute
text-layers-translate.bat
- Get your results from your
Documents
folder
Example – Test with 2 Screenshot (group)
text-group-translate.bat
"C:\Program Files (x86)\Photoshop\Photoshop.exe" c:\Users\damien\git\photoshop-script-text-translator\text-groups-translate.jsx
text-groups-translate.jsx
/**
* Photoshop script to translate text layers based on lang
* JSON file, then export project to PNG images for each
* language.
*
* Usage: generate screenshots files for your app (ex:
* Googleplay, etc).
*
* @param langs array of languages, linked to translation
* files named like '-.json'
* @param langFallback language to use when json file does
* not exist.
* @param (input) Current Photoshop project
* @param (output) Current Photoshop project
*/
var langs = ["en", "ja", "ko", "zh-TW", "de", "fr", "pt", "es", "it", "ru", "hi"];
var langFallback = "en";
// get the path of currently opened photoshop document
var inputPath = app.activeDocument.path;
var outputPath = app.activeDocument.path;
/* UTILS *************************************************** */
// Because Photoshop doesn't
function JSON_parse(fileContent) {
/// Extend script doesn't support JSON. Are you fucking kidding?
// obj = JSON.parse(file_to_read .read());
// Worry not. We got potentially harmful, yet useful, `eval` function.
var jsonFile = eval("(" + fileContent + ")");
return jsonFile;
}
function FILE_toString(fileToRead) {
if (fileToRead === false) {
alert("File read error:" + jsonFilePath);
}
fileToRead.open('r');
var fileContent = fileToRead.read();
fileToRead.close();
return fileContent;
}
/* EXECUTION *************************************************** */
//Get the currently opened Photoshop document
var doc = app.activeDocument;
// get filename without extension
var filename = doc.name;
filename = filename.slice(0, filename.lastIndexOf(".")); //just add this line to the construction.
// execute for each group
for (var y = 0; y < doc.layers.length; y++) {
var currentGroup = doc.layers[y];
// check layer is visible
if (currentGroup.kind != undefined) {
break;
}
// Pass sub layers to core script
var groupLayers = currentGroup.layers;
// hide others groups
for (var t = 0; t < doc.layers.length; t++)
doc.layers[t].visible = false;
currentGroup.visible = true;
// execute for each languages
for (var t = 0; t < langs.length; t++) {
var currentLang = langs[t];
var fileContent;
// Use absolute path for the JSON file.
var langFilePath = inputPath + "/" + filename + "-" + currentLang + ".json";
var fileToRead = File(langFilePath);
fileContent = FILE_toString(fileToRead);
// Use default language if file not found!
if (fileContent === "") {
var langFilePath2 = inputPath + "/" + filename + "-" + langFallback + ".json";
var fileToRead2 = File(langFilePath2);
fileContent = FILE_toString(fileToRead2);
}
var messages = JSON_parse(fileContent);
// Translate each text layers and sub layers
for (var i = 0; i <span id="mce_SELREST_start" style="overflow:hidden;line-height:0;"></span>< groupLayers.length; i++) {
var currLayer = groupLayers[i];
// check layer is visible
if (currLayer.visible === false) {
break;
}
// check layer is text
if (currLayer.kind != LayerKind.TEXT) {
break;
}
// get translation
var translation = messages[currLayer.name];
// check translation founded
if (!translation) {
break;
}
// set new text
currLayer.textItem.contents = translation;
}
// save
// TODO: create outputPath
var file = new File(outputPath + "/" + filename + "-" + currentLang + "-" + (y + 1) + ".png");
var saveOptions = new PNGSaveOptions();
doc.saveAs(file, saveOptions, true, Extension.LOWERCASE);
}
}
Example – External Project
text-group-translate.bat
"C:\Program Files (x86)\Photoshop\Photoshop.exe" c:\Users\damien\git\photoshop-script-text-translator\text-groups-translate.jsx
References
Source