179 lines
4.6 KiB
TypeScript
Executable file
179 lines
4.6 KiB
TypeScript
Executable file
import { registerTSPaths } from '../../server/helpers/register-ts-paths'
|
|
registerTSPaths()
|
|
|
|
import * as xliff12ToJs from 'xliff/xliff12ToJs'
|
|
import { readFileSync, readJSON, unlink, writeFile, writeJSON, existsSync, exists, pathExists } from 'fs-extra'
|
|
import { join } from 'path'
|
|
import { buildFileLocale, I18N_LOCALES, isDefaultLocale } from '../../shared/models/i18n/i18n'
|
|
import { eachSeries } from 'async'
|
|
|
|
const sources: string[] = []
|
|
const l = [
|
|
'ar-001',
|
|
'ca-ES',
|
|
'cs-CZ',
|
|
'da-DK',
|
|
'de-DE',
|
|
'el-GR',
|
|
'en-GB',
|
|
'en-US',
|
|
'eo',
|
|
'es-ES',
|
|
'eu-ES',
|
|
'fa-IR',
|
|
'fi-FI',
|
|
'fr-FR',
|
|
'gd',
|
|
'gl-ES',
|
|
'hu-HU',
|
|
'it-IT',
|
|
'ja-JP',
|
|
'jbo',
|
|
'ko-KR',
|
|
'lt-LT',
|
|
'nb-NO',
|
|
'nl-NL',
|
|
'oc',
|
|
'pl-PL',
|
|
'pt-BR',
|
|
'pt-PT',
|
|
'ru-RU',
|
|
'sk-SK',
|
|
'sl-SI',
|
|
'sv-SE',
|
|
'ta',
|
|
'th-TH',
|
|
'tr-TR',
|
|
'uk-UA',
|
|
'vi-VN',
|
|
'zh-Hans-CN',
|
|
'zh-Hant-TW'
|
|
]
|
|
|
|
const availableLocales = l.filter(l => isDefaultLocale(l) === false)
|
|
.map(l => buildFileLocale(l))
|
|
|
|
for (const file of [ 'player', 'server', 'iso639' ]) {
|
|
for (const locale of availableLocales) {
|
|
sources.push(join(__dirname, '../../../client/src/locale/target/', `${file}_${locale}.xml`))
|
|
}
|
|
}
|
|
|
|
eachSeries(sources, (source, cb) => {
|
|
xliffFile2JSON(source, cb)
|
|
}, err => {
|
|
if (err) return handleError(err)
|
|
|
|
mergeISO639InServer(err => {
|
|
if (err) return handleError(err)
|
|
|
|
injectMissingTranslations().then(() => process.exit(0))
|
|
})
|
|
})
|
|
|
|
function handleError (err: any) {
|
|
console.error(err)
|
|
process.exit(-1)
|
|
}
|
|
|
|
function xliffFile2JSON (filePath: string, cb) {
|
|
const fileTarget = filePath.replace('.xml', '.json')
|
|
|
|
if (!existsSync(filePath)) {
|
|
console.log('No file %s exists.', filePath)
|
|
return cb()
|
|
}
|
|
|
|
// Remove the two first lines our xliff module does not like
|
|
let fileContent = readFileSync(filePath).toString()
|
|
fileContent = removeFirstLine(fileContent)
|
|
fileContent = removeFirstLine(fileContent)
|
|
|
|
xliff12ToJs(fileContent, (err, res) => {
|
|
if (err) return cb(err)
|
|
|
|
const json = createJSONString(res)
|
|
writeFile(fileTarget, json, err => {
|
|
if (err) return cb(err)
|
|
|
|
return unlink(filePath, cb)
|
|
})
|
|
})
|
|
}
|
|
|
|
function mergeISO639InServer (cb) {
|
|
eachSeries(availableLocales, (locale, eachCallback) => {
|
|
const serverPath = join(__dirname, '../../../client/src/locale/target/', `server_${locale}.json`)
|
|
const iso639Path = join(__dirname, '../../../client/src/locale/target/', `iso639_${locale}.json`)
|
|
|
|
if (!existsSync(serverPath)) {
|
|
console.log('No file %s exists.', serverPath)
|
|
return cb()
|
|
}
|
|
if (!existsSync(iso639Path)) {
|
|
console.log('No file %s exists.', iso639Path)
|
|
return cb()
|
|
}
|
|
|
|
const resServer = readFileSync(serverPath).toString()
|
|
const resISO639 = readFileSync(iso639Path).toString()
|
|
|
|
const jsonServer = JSON.parse(resServer)
|
|
const jsonISO639 = JSON.parse(resISO639)
|
|
|
|
Object.assign(jsonServer, jsonISO639)
|
|
const serverString = JSON.stringify(jsonServer)
|
|
|
|
writeFile(serverPath, serverString, err => {
|
|
if (err) return eachCallback(err)
|
|
|
|
return unlink(iso639Path, eachCallback)
|
|
})
|
|
}, cb)
|
|
}
|
|
|
|
function removeFirstLine (str: string) {
|
|
return str.substring(str.indexOf('\n') + 1)
|
|
}
|
|
|
|
function createJSONString (obj: any) {
|
|
const res: any = {}
|
|
const strings = obj.resources['']
|
|
|
|
Object.keys(strings).forEach(k => res[k] = strings[k].target)
|
|
|
|
return JSON.stringify(res)
|
|
}
|
|
|
|
async function injectMissingTranslations () {
|
|
const baseServer = await readJSON(join(__dirname, '../../../client/src/locale/server.en-US.json'))
|
|
Object.keys(baseServer).forEach(k => baseServer[k] = '')
|
|
|
|
for (const locale of availableLocales) {
|
|
const serverPath = join(__dirname, '../../../client/src/locale/target/', `server_${locale}.json`)
|
|
if (!await pathExists(serverPath)) {
|
|
console.log('No file exists to inject missing translations: %s.', serverPath)
|
|
continue
|
|
}
|
|
|
|
let serverJSON = await readJSON(serverPath)
|
|
|
|
serverJSON = Object.assign({}, baseServer, serverJSON)
|
|
await writeJSON(serverPath, serverJSON)
|
|
}
|
|
|
|
const basePlayer = await readJSON(join(__dirname, '../../../client/src/locale/player.en-US.json'))
|
|
Object.keys(basePlayer).forEach(k => basePlayer[k] = '')
|
|
for (const locale of availableLocales) {
|
|
const serverPath = join(__dirname, '../../../client/src/locale/target/', `player_${locale}.json`)
|
|
if (!await pathExists(serverPath)) {
|
|
console.log('No file exists to inject missing translations: %s.', serverPath)
|
|
continue
|
|
}
|
|
|
|
let serverJSON = await readJSON(serverPath)
|
|
|
|
serverJSON = Object.assign({}, basePlayer, serverJSON)
|
|
await writeJSON(serverPath, serverJSON)
|
|
}
|
|
}
|