diff --git a/.docs/mergeTranslations.js b/.docs/mergeTranslations.js new file mode 100644 index 0000000..7025dee --- /dev/null +++ b/.docs/mergeTranslations.js @@ -0,0 +1,649 @@ +//@ts-check +const fjs = require("formatted-json-stringify") +const fs = require("fs") +const formatter = new fjs.ObjectFormatter(null,true,[ + new fjs.ObjectFormatter("_TRANSLATION",true,[ + new fjs.PropertyFormatter("otversion"), + new fjs.ArrayFormatter("translators",false,new fjs.PropertyFormatter(null)), + new fjs.PropertyFormatter("lastedited"), + new fjs.PropertyFormatter("language"), + new fjs.PropertyFormatter("automated"), + ]), + new fjs.ObjectFormatter("checker",true,[ + new fjs.ObjectFormatter("system",true,[ + new fjs.PropertyFormatter("typeError"), + new fjs.PropertyFormatter("headerOpenTicket"), + new fjs.PropertyFormatter("typeWarning"), + new fjs.PropertyFormatter("typeInfo"), + new fjs.PropertyFormatter("headerConfigChecker"), + new fjs.PropertyFormatter("headerDescription"), + new fjs.PropertyFormatter("footerError"), + new fjs.PropertyFormatter("footerWarning"), + new fjs.PropertyFormatter("footerSupport"), + new fjs.PropertyFormatter("compactInformation"), + new fjs.PropertyFormatter("dataPath"), + new fjs.PropertyFormatter("dataDocs"), + new fjs.PropertyFormatter("dataMessages"), + ]), + new fjs.ObjectFormatter("messages",true,[ + new fjs.PropertyFormatter("stringTooShort"), + new fjs.PropertyFormatter("stringTooLong"), + new fjs.PropertyFormatter("stringLengthInvalid"), + new fjs.PropertyFormatter("stringStartsWith"), + new fjs.PropertyFormatter("stringEndsWith"), + new fjs.PropertyFormatter("stringContains"), + new fjs.PropertyFormatter("stringChoices"), + new fjs.PropertyFormatter("stringRegex"), + + new fjs.PropertyFormatter("stringInvertedContains"), + new fjs.PropertyFormatter("stringLowercase"), + new fjs.PropertyFormatter("stringUppercase"), + new fjs.PropertyFormatter("stringSpecialCharacters"), + new fjs.PropertyFormatter("stringNoSpaces"), + new fjs.PropertyFormatter("stringCapitalWord"), + new fjs.PropertyFormatter("stringCapitalSentence"), + new fjs.PropertyFormatter("stringPunctuation"), + new fjs.TextFormatter(""), + new fjs.PropertyFormatter("numberTooShort"), + new fjs.PropertyFormatter("numberTooLong"), + new fjs.PropertyFormatter("numberLengthInvalid"), + new fjs.PropertyFormatter("numberTooSmall"), + new fjs.PropertyFormatter("numberTooLarge"), + new fjs.PropertyFormatter("numberNotEqual"), + new fjs.PropertyFormatter("numberStep"), + new fjs.PropertyFormatter("numberStepOffset"), + new fjs.PropertyFormatter("numberStartsWith"), + new fjs.PropertyFormatter("numberEndsWith"), + new fjs.PropertyFormatter("numberContains"), + new fjs.PropertyFormatter("numberChoices"), + new fjs.PropertyFormatter("numberFloat"), + new fjs.PropertyFormatter("numberNegative"), + new fjs.PropertyFormatter("numberPositive"), + new fjs.PropertyFormatter("numberZero"), + new fjs.PropertyFormatter("numberNan"), + new fjs.PropertyFormatter("numberInvertedContains"), + new fjs.TextFormatter(""), + new fjs.PropertyFormatter("booleanTrue"), + new fjs.PropertyFormatter("booleanFalse"), + new fjs.TextFormatter(""), + new fjs.PropertyFormatter("arrayEmptyDisabled"), + new fjs.PropertyFormatter("arrayEmptyRequired"), + new fjs.PropertyFormatter("arrayTooShort"), + new fjs.PropertyFormatter("arrayTooLong"), + new fjs.PropertyFormatter("arrayLengthInvalid"), + new fjs.PropertyFormatter("arrayInvalidTypes"), + new fjs.PropertyFormatter("arrayDouble"), + new fjs.TextFormatter(""), + new fjs.PropertyFormatter("discordInvalidId"), + new fjs.PropertyFormatter("discordInvalidIdOptions"), + new fjs.PropertyFormatter("discordInvalidToken"), + new fjs.PropertyFormatter("colorInvalid"), + new fjs.PropertyFormatter("emojiTooShort"), + new fjs.PropertyFormatter("emojiTooLong"), + new fjs.PropertyFormatter("emojiCustom"), + new fjs.PropertyFormatter("emojiInvalid"), + new fjs.PropertyFormatter("urlInvalid"), + new fjs.PropertyFormatter("urlInvalidHttp"), + new fjs.PropertyFormatter("urlInvalidProtocol"), + new fjs.PropertyFormatter("urlInvalidHostname"), + new fjs.PropertyFormatter("urlInvalidExtension"), + new fjs.PropertyFormatter("urlInvalidPath"), + new fjs.PropertyFormatter("idNotUnique"), + new fjs.PropertyFormatter("idNonExistent"), + new fjs.TextFormatter(""), + new fjs.PropertyFormatter("invalidType"), + new fjs.PropertyFormatter("propertyMissing"), + new fjs.PropertyFormatter("propertyOptional"), + new fjs.PropertyFormatter("objectDisabled"), + new fjs.PropertyFormatter("nullInvalid"), + new fjs.PropertyFormatter("switchInvalidType"), + new fjs.PropertyFormatter("objectSwitchInvalid"), + new fjs.TextFormatter(""), + new fjs.PropertyFormatter("invalidLanguage"), + new fjs.PropertyFormatter("invalidButton"), + new fjs.PropertyFormatter("unusedOption"), + new fjs.PropertyFormatter("unusedQuestion"), + new fjs.PropertyFormatter("dropdownOption"), + new fjs.PropertyFormatter("customInvalidVersion"), + ]), + ]), + new fjs.ObjectFormatter("actions",true,[ + new fjs.ObjectFormatter("buttons",true,[ + new fjs.PropertyFormatter("create"), + new fjs.PropertyFormatter("close"), + new fjs.PropertyFormatter("delete"), + new fjs.PropertyFormatter("reopen"), + new fjs.PropertyFormatter("claim"), + new fjs.PropertyFormatter("unclaim"), + new fjs.PropertyFormatter("pin"), + new fjs.PropertyFormatter("unpin"), + new fjs.PropertyFormatter("clear"), + new fjs.PropertyFormatter("helpSwitchSlash"), + new fjs.PropertyFormatter("helpSwitchText"), + new fjs.PropertyFormatter("helpPage"), + new fjs.PropertyFormatter("withReason"), + new fjs.PropertyFormatter("withoutTranscript"), + ]), + new fjs.ObjectFormatter("titles",true,[ + new fjs.PropertyFormatter("created"), + new fjs.PropertyFormatter("close"), + new fjs.PropertyFormatter("delete"), + new fjs.PropertyFormatter("reopen"), + new fjs.PropertyFormatter("claim"), + new fjs.PropertyFormatter("unclaim"), + new fjs.PropertyFormatter("pin"), + new fjs.PropertyFormatter("unpin"), + new fjs.PropertyFormatter("rename"), + new fjs.PropertyFormatter("move"), + new fjs.PropertyFormatter("add"), + new fjs.PropertyFormatter("remove"), + new fjs.TextFormatter(""), + new fjs.PropertyFormatter("help"), + new fjs.PropertyFormatter("statsReset"), + new fjs.PropertyFormatter("blacklistAdd"), + new fjs.PropertyFormatter("blacklistRemove"), + new fjs.PropertyFormatter("blacklistGet"), + new fjs.PropertyFormatter("blacklistView"), + new fjs.PropertyFormatter("blacklistAddDm"), + new fjs.PropertyFormatter("blacklistRemoveDm"), + new fjs.PropertyFormatter("clear"), + new fjs.PropertyFormatter("clearTickets"), + new fjs.PropertyFormatter("roles"), + new fjs.TextFormatter(""), + new fjs.PropertyFormatter("autoclose"), + new fjs.PropertyFormatter("autocloseEnabled"), + new fjs.PropertyFormatter("autocloseDisabled"), + new fjs.PropertyFormatter("autodelete"), + new fjs.PropertyFormatter("autodeleteEnabled"), + new fjs.PropertyFormatter("autodeleteDisabled"), + new fjs.TextFormatter(""), + new fjs.PropertyFormatter("topicSet"), + new fjs.PropertyFormatter("prioritySet"), + new fjs.PropertyFormatter("priorityGet"), + new fjs.PropertyFormatter("transfer"), + ]), + new fjs.ObjectFormatter("descriptions",true,[ + new fjs.PropertyFormatter("create"), + new fjs.PropertyFormatter("close"), + new fjs.PropertyFormatter("delete"), + new fjs.PropertyFormatter("reopen"), + new fjs.PropertyFormatter("claim"), + new fjs.PropertyFormatter("unclaim"), + new fjs.PropertyFormatter("pin"), + new fjs.PropertyFormatter("unpin"), + new fjs.PropertyFormatter("rename"), + new fjs.PropertyFormatter("move"), + new fjs.PropertyFormatter("add"), + new fjs.PropertyFormatter("remove"), + new fjs.TextFormatter(""), + new fjs.PropertyFormatter("helpExplanation"), + new fjs.PropertyFormatter("statsReset"), + new fjs.PropertyFormatter("statsError"), + new fjs.PropertyFormatter("blacklistAdd"), + new fjs.PropertyFormatter("blacklistRemove"), + new fjs.PropertyFormatter("blacklistGetSuccess"), + new fjs.PropertyFormatter("blacklistGetEmpty"), + new fjs.PropertyFormatter("blacklistViewEmpty"), + new fjs.PropertyFormatter("blacklistViewTip"), + new fjs.PropertyFormatter("clearVerify"), + new fjs.PropertyFormatter("clearReady"), + new fjs.PropertyFormatter("rolesEmpty"), + new fjs.TextFormatter(""), + new fjs.PropertyFormatter("autocloseLeave"), + new fjs.PropertyFormatter("autocloseTimeout"), + new fjs.PropertyFormatter("autodeleteLeave"), + new fjs.PropertyFormatter("autodeleteTimeout"), + new fjs.PropertyFormatter("autocloseEnabled"), + new fjs.PropertyFormatter("autocloseDisabled"), + new fjs.PropertyFormatter("autodeleteEnabled"), + new fjs.PropertyFormatter("autodeleteDisabled"), + new fjs.TextFormatter(""), + new fjs.PropertyFormatter("ticketMessageLimit"), + new fjs.PropertyFormatter("ticketMessageAutoclose"), + new fjs.PropertyFormatter("ticketMessageAutodelete"), + new fjs.PropertyFormatter("panelReady"), + new fjs.TextFormatter(""), + new fjs.PropertyFormatter("topicSet"), + new fjs.PropertyFormatter("prioritySet"), + new fjs.PropertyFormatter("priorityGet"), + new fjs.PropertyFormatter("transfer"), + ]), + new fjs.ObjectFormatter("modal",true,[ + new fjs.PropertyFormatter("closePlaceholder"), + new fjs.PropertyFormatter("deletePlaceholder"), + new fjs.PropertyFormatter("reopenPlaceholder"), + new fjs.PropertyFormatter("claimPlaceholder"), + new fjs.PropertyFormatter("unclaimPlaceholder"), + new fjs.PropertyFormatter("pinPlaceholder"), + new fjs.PropertyFormatter("unpinPlaceholder"), + ]), + new fjs.ObjectFormatter("logs",true,[ + new fjs.PropertyFormatter("createLog"), + new fjs.PropertyFormatter("closeLog"), + new fjs.PropertyFormatter("closeDm"), + new fjs.PropertyFormatter("deleteLog"), + new fjs.PropertyFormatter("deleteDm"), + new fjs.PropertyFormatter("reopenLog"), + new fjs.PropertyFormatter("reopenDm"), + new fjs.PropertyFormatter("claimLog"), + new fjs.PropertyFormatter("claimDm"), + new fjs.PropertyFormatter("unclaimLog"), + new fjs.PropertyFormatter("unclaimDm"), + new fjs.PropertyFormatter("pinLog"), + new fjs.PropertyFormatter("pinDm"), + new fjs.PropertyFormatter("unpinLog"), + new fjs.PropertyFormatter("unpinDm"), + new fjs.PropertyFormatter("renameLog"), + new fjs.PropertyFormatter("renameDm"), + new fjs.PropertyFormatter("moveLog"), + new fjs.PropertyFormatter("moveDm"), + new fjs.PropertyFormatter("addLog"), + new fjs.PropertyFormatter("addDm"), + new fjs.PropertyFormatter("removeLog"), + new fjs.PropertyFormatter("removeDm"), + new fjs.TextFormatter(""), + new fjs.PropertyFormatter("blacklistAddLog"), + new fjs.PropertyFormatter("blacklistRemoveLog"), + new fjs.PropertyFormatter("blacklistAddDm"), + new fjs.PropertyFormatter("blacklistRemoveDm"), + new fjs.PropertyFormatter("clearLog"), + new fjs.TextFormatter(""), + new fjs.PropertyFormatter("transferLog"), + new fjs.PropertyFormatter("transferDm"), + new fjs.PropertyFormatter("prioritySetLog"), + new fjs.PropertyFormatter("prioritySetDm"), + new fjs.PropertyFormatter("roleUpdateLog"), + new fjs.PropertyFormatter("roleUpdateDm"), + ]), + ]), + new fjs.ObjectFormatter("transcripts",true,[ + new fjs.ObjectFormatter("success",true,[ + new fjs.PropertyFormatter("visit"), + new fjs.PropertyFormatter("ready"), + new fjs.PropertyFormatter("textFileDescription"), + new fjs.PropertyFormatter("htmlProgress"), + new fjs.TextFormatter(""), + new fjs.PropertyFormatter("createdChannel"), + new fjs.PropertyFormatter("createdCreator"), + new fjs.PropertyFormatter("createdParticipant"), + new fjs.PropertyFormatter("createdActiveAdmin"), + new fjs.PropertyFormatter("createdEveryAdmin"), + new fjs.PropertyFormatter("createdOther"), + ]), + new fjs.ObjectFormatter("errors",true,[ + new fjs.PropertyFormatter("retry"), + new fjs.PropertyFormatter("continue"), + new fjs.PropertyFormatter("backup"), + new fjs.PropertyFormatter("error"), + new fjs.PropertyFormatter("title"), + ]), + new fjs.ObjectFormatter("text",true,[ + new fjs.PropertyFormatter("messagesTitle"), + new fjs.PropertyFormatter("embedTitle"), + new fjs.PropertyFormatter("fileTitle"), + new fjs.PropertyFormatter("fieldsTitle"), + new fjs.PropertyFormatter("reactionsTitle"), + new fjs.PropertyFormatter("statsTitle"), + new fjs.PropertyFormatter("emptyContent"), + new fjs.PropertyFormatter("noTitle"), + new fjs.PropertyFormatter("noDesc"), + ]), + ]), + new fjs.ObjectFormatter("errors",true,[ + new fjs.ObjectFormatter("titles",true,[ + new fjs.PropertyFormatter("internalError"), + new fjs.PropertyFormatter("optionMissing"), + new fjs.PropertyFormatter("optionInvalid"), + new fjs.PropertyFormatter("unknownCommand"), + new fjs.PropertyFormatter("noPermissions"), + new fjs.PropertyFormatter("unknownTicket"), + new fjs.PropertyFormatter("deprecatedTicket"), + new fjs.PropertyFormatter("unknownOption"), + new fjs.PropertyFormatter("unknownPanel"), + new fjs.PropertyFormatter("notInGuild"), + new fjs.PropertyFormatter("channelRename"), + new fjs.PropertyFormatter("busy"), + new fjs.PropertyFormatter("permissionError"), + ]), + new fjs.ObjectFormatter("descriptions",true,[ + new fjs.PropertyFormatter("askForInfo"), + new fjs.PropertyFormatter("askForInfoResolve"), + new fjs.PropertyFormatter("internalError"), + new fjs.PropertyFormatter("optionMissing"), + new fjs.PropertyFormatter("optionInvalid"), + new fjs.PropertyFormatter("optionInvalidChoose"), + new fjs.PropertyFormatter("unknownCommand"), + new fjs.PropertyFormatter("noPermissions"), + new fjs.PropertyFormatter("noPermissionsList"), + new fjs.PropertyFormatter("noPermissionsCooldown"), + new fjs.PropertyFormatter("noPermissionsBlacklist"), + new fjs.PropertyFormatter("noPermissionsLimitGlobal"), + new fjs.PropertyFormatter("noPermissionsLimitGlobalUser"), + new fjs.PropertyFormatter("noPermissionsLimitOption"), + new fjs.PropertyFormatter("noPermissionsLimitOptionUser"), + new fjs.PropertyFormatter("unknownTicket"), + new fjs.PropertyFormatter("deprecatedTicket"), + new fjs.PropertyFormatter("notInGuild"), + new fjs.PropertyFormatter("channelRename"), + new fjs.PropertyFormatter("channelRenameSource"), + new fjs.PropertyFormatter("busy"), + new fjs.PropertyFormatter("closeBeforeMessage"), + new fjs.PropertyFormatter("closeBeforeAdminMessage"), + new fjs.PropertyFormatter("unableToCreateTicket"), + ]), + new fjs.ObjectFormatter("optionInvalidReasons",true,[ + new fjs.PropertyFormatter("stringRegex"), + new fjs.PropertyFormatter("stringMinLength"), + new fjs.PropertyFormatter("stringMaxLength"), + new fjs.PropertyFormatter("numberInvalid"), + new fjs.PropertyFormatter("numberMin"), + new fjs.PropertyFormatter("numberMax"), + new fjs.PropertyFormatter("numberDecimal"), + new fjs.PropertyFormatter("numberNegative"), + new fjs.PropertyFormatter("numberPositive"), + new fjs.PropertyFormatter("numberZero"), + new fjs.PropertyFormatter("channelNotFound"), + new fjs.PropertyFormatter("userNotFound"), + new fjs.PropertyFormatter("roleNotFound"), + new fjs.PropertyFormatter("memberNotFound"), + new fjs.PropertyFormatter("mentionableNotFound"), + new fjs.PropertyFormatter("channelType"), + new fjs.PropertyFormatter("notInGuild"), + ]), + new fjs.ObjectFormatter("permissions",true,[ + new fjs.PropertyFormatter("developer"), + new fjs.PropertyFormatter("owner"), + new fjs.PropertyFormatter("admin"), + new fjs.PropertyFormatter("moderator"), + new fjs.PropertyFormatter("support"), + new fjs.PropertyFormatter("member"), + new fjs.PropertyFormatter("discord-administrator"), + ]), + new fjs.ObjectFormatter("actionInvalid",true,[ + new fjs.PropertyFormatter("close"), + new fjs.PropertyFormatter("reopen"), + new fjs.PropertyFormatter("claim"), + new fjs.PropertyFormatter("unclaim"), + new fjs.PropertyFormatter("pin"), + new fjs.PropertyFormatter("unpin"), + new fjs.PropertyFormatter("add"), + new fjs.PropertyFormatter("remove"), + ]), + ]), + new fjs.ObjectFormatter("params",true,[ + new fjs.ObjectFormatter("uppercase",true,[ + new fjs.PropertyFormatter("ticket"), + new fjs.PropertyFormatter("tickets"), + new fjs.PropertyFormatter("reason"), + new fjs.PropertyFormatter("creator"), + new fjs.PropertyFormatter("remaining"), + new fjs.PropertyFormatter("added"), + new fjs.PropertyFormatter("removed"), + new fjs.PropertyFormatter("filter"), + new fjs.PropertyFormatter("method"), + new fjs.PropertyFormatter("type"), + new fjs.PropertyFormatter("blacklisted"), + new fjs.PropertyFormatter("panel"), + new fjs.PropertyFormatter("command"), + new fjs.PropertyFormatter("system"), + new fjs.PropertyFormatter("true"), + new fjs.PropertyFormatter("false"), + new fjs.PropertyFormatter("syntax"), + new fjs.PropertyFormatter("originalName"), + new fjs.PropertyFormatter("newName"), + new fjs.PropertyFormatter("until"), + new fjs.PropertyFormatter("validOptions"), + new fjs.PropertyFormatter("validPanels"), + new fjs.PropertyFormatter("autoclose"), + new fjs.PropertyFormatter("autodelete"), + new fjs.PropertyFormatter("startupDate"), + new fjs.PropertyFormatter("version"), + new fjs.PropertyFormatter("name"), + new fjs.PropertyFormatter("role"), + new fjs.PropertyFormatter("status"), + new fjs.PropertyFormatter("claimed"), + new fjs.PropertyFormatter("pinned"), + new fjs.PropertyFormatter("creationDate"), + new fjs.TextFormatter(""), + new fjs.PropertyFormatter("noone"), + new fjs.PropertyFormatter("open"), + new fjs.PropertyFormatter("closed"), + new fjs.PropertyFormatter("priority"), + new fjs.PropertyFormatter("participants"), + new fjs.PropertyFormatter("yes"), + new fjs.PropertyFormatter("no"), + new fjs.PropertyFormatter("option"), + new fjs.PropertyFormatter("topic"), + new fjs.PropertyFormatter("uptime"), + new fjs.PropertyFormatter("messages"), + new fjs.PropertyFormatter("embeds"), + new fjs.PropertyFormatter("files"), + new fjs.PropertyFormatter("components"), + new fjs.PropertyFormatter("cooldown"), + new fjs.PropertyFormatter("maxTickets"), + new fjs.PropertyFormatter("admins"), + new fjs.PropertyFormatter("roles"), + new fjs.PropertyFormatter("size"), + ]), + new fjs.ObjectFormatter("lowercase",true,[ + new fjs.PropertyFormatter("text"), + new fjs.PropertyFormatter("html"), + new fjs.PropertyFormatter("command"), + new fjs.PropertyFormatter("modal"), + new fjs.PropertyFormatter("button"), + new fjs.PropertyFormatter("dropdown"), + new fjs.PropertyFormatter("method"), + ]), + ]), + new fjs.ObjectFormatter("commands",true,[ + new fjs.PropertyFormatter("reason"), + new fjs.PropertyFormatter("help"), + new fjs.PropertyFormatter("panel"), + new fjs.PropertyFormatter("panelId"), + new fjs.PropertyFormatter("panelAutoUpdate"), + new fjs.PropertyFormatter("ticket"), + new fjs.PropertyFormatter("ticketId"), + new fjs.PropertyFormatter("close"), + new fjs.PropertyFormatter("delete"), + new fjs.PropertyFormatter("deleteNoTranscript"), + new fjs.PropertyFormatter("reopen"), + new fjs.PropertyFormatter("claim"), + new fjs.PropertyFormatter("claimUser"), + new fjs.PropertyFormatter("unclaim"), + new fjs.PropertyFormatter("pin"), + new fjs.PropertyFormatter("unpin"), + new fjs.TextFormatter(""), + new fjs.PropertyFormatter("move"), + new fjs.PropertyFormatter("moveId"), + new fjs.PropertyFormatter("rename"), + new fjs.PropertyFormatter("renameName"), + new fjs.PropertyFormatter("add"), + new fjs.PropertyFormatter("addUser"), + new fjs.PropertyFormatter("remove"), + new fjs.PropertyFormatter("removeUser"), + new fjs.TextFormatter(""), + new fjs.PropertyFormatter("blacklist"), + new fjs.PropertyFormatter("blacklistView"), + new fjs.PropertyFormatter("blacklistAdd"), + new fjs.PropertyFormatter("blacklistRemove"), + new fjs.PropertyFormatter("blacklistGet"), + new fjs.PropertyFormatter("blacklistGetUser"), + new fjs.PropertyFormatter("stats"), + new fjs.PropertyFormatter("statsReset"), + new fjs.PropertyFormatter("statsGlobal"), + new fjs.PropertyFormatter("statsUser"), + new fjs.PropertyFormatter("statsUserUser"), + new fjs.PropertyFormatter("statsTicket"), + new fjs.PropertyFormatter("statsTicketTicket"), + new fjs.TextFormatter(""), + new fjs.PropertyFormatter("clear"), + new fjs.PropertyFormatter("clearFilter"), + new fjs.ObjectFormatter("clearFilters",true,[ + new fjs.PropertyFormatter("all"), + new fjs.PropertyFormatter("open"), + new fjs.PropertyFormatter("close"), + new fjs.PropertyFormatter("claim"), + new fjs.PropertyFormatter("unclaim"), + new fjs.PropertyFormatter("pin"), + new fjs.PropertyFormatter("unpin"), + new fjs.PropertyFormatter("autoclose"), + ]), + new fjs.TextFormatter(""), + new fjs.PropertyFormatter("autoclose"), + new fjs.PropertyFormatter("autocloseDisable"), + new fjs.PropertyFormatter("autocloseEnable"), + new fjs.PropertyFormatter("autocloseEnableTime"), + new fjs.PropertyFormatter("autodelete"), + new fjs.PropertyFormatter("autodeleteDisable"), + new fjs.PropertyFormatter("autodeleteEnable"), + new fjs.PropertyFormatter("autodeleteEnableTime"), + new fjs.TextFormatter(""), + new fjs.PropertyFormatter("topic"), + new fjs.PropertyFormatter("topicSet"), + new fjs.PropertyFormatter("topicValue"), + new fjs.PropertyFormatter("topicList"), + new fjs.PropertyFormatter("priority"), + new fjs.PropertyFormatter("prioritySet"), + new fjs.PropertyFormatter("priorityValue"), + new fjs.PropertyFormatter("priorityGet"), + new fjs.PropertyFormatter("priorityList"), + new fjs.PropertyFormatter("transfer"), + new fjs.PropertyFormatter("transferUser"), + ]), + new fjs.ObjectFormatter("helpMenu",true,[ + new fjs.PropertyFormatter("help"), + new fjs.PropertyFormatter("ticket"), + new fjs.PropertyFormatter("close"), + new fjs.PropertyFormatter("delete"), + new fjs.PropertyFormatter("reopen"), + new fjs.PropertyFormatter("pin"), + new fjs.PropertyFormatter("unpin"), + new fjs.PropertyFormatter("move"), + new fjs.PropertyFormatter("rename"), + new fjs.PropertyFormatter("claim"), + new fjs.PropertyFormatter("unclaim"), + new fjs.PropertyFormatter("add"), + new fjs.PropertyFormatter("remove"), + new fjs.PropertyFormatter("panel"), + new fjs.PropertyFormatter("blacklistView"), + new fjs.PropertyFormatter("blacklistAdd"), + new fjs.PropertyFormatter("blacklistRemove"), + new fjs.PropertyFormatter("blacklistGet"), + new fjs.PropertyFormatter("statsGlobal"), + new fjs.PropertyFormatter("statsTicket"), + new fjs.PropertyFormatter("statsUser"), + new fjs.PropertyFormatter("statsReset"), + new fjs.PropertyFormatter("autocloseDisable"), + new fjs.PropertyFormatter("autocloseEnable"), + new fjs.PropertyFormatter("autodeleteDisable"), + new fjs.PropertyFormatter("autodeleteEnable"), + new fjs.ObjectFormatter("categories",true,[ + new fjs.PropertyFormatter("general"), + new fjs.PropertyFormatter("basicTicket"), + new fjs.PropertyFormatter("advancedTicket"), + new fjs.PropertyFormatter("userTicket"), + new fjs.PropertyFormatter("admin"), + new fjs.PropertyFormatter("advanced"), + new fjs.PropertyFormatter("extra"), + ]) + ]), + new fjs.ObjectFormatter("stats",true,[ + new fjs.ObjectFormatter("scopes",true,[ + new fjs.PropertyFormatter("global"), + new fjs.PropertyFormatter("system"), + new fjs.PropertyFormatter("user"), + new fjs.PropertyFormatter("ticket"), + new fjs.PropertyFormatter("participants"), + new fjs.PropertyFormatter("messages"), + ]), + new fjs.ObjectFormatter("properties",true,[ + new fjs.PropertyFormatter("ticketsCreated"), + new fjs.PropertyFormatter("ticketsClosed"), + new fjs.PropertyFormatter("ticketsDeleted"), + new fjs.PropertyFormatter("ticketsReopened"), + new fjs.PropertyFormatter("ticketsAutoclosed"), + new fjs.PropertyFormatter("ticketsClaimed"), + new fjs.PropertyFormatter("ticketsPinned"), + new fjs.PropertyFormatter("ticketsMoved"), + new fjs.PropertyFormatter("usersBlacklisted"), + new fjs.PropertyFormatter("transcriptsCreated"), + new fjs.PropertyFormatter("ticketsAutodeleted"), + new fjs.PropertyFormatter("ticketsTransferred"), + new fjs.PropertyFormatter("ticketVolume"), + new fjs.PropertyFormatter("averageTickets"), + new fjs.PropertyFormatter("currentTickets"), + new fjs.PropertyFormatter("age"), + new fjs.PropertyFormatter("responseTime"), + new fjs.PropertyFormatter("resolutionTime"), + new fjs.PropertyFormatter("createdOn"), + new fjs.PropertyFormatter("createdBy"), + new fjs.PropertyFormatter("closedOn"), + new fjs.PropertyFormatter("closedBy"), + new fjs.PropertyFormatter("claimedOn"), + new fjs.PropertyFormatter("claimedBy"), + new fjs.PropertyFormatter("pinnedOn"), + new fjs.PropertyFormatter("pinnedBy"), + new fjs.PropertyFormatter("deletedOn"), + new fjs.PropertyFormatter("deletedBy"), + ]), + new fjs.ObjectFormatter("roles",true,[ + new fjs.PropertyFormatter("developer"), + new fjs.PropertyFormatter("serverOwner"), + new fjs.PropertyFormatter("serverAdmin"), + new fjs.PropertyFormatter("moderator"), + new fjs.PropertyFormatter("support"), + new fjs.PropertyFormatter("member"), + ]) + ]), + new fjs.ObjectFormatter("panel",true,[ + new fjs.PropertyFormatter("selectTicket"), + new fjs.PropertyFormatter("selectRole"), + new fjs.PropertyFormatter("selectOption"), + ]), + new fjs.ObjectFormatter("priorities",true,[ + new fjs.PropertyFormatter("urgent"), + new fjs.PropertyFormatter("veryHigh"), + new fjs.PropertyFormatter("high"), + new fjs.PropertyFormatter("normal"), + new fjs.PropertyFormatter("low"), + new fjs.PropertyFormatter("veryLow"), + new fjs.PropertyFormatter("none"), + ]), +]) + +for (const language of fs.readdirSync(".docs/languages/")){ + if (!fs.existsSync("./languages/"+language)){ + console.log("language:",language,"does not exist yet in the primary ./languages/ folder. Unable to merge!") + continue + } + console.log("merging "+language+"...") + const original = JSON.parse(fs.readFileSync("./languages/"+language).toString()) + const newSentences = JSON.parse(fs.readFileSync(".docs/languages/"+language).toString()) + + for (const key of Object.keys(newSentences)){ + if (key.startsWith("_")) continue + try{ + const splitted = key.split(".") + let currentObject = original + splitted.forEach((property,index) => { + let shouldBeObject = (splitted.length-1 !== index) + if (shouldBeObject && typeof currentObject[property] == "object"){ + currentObject = currentObject[property] + }else if (shouldBeObject && typeof currentObject[property] == "undefined"){ + currentObject[property] = {} + currentObject = currentObject[property] + }else if (typeof currentObject[property] == "string" || typeof currentObject[property] == "undefined"){ + currentObject[property] = newSentences[key] + }else{ + console.log("Failed to merge key:",key,"in file:",language,"--> Invalid type:",typeof currentObject[property]) + } + }) + }catch(err){ + console.log("Failed to merge key:",key,"in file:",language) + } + } + original["_TRANSLATION"]["lastedited"] = new Date().toLocaleDateString("nl-BE",{day:"2-digit",month:"2-digit",year:"numeric"}) + original["_TRANSLATION"]["otversion"] = "v4.1.0" + const finalText = formatter.stringify(original) + fs.writeFileSync("./languages/"+language,finalText) +} \ No newline at end of file diff --git a/.gitignore b/.gitignore index 3a10e77..243efae 100644 --- a/.gitignore +++ b/.gitignore @@ -19,4 +19,5 @@ otdebug.txt .docs/* !.docs/createDocs.js +!.docs/mergeTranslations.js !.docs/typedoc-config.json \ No newline at end of file diff --git a/package.json b/package.json index dbb3e3e..b80f5ce 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,8 @@ "test": "node index.js --dev-config --dev-database --soft-plugins", "testsetup": "node index.js --cli --dev-config --dev-database --soft-plugins", "testnc": "node index.js --no-compile --dev-config --dev-database --soft-plugins", - "docs": "npx typedoc --options .docs/typedoc-config.json && node .docs/createDocs.js" + "docs": "npx typedoc --options .docs/typedoc-config.json && node .docs/createDocs.js", + "mergelang": "node .docs/mergeTranslations.js" }, "type": "commonjs", "license": "GPL-3.0-only",