You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

129 lines
2.8 KiB

  1. #!/usr/bin/env node
  2. const fs = require('fs')
  3. const forEach = require('async-foreach').forEach
  4. var all = {}
  5. var allIds = []
  6. /* read existing translation files in lang/ */
  7. fs.readdir('lang', function (err, files) {
  8. forEach(files, function (f) {
  9. let m = f.match(/^(.*)\.json$/)
  10. if (!m) {
  11. return
  12. }
  13. let done = this.async()
  14. let lang = m[1]
  15. fs.readFile('lang/' + f, function (err) {
  16. if (!(lang in all)) {
  17. all[lang] = {}
  18. }
  19. done()
  20. })
  21. })
  22. })
  23. fs.readdir(
  24. '.',
  25. function (err, files) {
  26. forEach(
  27. files,
  28. function (f) {
  29. if (f === 'package.json') {
  30. return
  31. }
  32. let m = f.match(/^(.*)\.json$/)
  33. if (!m) {
  34. return
  35. }
  36. let done = this.async()
  37. let id = m[1]
  38. allIds.push('category:' + id)
  39. fs.readFile(f, function (err, contents) {
  40. let data = JSON.parse(contents)
  41. if ('name' in data) {
  42. for (var lang in data.name) {
  43. if (!(lang in all)) {
  44. all[lang] = {}
  45. }
  46. all[lang]['category:' + id] = data.name[lang]
  47. }
  48. if (data.type && data.type === 'index') {
  49. parseSubCategories(data.subCategories, all)
  50. }
  51. if (data.type && data.type === 'overpass') {
  52. if (data.lists) {
  53. for (let listId in data.lists) {
  54. let list = data.lists[listId]
  55. let langStrId = 'category:' + id + ':' + listId
  56. allIds.push(langStrId)
  57. for (let lang in list.name) {
  58. all[lang][langStrId] = list.name[lang]
  59. }
  60. }
  61. }
  62. }
  63. }
  64. done()
  65. })
  66. },
  67. writeTranslationFiles
  68. )
  69. }
  70. )
  71. function parseSubCategories(categories, all) {
  72. categories.forEach(data => {
  73. if ('name' in data) {
  74. for (var lang in data.name) {
  75. if (!(lang in all)) {
  76. all[lang] = {}
  77. }
  78. allIds.push('category:' + data.id)
  79. all[lang]['category:' + data.id] = data.name[lang]
  80. }
  81. if (data.type && data.type === 'index') {
  82. parseSubCategories(data.subCategories, all)
  83. }
  84. }
  85. })
  86. }
  87. function writeTranslationFiles () {
  88. forEach(Object.keys(all), function (lang) {
  89. let done = this.async()
  90. allIds = allIds.sort()
  91. let data = {}
  92. allIds.forEach(function (id) {
  93. data[id] = ''
  94. })
  95. let keys = Object.keys(all[lang])
  96. keys.sort()
  97. for (let i = 0; i < keys.length; i++) {
  98. data[keys[i]] = all[lang][keys[i]]
  99. }
  100. fs.writeFile(
  101. 'lang/' + lang + '.json',
  102. JSON.stringify(data, null, ' ') + '\n',
  103. function (err, result) {
  104. done()
  105. }
  106. )
  107. })
  108. }