From d6cce6a887de1b822e534f69cbb5afbbc8d58825 Mon Sep 17 00:00:00 2001 From: Yuri Kuznetsov Date: Wed, 19 Jul 2023 17:37:53 +0300 Subject: [PATCH] fix po --- js/lang.js | 88 +++++++++++++++++++++++++++++------------------- js/po.js | 98 ++++++++++++++++++++++++++++++++---------------------- 2 files changed, 111 insertions(+), 75 deletions(-) diff --git a/js/lang.js b/js/lang.js index 3aa2f45142..8ff4272f68 100644 --- a/js/lang.js +++ b/js/lang.js @@ -57,18 +57,20 @@ class Lang this.moduleList = [onlyModuleName]; } - var dirNames = this.dirNames = {}; + let dirNames = this.dirNames = {}; + + let coreDir = this.espoPath + 'application/Espo/Resources/i18n/' + this.baseLanguage + '/'; + + let dirs = [coreDir]; - var coreDir = this.espoPath + 'application/Espo/Resources/i18n/' + this.baseLanguage + '/'; - var dirs = [coreDir]; dirNames[coreDir] = 'application/Espo/Resources/i18n/' + this.language + '/'; - var installDir = this.espoPath + 'install/core/i18n/' + this.baseLanguage + '/'; + let installDir = this.espoPath + 'install/core/i18n/' + this.baseLanguage + '/'; dirs.push(installDir); dirNames[installDir] = 'install/core/i18n/' + this.language + '/'; - var templatesDir = this.espoPath + 'application/Espo/Core/Templates/i18n/' + this.baseLanguage + '/'; + let templatesDir = this.espoPath + 'application/Espo/Core/Templates/i18n/' + this.baseLanguage + '/'; dirs.push(templatesDir); dirNames[templatesDir] = 'application/Espo/Core/Templates/i18n/' + this.language + '/'; @@ -78,8 +80,24 @@ class Lang } this.moduleList.forEach(moduleName => { - var dir = this.espoPath + 'application/Espo/Modules/' + moduleName + '/Resources/i18n/' + + let path1 = this.espoPath + 'application/Espo/Modules/' + moduleName; + let path2 = this.espoPath + 'custom/Espo/Modules/' + moduleName; + + let baseDir = fs.existsSync(path1) ? path1 : path2; + + let dir = baseDir + '/Resources/i18n/' + this.baseLanguage + '/'; + + dirs.push(dir); + + dirNames[dir] = fs.existsSync(path1) ? + 'application/Espo/Modules/' + moduleName + '/Resources/i18n/' + this.language + '/' : + 'custom/Espo/Modules/' + moduleName + '/Resources/i18n/' + this.language + '/'; + }); + + this.moduleList.forEach(moduleName => { + let dir = this.espoPath + 'application/Espo/Modules/' + moduleName + '/Resources/i18n/' + this.baseLanguage + '/'; + dirs.push(dir); dirNames[dir] = 'application/Espo/Modules/' + moduleName + @@ -96,8 +114,9 @@ class Lang } run () { - var translationData = {}; - var dirs = this.dirs; + let translationData = {}; + let dirs = this.dirs; + const isWin = this.isWin; const language = this.language; @@ -111,11 +130,11 @@ class Lang return; } - var key = item.msgctxt + '__' + item.msgid; - var file = item.msgctxt.split('.')[0]; - var path = item.msgctxt.split('.').slice(1); + //let key = item.msgctxt + '__' + item.msgid; + let file = item.msgctxt.split('.')[0]; + let path = item.msgctxt.split('.').slice(1); - var o = { + let o = { stringOriginal: item.msgid, stringTranslated: item.msgstr[0], context: item.msgctxt, @@ -128,11 +147,11 @@ class Lang }); dirs.forEach(path =>{ - var resDirPath = this.dirNames[path]; - var resPath = this.espoPath + 'build/' + language + '/' + resDirPath; + let resDirPath = this.dirNames[path]; + let resPath = this.espoPath + 'build/' + language + '/' + resDirPath; if (!fs.existsSync(resPath)) { - var d = ''; + let d = ''; resPath.split('/').forEach(f =>{ if (!f) { @@ -151,29 +170,28 @@ class Lang }); } - var list = fs.readdirSync(path); + let list = fs.readdirSync(path); list.forEach(fileName => { + let filePath = path + fileName; + let resFilePath = resPath + '/' + fileName; - var filePath = path + fileName; - var resFilePath = resPath + '/' + fileName; + let contents = fs.readFileSync(filePath, 'utf8'); - var contents = fs.readFileSync(filePath, 'utf8'); + let fileKey = fileName.split('.')[0]; - var fileKey = fileName.split('.')[0]; - - var fileObject = JSON.parse(contents); - var targetFileObject = {}; + let fileObject = JSON.parse(contents); + let targetFileObject = {}; if (!(fileKey in translationData)) { return; } translationData[fileKey].forEach(item => { - var isArray = false; - var isMet = true; - var c = fileObject; - var path = item.path.slice(0); + let isArray = false; + let isMet = true; + let c = fileObject; + let path = item.path.slice(0); if ( this.baseLanguage !== this.language && @@ -182,8 +200,8 @@ class Lang return; } - for (var i in item.path) { - var key = item.path[i]; + for (let i in item.path) { + let key = item.path[i]; if (key in c) { c = c[key]; @@ -198,15 +216,16 @@ class Lang } } - var pathList = []; + let pathList = []; if (isMet) { if (!isArray) { isMet = false; - for (var k in c) { + for (let k in c) { if (c[k] === item.stringOriginal) { - var p = path.slice(0); + let p = path.slice(0); + p.push(k); pathList.push(p); @@ -222,7 +241,7 @@ class Lang return; } - var targetValue = item.stringTranslated; + let targetValue = item.stringTranslated; if (targetValue === '') { return; @@ -245,8 +264,7 @@ class Lang } pathList.forEach(path => { - - var c = targetFileObject; + let c = targetFileObject; path.forEach((pathKey, i) => { if (i < path.length - 1) { diff --git a/js/po.js b/js/po.js index 0a1456fde7..e8fb2bf001 100644 --- a/js/po.js +++ b/js/po.js @@ -38,24 +38,28 @@ class PO this.onlyModuleName = onlyModuleName; this.espoPath = espoPath; - if (this.espoPath.substr(-1) != '/') { + if (this.espoPath.substr(-1) !== '/') { this.espoPath += '/'; } this.moduleList = ['Crm']; + if (onlyModuleName) { this.moduleList = [onlyModuleName]; } + this.baseLanguage = 'en_US'; this.language = language || this.baseLanguage; - this.outputFileName = 'espocrm-' + this.language ; + this.outputFileName = 'espocrm-' + this.language; + if (onlyModuleName) { this.outputFileName += '-' + onlyModuleName; } + this.outputFileName += '.po'; - var dirs = [ + let dirs = [ this.espoPath + 'application/Espo/Resources/i18n/', this.espoPath + 'install/core/i18n/', this.espoPath + 'application/Espo/Core/Templates/i18n/' @@ -65,9 +69,14 @@ class PO dirs = []; } - this.moduleList.forEach(function (moduleName) { - dirs.push(this.espoPath + 'application/Espo/Modules/' + moduleName + '/Resources/i18n/'); - }, this); + this.moduleList.forEach(moduleName => { + let path1 = this.espoPath + 'application/Espo/Modules/' + moduleName; + let path2 = this.espoPath + 'custom/Espo/Modules/' + moduleName; + + let dir = fs.existsSync(path1) ? path1 : path2; + + dirs.push(dir + '/Resources/i18n/'); + }); this.dirs = dirs; @@ -85,58 +94,63 @@ class PO } runAll () { - var pathToLanguage = this.espoPath + '/application/Espo/Resources/i18n/'; + let pathToLanguage = this.espoPath + '/application/Espo/Resources/i18n/'; - var languageList = []; + let languageList = []; - fs.readdirSync(pathToLanguage).forEach(function (dir) { - if (dir.indexOf('_') == 2) { + fs.readdirSync(pathToLanguage).forEach(dir => { + if (dir.indexOf('_') === 2) { languageList.push(dir); } }); - languageList.forEach(function (language) { - var po = new PO(this.espoPath, language, this.onlyModuleName); + languageList.forEach(language => { + let po = new PO(this.espoPath, language, this.onlyModuleName); + po.run(); - }, this); + }); } run () { - var dirs = this.dirs; - var messageData = {}; - var targetMessageData = {} + let dirs = this.dirs; + let messageData = {}; + let targetMessageData = {} - var poContents = this.poContentHeader; + let poContents = this.poContentHeader; - dirs.forEach(function (path) { - var dirPath = this.getDirPath(path, this.baseLanguage); + dirs.forEach(path => { + let dirPath = this.getDirPath(path, this.baseLanguage); - var list = fs.readdirSync(dirPath); + let list = fs.readdirSync(dirPath); + + list.forEach(fileName => { + let filePath = this.getDirPath(path, this.baseLanguage) + fileName; - list.forEach(function (fileName) { - var filePath = this.getDirPath(path, this.baseLanguage) + fileName; this.populateMessageDataFromFile(filePath, messageData); - if (this.language != this.baseLanguage) { - var langFilePath = this.getDirPath(path, this.language) + fileName; + if (this.language !== this.baseLanguage) { + let langFilePath = this.getDirPath(path, this.language) + fileName; + this.populateMessageDataFromFile(langFilePath, targetMessageData); } - }, this); - }, this); + }); + }); - if (this.language == this.baseLanguage) { + if (this.language === this.baseLanguage) { targetMessageData = messageData; } - for (var key in messageData) { + for (let key in messageData) { poContents += 'msgctxt "' + messageData[key].context + '"\n'; poContents += 'msgid "' + messageData[key].value + '"\n'; - var translatedValue = (targetMessageData[key] || {}).value || ""; + + let translatedValue = (targetMessageData[key] || {}).value || ""; + poContents += 'msgstr "' + translatedValue + '"\n\n'; } - var resFilePath = this.espoPath + 'build/' + this.outputFileName; + let resFilePath = this.espoPath + 'build/' + this.outputFileName; if (fs.existsSync(resFilePath)) { fs.unlinkSync(resFilePath); @@ -150,36 +164,38 @@ class PO return messageData; } - var data = fs.readFileSync(filePath, 'utf8'); + let data = fs.readFileSync(filePath, 'utf8'); + data = JSON.parse(data); - var fileName = filePath.split('\/').slice(-1).pop().split('.')[0]; + let fileName = filePath.split('\/').slice(-1).pop().split('.')[0]; this.populateMessageData(fileName, data, '', messageData); } getDirPath (path, language) { - var dirPath = path + language + '/'; - return dirPath; + return path + language + '/'; } populateMessageData (fileName, dataObject, prefix, messageData) { prefix = prefix || ''; - for (var index in dataObject) { + for (let index in dataObject) { if (dataObject[index] === null || dataObject[index] === "") { continue; } if (typeof dataObject[index] === 'object' && !Array.isArray(dataObject[index])) { - var nextPrefix = prefix + (prefix ? '.' : '') + index; + let nextPrefix = prefix + (prefix ? '.' : '') + index; + this.populateMessageData(fileName, dataObject[index], nextPrefix, messageData); + continue; } - var path = fileName + '.' + prefix; - var key = path + '.' + index; - var value = dataObject[index]; + let path = fileName + '.' + prefix; + let key = path + '.' + index; + let value = dataObject[index]; if (Array.isArray(value)) { value = '"' + value.join('", "') + '"'; @@ -194,7 +210,8 @@ class PO } replaceAll (string, find, replace) { - var escapedRegExp = find.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1"); + let escapedRegExp = find.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1"); + return string.replace(new RegExp(escapedRegExp, 'g'), replace); } @@ -203,6 +220,7 @@ class PO savedString = this.replaceAll(savedString, '"', '\\"'); savedString = this.replaceAll(savedString, "\n", '\\n'); savedString = this.replaceAll(savedString, "\t", '\\t'); + return savedString; } }