Scripts: add option to only keep english translations
This commit is contained in:
parent
c274a01965
commit
2f66b2ee59
1 changed files with 102 additions and 40 deletions
|
@ -2,6 +2,7 @@ import * as fs from "fs"
|
||||||
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs"
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs"
|
||||||
import { Utils } from "../src/Utils"
|
import { Utils } from "../src/Utils"
|
||||||
import ScriptUtils from "./ScriptUtils"
|
import ScriptUtils from "./ScriptUtils"
|
||||||
|
import Script from "./Script"
|
||||||
|
|
||||||
const knownLanguages = ["en", "nl", "de", "fr", "es", "gl", "ca"]
|
const knownLanguages = ["en", "nl", "de", "fr", "es", "gl", "ca"]
|
||||||
|
|
||||||
|
@ -658,32 +659,64 @@ function loadTranslationFilesFrom(target: string): Map<string, any> {
|
||||||
/**
|
/**
|
||||||
* Load the translations from the weblate files back into the layers
|
* Load the translations from the weblate files back into the layers
|
||||||
*/
|
*/
|
||||||
function mergeLayerTranslations() {
|
function mergeLayerTranslations(englishOnly: boolean = false) {
|
||||||
const layerFiles = ScriptUtils.getLayerFiles()
|
const layerFiles = ScriptUtils.getLayerFiles()
|
||||||
for (const layerFile of layerFiles) {
|
for (const layerFile of layerFiles) {
|
||||||
mergeLayerTranslation(layerFile.parsed, layerFile.path, loadTranslationFilesFrom("layers"))
|
mergeLayerTranslation(layerFile.parsed, layerFile.path, loadTranslationFilesFrom("layers"))
|
||||||
const endsWithNewline =
|
const endsWithNewline =
|
||||||
readFileSync(layerFile.path, { encoding: "utf8" })?.endsWith("\n") ?? true
|
readFileSync(layerFile.path, { encoding: "utf8" })?.endsWith("\n") ?? true
|
||||||
|
let config = layerFile.parsed
|
||||||
|
if (englishOnly) {
|
||||||
|
config = Utils.Clone(config)
|
||||||
|
removeNonEnglishTranslations(config)
|
||||||
|
}
|
||||||
writeFileSync(
|
writeFileSync(
|
||||||
layerFile.path,
|
layerFile.path,
|
||||||
JSON.stringify(layerFile.parsed, null, " ") + (endsWithNewline ? "\n" : "")
|
JSON.stringify(config, null, " ") + (endsWithNewline ? "\n" : "")
|
||||||
) // layers use 2 spaces
|
) // layers use 2 spaces
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function removeNonEnglishTranslations(object: any) {
|
||||||
|
Utils.WalkObject(
|
||||||
|
object,
|
||||||
|
(leaf: any) => {
|
||||||
|
const en = leaf["en"]
|
||||||
|
if (!en) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
for (const key in leaf) {
|
||||||
|
if (key.startsWith("#")) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
delete leaf[key]
|
||||||
|
}
|
||||||
|
leaf["en"] = en
|
||||||
|
},
|
||||||
|
(possibleLeaf) =>
|
||||||
|
possibleLeaf !== null && typeof possibleLeaf === "object" && isTranslation(possibleLeaf)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Load the translations into the theme files
|
* Load the translations into the theme files
|
||||||
*/
|
*/
|
||||||
function mergeThemeTranslations() {
|
function mergeThemeTranslations(englishOnly: boolean = false) {
|
||||||
const themeFiles = ScriptUtils.getThemeFiles()
|
const themeFiles = ScriptUtils.getThemeFiles()
|
||||||
for (const themeFile of themeFiles) {
|
for (const themeFile of themeFiles) {
|
||||||
const config = themeFile.parsed
|
let config = themeFile.parsed
|
||||||
mergeLayerTranslation(config, themeFile.path, loadTranslationFilesFrom("themes"))
|
mergeLayerTranslation(config, themeFile.path, loadTranslationFilesFrom("themes"))
|
||||||
|
|
||||||
const allTranslations = new TranslationPart()
|
const allTranslations = new TranslationPart()
|
||||||
allTranslations.recursiveAdd(config, themeFile.path)
|
allTranslations.recursiveAdd(config, themeFile.path)
|
||||||
const endsWithNewline =
|
const endsWithNewline =
|
||||||
readFileSync(themeFile.path, { encoding: "utf8" })?.endsWith("\n") ?? true
|
readFileSync(themeFile.path, { encoding: "utf8" })?.endsWith("\n") ?? true
|
||||||
|
|
||||||
|
if (englishOnly) {
|
||||||
|
config = Utils.Clone(config)
|
||||||
|
removeNonEnglishTranslations(config)
|
||||||
|
}
|
||||||
|
|
||||||
writeFileSync(
|
writeFileSync(
|
||||||
themeFile.path,
|
themeFile.path,
|
||||||
JSON.stringify(config, null, " ") + (endsWithNewline ? "\n" : "")
|
JSON.stringify(config, null, " ") + (endsWithNewline ? "\n" : "")
|
||||||
|
@ -691,41 +724,70 @@ function mergeThemeTranslations() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!existsSync("./langs/themes")) {
|
class GenerateTranslations extends Script {
|
||||||
mkdirSync("./langs/themes")
|
constructor() {
|
||||||
}
|
super("Syncs translations from/to the theme and layer files")
|
||||||
const themeOverwritesWeblate = process.argv[2] === "--ignore-weblate"
|
}
|
||||||
if (!themeOverwritesWeblate) {
|
|
||||||
mergeLayerTranslations()
|
/**
|
||||||
mergeThemeTranslations()
|
* OUtputs the 'used_languages.json'-file
|
||||||
} else {
|
*/
|
||||||
console.log("Ignore weblate")
|
detectUsedLanguages() {
|
||||||
|
{
|
||||||
|
const l1 = generateTranslationsObjectFrom(ScriptUtils.getLayerFiles(), "layers")
|
||||||
|
const l2 = generateTranslationsObjectFrom(
|
||||||
|
ScriptUtils.getThemeFiles().filter(
|
||||||
|
(th) => th.parsed.mustHaveLanguage === undefined
|
||||||
|
),
|
||||||
|
"themes"
|
||||||
|
)
|
||||||
|
|
||||||
|
const usedLanguages: string[] = Utils.Dedup(l1.concat(l2)).filter((v) => v !== "*")
|
||||||
|
usedLanguages.sort()
|
||||||
|
fs.writeFileSync(
|
||||||
|
"./src/assets/used_languages.json",
|
||||||
|
JSON.stringify({ languages: usedLanguages })
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async main(args: string[]): Promise<void> {
|
||||||
|
if (!existsSync("./langs/themes")) {
|
||||||
|
mkdirSync("./langs/themes")
|
||||||
|
}
|
||||||
|
const themeOverwritesWeblate = args[0] === "--ignore-weblate"
|
||||||
|
const englishOnly = args[0] === "--english-only"
|
||||||
|
if (!themeOverwritesWeblate) {
|
||||||
|
mergeLayerTranslations()
|
||||||
|
mergeThemeTranslations()
|
||||||
|
compileTranslationsFromWeblate()
|
||||||
|
} else {
|
||||||
|
console.log("Ignore weblate")
|
||||||
|
}
|
||||||
|
|
||||||
|
this.detectUsedLanguages()
|
||||||
|
genTranslations()
|
||||||
|
{
|
||||||
|
const allTranslationFiles = ScriptUtils.readDirRecSync("langs").filter((path) =>
|
||||||
|
path.endsWith(".json")
|
||||||
|
)
|
||||||
|
for (const path of allTranslationFiles) {
|
||||||
|
formatFile(path)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Some validation
|
||||||
|
TranslationPart.fromDirectory("./langs").validateStrict("./langs")
|
||||||
|
TranslationPart.fromDirectory("./langs/layers").validateStrict("layers")
|
||||||
|
TranslationPart.fromDirectory("./langs/themes").validateStrict("themes")
|
||||||
|
|
||||||
|
if (englishOnly) {
|
||||||
|
mergeLayerTranslations(true)
|
||||||
|
mergeThemeTranslations(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log("All done!")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const l1 = generateTranslationsObjectFrom(ScriptUtils.getLayerFiles(), "layers")
|
new GenerateTranslations().run()
|
||||||
const l2 = generateTranslationsObjectFrom(
|
|
||||||
ScriptUtils.getThemeFiles().filter((th) => th.parsed.mustHaveLanguage === undefined),
|
|
||||||
"themes"
|
|
||||||
)
|
|
||||||
|
|
||||||
const usedLanguages: string[] = Utils.Dedup(l1.concat(l2)).filter((v) => v !== "*")
|
|
||||||
usedLanguages.sort()
|
|
||||||
fs.writeFileSync("./src/assets/used_languages.json", JSON.stringify({ languages: usedLanguages }))
|
|
||||||
|
|
||||||
if (!themeOverwritesWeblate) {
|
|
||||||
// Generates the core translations
|
|
||||||
compileTranslationsFromWeblate()
|
|
||||||
}
|
|
||||||
genTranslations()
|
|
||||||
const allTranslationFiles = ScriptUtils.readDirRecSync("langs").filter((path) =>
|
|
||||||
path.endsWith(".json")
|
|
||||||
)
|
|
||||||
for (const path of allTranslationFiles) {
|
|
||||||
formatFile(path)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Some validation
|
|
||||||
TranslationPart.fromDirectory("./langs").validateStrict("./langs")
|
|
||||||
TranslationPart.fromDirectory("./langs/layers").validateStrict("layers")
|
|
||||||
TranslationPart.fromDirectory("./langs/themes").validateStrict("themes")
|
|
||||||
console.log("All done!")
|
|
||||||
|
|
Loading…
Reference in a new issue