我正在学习NodeJS/JavaScript。我有一个基本合并翻译文件的app。我有一个English.pot文件和多个翻译文件,Spanish.po French.po German.po等。我得到所有存在的。po文件,并处理每个文件,然后将合并输出到一个新文件Spansh.po.new中。当我只有1.po文件时,我的代码可以很好地工作,这也是我一直以来开发它的方式。我添加了其他2.po文件,现在我得到了3.new文件,但它们都有相同的输出,这是所有这些文件的合并。
使用1.PO文件
msgid "Visit plugin homepage"
msgstr "Besuchen Sie die Plugin-Homepage"
#. translators: %s: plugin author
msgid "by %s"
msgstr "von %s"
超过1.po文件的所有3.新文件如下所示
msgid "Visit plugin homepage"
msgstr "Besuchen Sie die Plugin-Homepage"
msgid "Visit plugin homepage"
msgstr "Visite la página inicial del Plugin"
msgid "Visit plugin homepage"
msgstr "Visitez la page d'accueil du plugin"
#. translators: %s: plugin author
#. translators: %s: plugin author
#. translators: %s: plugin author
msgid "by %s"
msgstr "von %s"
msgid "by %s"
msgstr "por %s"
msgid "by %s"
msgstr "par %s"
我确信这与异步有关,但不确定我做错了什么。
基本代码,我剥离了翻译逻辑
if (fs.existsSync(potFile)) {
var newPO = []
var dirPath = path.resolve(languageDir)
fs.readdir(dirPath, (err, files) => {
if (err)
this.log(err)
else {
files.forEach(file => {
if (path.extname(file) === '.po') {
const buffer = fs.readFileSync(languageDir + file, {encoding: 'utf8', flag: 'r'})
const poArray = new Array(buffer.split('\n')).flat()
var lineReader = require('line-reader')
lineReader.eachLine(potFile, function (line, last) {
// BUNCH OF TRANSLATION LOGIC
// THAT ADDS LINES TO newPO ARRAY by:
newPO.push(line)
if (last) {
// or check if it's the last one
var newFile = fs.createWriteStream(languageDir + file + '.new')
newFile.write(newPO.join('\n'))
}
})
}
})
}
})
}
我以为它会将每个。po旋转成一个单独的块,它们都将被隔离,但我猜这不是它的工作方式。
希望我的代码不是完全的垃圾,但我很高兴听到我做错了什么,我可以做得更好。
将var newPO=[]
放在const buffer
行的正上方,以更改该变量的作用域。
现在,它有一个外部作用域,所以您只需继续追加到它,并写出相同的数组。