提问者:小点点

NodeJS/JavaScript输出写入所有文件而不是单个文件


我正在学习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旋转成一个单独的块,它们都将被隔离,但我猜这不是它的工作方式。

希望我的代码不是完全的垃圾,但我很高兴听到我做错了什么,我可以做得更好。


共1个答案

匿名用户

var newPO=[]放在const buffer行的正上方,以更改该变量的作用域。

现在,它有一个外部作用域,所以您只需继续追加到它,并写出相同的数组。