Socket
Socket
Sign inDemoInstall

cordova-plugin-localization-strings

Package Overview
Dependencies
43
Maintainers
2
Versions
28
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 5.0.0 to 5.0.2

.prettierrc

2

package.json
{
"name": "cordova-plugin-localization-strings",
"version": "5.0.0",
"version": "5.0.2",
"description": "Cordova Plugin for handling localization strings on InfoPlist.strings and Localizable.strings on iOS, strings.xml on Android",

@@ -5,0 +5,0 @@ "keywords": [

@@ -1,151 +0,122 @@

var fs = require('fs');
var path = require('path');
var glob = require('glob').globSync;
var mkdirp = require('mkdirp').mkdirp;
var _ = require('underscore');
var xml2js = require('xml2js');
var fs = require("fs");
var path = require("path");
var mkdirp = require("mkdirp").mkdirp;
var _ = require("underscore");
var xml2js = require("xml2js");
var utils = require("./utils");
function fileExists(path) {
try {
return fs.statSync(path).isFile();
} catch (e) {
return false;
}
try {
return fs.statSync(path).isFile();
} catch (e) {
return false;
}
}
module.exports = function (context) {
return getTargetLang(context).then(function (languages) {
var promisesToRun = [];
return utils.getTargetLang(context).then(function (languages) {
var promisesToRun = [];
languages.forEach(function (lang) {
// read the json file
var langJson = require(lang.path);
languages.forEach(function (lang) {
// read the json file
var langJson = require(lang.path);
// check the locales to write to
var localeLangs = [];
if (_.has(langJson, 'locale') && _.has(langJson.locale, 'android')) {
// iterate the locales
_.forEach(langJson.locale.android, function (aLocale) {
localeLangs.push(aLocale);
});
} else {
// use the default lang from the filename, for example "en" in en.json
localeLangs.push(lang.lang);
}
// check the locales to write to
var localeLangs = [];
if (_.has(langJson, "locale") && _.has(langJson.locale, "android")) {
// iterate the locales
_.forEach(langJson.locale.android, function (aLocale) {
localeLangs.push(aLocale);
});
} else {
// use the default lang from the filename, for example "en" in en.json
localeLangs.push(lang.lang);
}
_.forEach(localeLangs, function (localeLang) {
var stringXmlFilePath = getLocalStringXmlPath(context, localeLang);
var parser = new xml2js.Parser();
_.forEach(localeLangs, function (localeLang) {
var stringXmlFilePath = getLocalStringXmlPath(context, localeLang);
var parser = new xml2js.Parser();
var stringXmlJson;
if (!fileExists(stringXmlFilePath)) {
stringXmlJson = {
resources: {
string: []
}
};
promisesToRun.push(processResult(context, localeLang, langJson, stringXmlJson));
} else {
promisesToRun.push(
new Promise(function (resolve, reject) {
// lets read from strings.xml into json
fs.readFile(stringXmlFilePath, function (err, data) {
if (err) {
return reject(err);
}
var stringXmlJson;
if (!fileExists(stringXmlFilePath)) {
stringXmlJson = {
resources: {
string: [],
},
};
promisesToRun.push(
processResult(context, localeLang, langJson, stringXmlJson)
);
} else {
promisesToRun.push(
new Promise(function (resolve, reject) {
// lets read from strings.xml into json
fs.readFile(stringXmlFilePath, function (err, data) {
if (err) {
return reject(err);
}
parser.parseString(data, function (err, result) {
if (err) {
return reject(err);
}
parser.parseString(data, function (err, result) {
if (err) {
return reject(err);
}
stringXmlJson = result;
stringXmlJson = result;
// initialize xmlJson to have strings
if (!_.has(stringXmlJson, 'resources') || !_.has(stringXmlJson.resources, 'string')) {
stringXmlJson.resources = {
string: []
};
}
// initialize xmlJson to have strings
if (
!_.has(stringXmlJson, "resources") ||
!_.has(stringXmlJson.resources, "string")
) {
stringXmlJson.resources = {
string: [],
};
}
processResult(context, localeLang, langJson, stringXmlJson).then(resolve, reject);
});
});
})
);
}
});
});
processResult(
context,
localeLang,
langJson,
stringXmlJson
).then(resolve, reject);
});
});
})
);
}
});
});
return Promise.all(promisesToRun);
});
return Promise.all(promisesToRun);
});
};
function getTranslationPath(config, name) {
var matches = config.match(new RegExp('name="' + name + '" value="(.*?)"', 'i'));
return (matches && matches[1]) || null;
}
function getDefaultPath(context) {
var configNodes = context.opts.plugin.pluginInfo._et._root._children;
for (var node in configNodes) {
if (configNodes[node].attrib.name === 'TRANSLATION_PATH') {
return configNodes[node].attrib.default;
}
}
return '';
}
function getTargetLang(context) {
var targetLangArr = [];
var providedTranslationPathPattern;
var providedTranslationPathRegex;
var config = fs.readFileSync('config.xml').toString();
var PATH = getTranslationPath(config, 'TRANSLATION_PATH');
if (PATH == null) {
PATH = getDefaultPath(context);
providedTranslationPathPattern = PATH + '*.json';
providedTranslationPathRegex = new RegExp(PATH + '(.*).json');
}
if (PATH != null) {
if (/^\s*$/.test(PATH)) {
providedTranslationPathPattern = getDefaultPath(context);
providedTranslationPathPattern = PATH + '*.json';
providedTranslationPathRegex = new RegExp(PATH + '(.*).json');
} else {
providedTranslationPathPattern = PATH + '*.json';
providedTranslationPathRegex = new RegExp(PATH + '(.*).json');
}
}
return new Promise(function (resolve, reject) {
glob(providedTranslationPathPattern).forEach(function (langFile) {
var matches = langFile.match(providedTranslationPathRegex);
if (matches) {
targetLangArr.push({
lang: matches[1],
path: path.join(context.opts.projectRoot, langFile),
});
}
});
resolve(targetLangArr);
});
}
function getLocalStringXmlPath(context, lang) {
var resPath = getResPath(context);
var defaultLocale = getDefaultLocale();
return path.normalize(path.join(resPath, 'values' + (lang !== defaultLocale ? '-' + lang : ''), 'strings.xml'));
var resPath = getResPath(context);
var defaultLocale = getDefaultLocale();
return path.normalize(
path.join(
resPath,
"values" + (lang !== defaultLocale ? "-" + lang : ""),
"strings.xml"
)
);
}
function getResPath(context) {
var locations = context.requireCordovaModule('cordova-lib/src/platforms/platforms').getPlatformApi('android').locations;
return (locations && locations.res) || path.join(context.opts.projectRoot, 'platforms/android/res');
var locations = context
.requireCordovaModule("cordova-lib/src/platforms/platforms")
.getPlatformApi("android").locations;
return (
(locations && locations.res) ||
path.join(context.opts.projectRoot, "platforms/android/res")
);
}
function getDefaultLocale() {
var config = fs.readFileSync('config.xml').toString();
var matches = config.match(new RegExp('<widget[^>]*?defaultlocale="(.*?)"[\\s\\S]*?>', 'i'));
return (matches && matches[1]) || 'en';
var config = fs.readFileSync("config.xml").toString();
var matches = config.match(
new RegExp('<widget[^>]*?defaultlocale="(.*?)"[\\s\\S]*?>', "i")
);
return (matches && matches[1]) || "en";
}

@@ -155,46 +126,51 @@

function processResult(context, lang, langJson, stringXmlJson) {
var mapObj = {};
// create a map to the actual string
_.forEach(stringXmlJson.resources.string, function (val) {
if (_.has(val, '$') && _.has(val['$'], 'name')) {
mapObj[val['$'].name] = val;
}
});
var mapObj = {};
// create a map to the actual string
_.forEach(stringXmlJson.resources.string, function (val) {
if (_.has(val, "$") && _.has(val["$"], "name")) {
mapObj[val["$"].name] = val;
}
});
var langJsonToProcess = _.extend({}, langJson.config_android, langJson.app, langJson.app_android);
var langJsonToProcess = _.extend(
{},
langJson.config_android,
langJson.app,
langJson.app_android
);
// now iterate through langJsonToProcess
_.forEach(langJsonToProcess, function (val, key) {
// positional string format is in Mac OS X format. change to android format
val = val.replace(/\$@/gi, '$s');
val = val.replace(/'/gi, "\\'");
// now iterate through langJsonToProcess
_.forEach(langJsonToProcess, function (val, key) {
// positional string format is in Mac OS X format. change to android format
val = val.replace(/\$@/gi, "$s");
val = val.replace(/'/gi, "\\'");
if (_.has(mapObj, key)) {
// mapObj contains key. replace key
mapObj[key]['_'] = val;
} else {
// add by inserting
stringXmlJson.resources.string.push({
_: val,
$: { name: key }
});
}
});
if (_.has(mapObj, key)) {
// mapObj contains key. replace key
mapObj[key]["_"] = val;
} else {
// add by inserting
stringXmlJson.resources.string.push({
_: val,
$: { name: key },
});
}
});
// save to disk
var filePath = getLocalStringXmlPath(context, lang);
var langDir = path.dirname(filePath);
// save to disk
var filePath = getLocalStringXmlPath(context, lang);
var langDir = path.dirname(filePath);
return mkdirp(langDir).then(function () {
fs.writeFileSync(filePath, buildXML(stringXmlJson));
console.log('Localization saved:', filePath);
});
return mkdirp(langDir).then(function () {
fs.writeFileSync(filePath, buildXML(stringXmlJson));
console.log("Localization saved:", filePath);
});
function buildXML(obj) {
var builder = new xml2js.Builder();
builder.options.renderOpts.indent = '\t';
function buildXML(obj) {
var builder = new xml2js.Builder();
builder.options.renderOpts.indent = "\t";
var x = builder.buildObject(obj);
return x.toString();
}
var x = builder.buildObject(obj);
return x.toString();
}
}

@@ -1,7 +0,7 @@

var fs = require('fs');
var path = require('path');
var glob = require('glob').globSync;
var mkdirp = require('mkdirp').mkdirp;
var _ = require('underscore');
var xcode = require('xcode');
var fs = require("fs");
var path = require("path");
var mkdirp = require("mkdirp").mkdirp;
var _ = require("underscore");
var xcode = require("xcode");
var utils = require("./utils");

@@ -12,218 +12,225 @@ var iosProjFolder;

function jsonToDotStrings(jsonObj) {
var returnString = '';
_.forEach(jsonObj, function (val, key) {
returnString += '"' + key + '" = "' + val + '";\n';
});
return returnString;
var returnString = "";
_.forEach(jsonObj, function (val, key) {
returnString += '"' + key + '" = "' + val + '";\n';
});
return returnString;
}
function getProjectName() {
var config = fs.readFileSync('config.xml').toString();
var matches = config.match(new RegExp('<name>(.*?)</name>', 'i'));
// if simple name-tag not found then try optional form of name tag with short name
if (!matches)
matches = config.match(new RegExp('<name short=".*?">(.*?)</name>', 'i'));
var config = fs.readFileSync("config.xml").toString();
var matches = config.match(new RegExp("<name>(.*?)</name>", "i"));
return (matches && matches[1]) || null;
// if simple name-tag not found then try optional form of name tag with short name
if (!matches)
matches = config.match(new RegExp('<name short=".*?">(.*?)</name>', "i"));
return (matches && matches[1]) || null;
}
function initIosDir() {
if (!iosProjFolder || !iosPbxProjPath) {
var projectName = getProjectName();
iosProjFolder = 'platforms/ios/' + projectName;
iosPbxProjPath = 'platforms/ios/' + projectName + '.xcodeproj/project.pbxproj';
}
if (!iosProjFolder || !iosPbxProjPath) {
var projectName = getProjectName();
iosProjFolder = "platforms/ios/" + projectName;
iosPbxProjPath =
"platforms/ios/" + projectName + ".xcodeproj/project.pbxproj";
}
}
function getTargetIosDir() {
initIosDir();
return iosProjFolder;
initIosDir();
return iosProjFolder;
}
function getXcodePbxProjPath() {
initIosDir();
return iosPbxProjPath;
initIosDir();
return iosPbxProjPath;
}
function writeStringFile(plistStringJsonObj, lang, fileName, bundle) {
var lProjPath = getTargetIosDir() + "/Resources/" + (bundle ? bundle + "/" : "") + lang + ".lproj";
mkdirp(lProjPath).then(function () {
var stringToWrite = jsonToDotStrings(plistStringJsonObj);
fs.writeFileSync(path.join(lProjPath, fileName), stringToWrite);
});
var lProjPath =
getTargetIosDir() +
"/Resources/" +
(bundle ? bundle + "/" : "") +
lang +
".lproj";
mkdirp(lProjPath).then(function () {
var stringToWrite = jsonToDotStrings(plistStringJsonObj);
fs.writeFileSync(path.join(lProjPath, fileName), stringToWrite);
});
}
function writeLocalisationFieldsToXcodeProj(filePaths, groupName, proj) {
var fileRefSection = proj.pbxFileReferenceSection();
var fileRefValues = _.values(fileRefSection);
var fileRefSection = proj.pbxFileReferenceSection();
var fileRefValues = _.values(fileRefSection);
if (filePaths.length > 0) {
var groupKey = proj.findPBXVariantGroupKey({ name: groupName });
if (!groupKey) {
// findPBXVariantGroupKey with name InfoPlist.strings not found. creating new group
var localizableStringVarGroup = proj.addLocalizationVariantGroup(groupName);
groupKey = localizableStringVarGroup.fileRef;
}
if (filePaths.length > 0) {
var groupKey = proj.findPBXVariantGroupKey({ name: groupName });
if (!groupKey) {
// findPBXVariantGroupKey with name InfoPlist.strings not found. creating new group
var localizableStringVarGroup =
proj.addLocalizationVariantGroup(groupName);
groupKey = localizableStringVarGroup.fileRef;
}
filePaths.forEach(function (path) {
var results = _.find(fileRefValues, function (o) {
return _.isObject(o) && _.has(o, 'path') && o.path.replace(/['"]+/g, '') === path;
});
if (_.isUndefined(results)) {
// not found in pbxFileReference yet
proj.addResourceFile('Resources/' + path, { variantGroup: true }, groupKey);
}
});
}
filePaths.forEach(function (path) {
var results = _.find(fileRefValues, function (o) {
return (
_.isObject(o) &&
_.has(o, "path") &&
o.path.replace(/['"]+/g, "") === path
);
});
if (_.isUndefined(results)) {
// not found in pbxFileReference yet
proj.addResourceFile(
"Resources/" + path,
{ variantGroup: true },
groupKey
);
}
});
}
}
module.exports = function (context) {
var infoPlistPaths = [];
var localizableStringsPaths = [];
var settingsBundlePaths = [];
var appShortcutsPaths = [];
var infoPlistPaths = [];
var localizableStringsPaths = [];
var settingsBundlePaths = [];
var appShortcutsPaths = [];
return getTargetLang(context).then(function (languages) {
languages.forEach(function (lang) {
// read the json file
var langJson = require(lang.path);
return utils.getTargetLang(context).then(function (languages) {
languages.forEach(function (lang) {
// read the json file
var langJson = require(lang.path);
// check the locales to write to
var localeLangs = [];
if (_.has(langJson, 'locale') && _.has(langJson.locale, 'ios')) {
// iterate the locales
_.forEach(langJson.locale.ios, function (aLocale) {
localeLangs.push(aLocale);
});
} else {
// use the default lang from the filename, for example "en" in en.json
localeLangs.push(lang.lang);
}
// check the locales to write to
var localeLangs = [];
if (_.has(langJson, "locale") && _.has(langJson.locale, "ios")) {
// iterate the locales
_.forEach(langJson.locale.ios, function (aLocale) {
localeLangs.push(aLocale);
});
} else {
// use the default lang from the filename, for example "en" in en.json
localeLangs.push(lang.lang);
}
_.forEach(localeLangs, function (localeLang) {
if (_.has(langJson, 'config_ios')) {
// do processing for appname into plist
var plistString = langJson.config_ios;
if (!_.isEmpty(plistString)) {
writeStringFile(plistString, localeLang, 'InfoPlist.strings');
infoPlistPaths.push(localeLang + '.lproj/' + 'InfoPlist.strings');
}
}
_.forEach(localeLangs, function (localeLang) {
if (_.has(langJson, "config_ios")) {
// do processing for appname into plist
var plistString = langJson.config_ios;
if (!_.isEmpty(plistString)) {
writeStringFile(plistString, localeLang, "InfoPlist.strings");
infoPlistPaths.push(localeLang + ".lproj/" + "InfoPlist.strings");
}
}
// remove APP_NAME and write to Localizable.strings
if (_.has(langJson, 'app')) {
// do processing for appname into plist
var localizableStringsJson = langJson.app;
// remove APP_NAME and write to Localizable.strings
if (_.has(langJson, "app")) {
// do processing for appname into plist
var localizableStringsJson = langJson.app;
// ios specific strings
if (_.has(langJson, 'app_ios')) {
Object.assign(localizableStringsJson, langJson.app_ios);
}
// ios specific strings
if (_.has(langJson, "app_ios")) {
Object.assign(localizableStringsJson, langJson.app_ios);
}
if (!_.isEmpty(localizableStringsJson)) {
writeStringFile(localizableStringsJson, localeLang, 'Localizable.strings');
localizableStringsPaths.push(localeLang + '.lproj/' + 'Localizable.strings');
}
}
if (!_.isEmpty(localizableStringsJson)) {
writeStringFile(
localizableStringsJson,
localeLang,
"Localizable.strings"
);
localizableStringsPaths.push(
localeLang + ".lproj/" + "Localizable.strings"
);
}
}
if (_.has(langJson, 'app_shortcuts') && !_.isEmpty(langJson.app_shortcuts)) {
writeStringFile(langJson.app_shortcuts, localeLang, 'AppShortcuts.strings');
appShortcutsPaths.push(localeLang + '.lproj/' + 'AppShortcuts.strings');
}
// to create Settings.bundle localizations
if (_.has(langJson, "settings_ios")) {
var localizableSettingsJson = langJson.settings_ios;
if (!_.isEmpty(localizableSettingsJson)) {
_.each(localizableSettingsJson, function (value, key) {
var settingsFileName = key + ".strings";
var localizableSettingsStringsRoot = value;
if (!_.isEmpty(localizableSettingsStringsRoot)) {
writeStringFile(localizableSettingsStringsRoot, localeLang, settingsFileName, "Settings.bundle");
settingsBundlePaths.push("Settings.bundle" + localeLang + ".lproj/" + settingsFileName);
}
});
}
}
});
});
if (
_.has(langJson, "app_shortcuts") &&
!_.isEmpty(langJson.app_shortcuts)
) {
writeStringFile(
langJson.app_shortcuts,
localeLang,
"AppShortcuts.strings"
);
appShortcutsPaths.push(
localeLang + ".lproj/" + "AppShortcuts.strings"
);
}
var pbxProjPath = getXcodePbxProjPath();
var proj = xcode.project(pbxProjPath);
// to create Settings.bundle localizations
if (_.has(langJson, "settings_ios")) {
var localizableSettingsJson = langJson.settings_ios;
if (!_.isEmpty(localizableSettingsJson)) {
_.each(localizableSettingsJson, function (value, key) {
var settingsFileName = key + ".strings";
var localizableSettingsStringsRoot = value;
return new Promise(function (resolve, reject) {
proj.parse(function (error) {
if (error) {
reject(error);
}
if (!_.isEmpty(localizableSettingsStringsRoot)) {
writeStringFile(
localizableSettingsStringsRoot,
localeLang,
settingsFileName,
"Settings.bundle"
);
settingsBundlePaths.push(
"Settings.bundle" + localeLang + ".lproj/" + settingsFileName
);
}
});
}
}
});
});
writeLocalisationFieldsToXcodeProj(infoPlistPaths, 'InfoPlist.strings', proj);
writeLocalisationFieldsToXcodeProj(localizableStringsPaths, 'Localizable.strings', proj);
writeLocalisationFieldsToXcodeProj(appShortcutsPaths, 'AppShortcuts.strings', proj);
var pbxProjPath = getXcodePbxProjPath();
var proj = xcode.project(pbxProjPath);
fs.writeFileSync(pbxProjPath, proj.writeSync());
console.log('Pbx project written with localization groups', _.map(languages, 'lang'));
return new Promise(function (resolve, reject) {
proj.parse(function (error) {
if (error) {
reject(error);
}
var platformPath = path.join(context.opts.projectRoot, 'platforms', 'ios');
var projectFileApi = require(path.join(platformPath, '/cordova/lib/projectFile.js'));
projectFileApi.purgeProjectFileCache(platformPath);
writeLocalisationFieldsToXcodeProj(
infoPlistPaths,
"InfoPlist.strings",
proj
);
writeLocalisationFieldsToXcodeProj(
localizableStringsPaths,
"Localizable.strings",
proj
);
writeLocalisationFieldsToXcodeProj(
appShortcutsPaths,
"AppShortcuts.strings",
proj
);
resolve();
});
});
});
};
fs.writeFileSync(pbxProjPath, proj.writeSync());
console.log(
"Pbx project written with localization groups",
_.map(languages, "lang")
);
function getTranslationPath(config, name) {
var matches = config.match(new RegExp('name="' + name + '" value="(.*?)"', 'i'));
return (matches && matches[1]) || null;
}
var platformPath = path.join(
context.opts.projectRoot,
"platforms",
"ios"
);
var projectFileApi = require(path.join(
platformPath,
"/cordova/lib/projectFile.js"
));
projectFileApi.purgeProjectFileCache(platformPath);
function getDefaultPath(context) {
var configNodes = context.opts.plugin.pluginInfo._et._root._children;
for (var node in configNodes) {
if (configNodes[node].attrib.name === 'TRANSLATION_PATH') {
return configNodes[node].attrib.default;
}
}
return '';
}
function getTargetLang(context) {
var targetLangArr = [];
var providedTranslationPathPattern;
var providedTranslationPathRegex;
var config = fs.readFileSync('config.xml').toString();
var PATH = getTranslationPath(config, 'TRANSLATION_PATH');
if (PATH == null) {
PATH = getDefaultPath(context);
providedTranslationPathPattern = PATH + '*.json';
providedTranslationPathRegex = new RegExp(PATH + '(.*).json');
}
if (PATH != null) {
if (/^\s*$/.test(PATH)) {
providedTranslationPathPattern = getDefaultPath(context);
providedTranslationPathPattern = PATH + '*.json';
providedTranslationPathRegex = new RegExp(PATH + '(.*).json');
} else {
providedTranslationPathPattern = PATH + '*.json';
providedTranslationPathRegex = new RegExp(PATH + '(.*).json');
}
}
return new Promise(function (resolve, reject) {
glob(providedTranslationPathPattern).forEach(function (langFile) {
var matches = langFile.match(providedTranslationPathRegex);
if (matches) {
targetLangArr.push({
lang: matches[1],
path: path.join(context.opts.projectRoot, langFile),
});
}
});
resolve(targetLangArr);
});
}
resolve();
});
});
});
};

@@ -1,18 +0,18 @@

var android_script = require('./create_android_strings');
var ios_script = require('./create_ios_strings');
var android_script = require("./create_android_strings");
var ios_script = require("./create_ios_strings");
module.exports = function (context) {
var platforms = context.opts.platforms;
var platforms = context.opts.platforms;
var promises = [];
var promises = [];
if (platforms.indexOf('android') >= 0) {
promises.push(android_script(context));
}
if (platforms.indexOf("android") >= 0) {
promises.push(android_script(context));
}
if (platforms.indexOf('ios') >= 0) {
promises.push(ios_script(context));
}
if (platforms.indexOf("ios") >= 0) {
promises.push(ios_script(context));
}
return Promise.all(promises);
return Promise.all(promises);
};

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc