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.

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