cordova-plugin-localization-strings
Advanced tools
Comparing version 5.0.0 to 5.0.2
{ | ||
"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
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
9
427
23997
6