From 88676161c94ab1a959bca917c954c81015d055e8 Mon Sep 17 00:00:00 2001 From: AlexBrin Date: Fri, 12 Jan 2018 18:46:07 +0400 Subject: [PATCH 1/2] Multilanguage --- .gitignore | 3 + package-lock.json | 179 ++++++++++++++++++ src/pocketnode/PocketNode.js | 3 +- src/pocketnode/Server.js | 42 ++-- src/pocketnode/command/Command.js | 4 +- src/pocketnode/command/CommandMap.js | 2 +- .../command/defaults/HelpCommand.js | 22 ++- .../command/defaults/PluginsCommand.js | 4 +- .../command/defaults/StopCommand.js | 2 +- src/pocketnode/error/InvalidParameterError.js | 2 +- src/pocketnode/level/Location.js | 11 +- src/pocketnode/level/Position.js | 4 +- src/pocketnode/permission/PermissionLevel.js | 11 +- src/pocketnode/player/Player.js | 44 +++-- src/pocketnode/plugin/PluginLoader.js | 2 +- src/pocketnode/plugin/PluginManager.js | 21 +- src/pocketnode/plugin/PluginManifest.js | 3 +- src/pocketnode/plugin/ScriptPluginLoader.js | 13 +- src/pocketnode/plugin/SourcePluginLoader.js | 15 +- src/pocketnode/resourcepacks/ResourcePack.js | 4 +- .../resourcepacks/ResourcePackManager.js | 15 +- .../resourcepacks/ZippedResourcePack.js | 12 +- src/pocketnode/resources/pocketnode.json | 3 +- src/pocketnode/utils/Translate/index.js | 44 +++++ src/pocketnode/utils/Translate/lang/en.json | 86 +++++++++ src/pocketnode/utils/Translate/lang/ru.json | 85 +++++++++ 26 files changed, 549 insertions(+), 87 deletions(-) create mode 100644 package-lock.json create mode 100644 src/pocketnode/utils/Translate/index.js create mode 100644 src/pocketnode/utils/Translate/lang/en.json create mode 100644 src/pocketnode/utils/Translate/lang/ru.json diff --git a/.gitignore b/.gitignore index 0d76520..0c5f07e 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,9 @@ npm-debug.log* yarn-debug.log* yarn-error.log* +# WebStorm +.idea/ + # Runtime data pids *.pid diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..39da141 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,179 @@ +{ + "name": "pocketnode", + "version": "0.0.3", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "adm-zip": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.7.tgz", + "integrity": "sha1-hgbCy/HEJs6MjsABdER/1Jtur8E=" + }, + "babylon": { + "version": "7.0.0-beta.19", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.19.tgz", + "integrity": "sha512-Vg0C9s/REX6/WIXN37UKpv5ZhRi6A4pjHlpkE34+8/a6c2W1Q692n3hmc+SZG5lKRnaExLUbxtJ1SVT+KaCQ/A==", + "dev": true + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", + "dev": true + }, + "catharsis": { + "version": "0.8.9", + "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.8.9.tgz", + "integrity": "sha1-mMyJDKZS3S7w5ws3klMQ/56Q/Is=", + "dev": true, + "requires": { + "underscore-contrib": "0.3.0" + } + }, + "dgram": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dgram/-/dgram-1.0.1.tgz", + "integrity": "sha1-N/OyAPgDOl/3WTAwicgc42G2UcM=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "js2xmlparser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-3.0.0.tgz", + "integrity": "sha1-P7YOqgicVED5MZ9RdgzNB+JJlzM=", + "dev": true, + "requires": { + "xmlcreate": "1.0.2" + } + }, + "jsdoc": { + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.5.5.tgz", + "integrity": "sha512-6PxB65TAU4WO0Wzyr/4/YhlGovXl0EVYfpKbpSroSj0qBxT4/xod/l40Opkm38dRHRdQgdeY836M0uVnJQG7kg==", + "dev": true, + "requires": { + "babylon": "7.0.0-beta.19", + "bluebird": "3.5.1", + "catharsis": "0.8.9", + "escape-string-regexp": "1.0.5", + "js2xmlparser": "3.0.0", + "klaw": "2.0.0", + "marked": "0.3.12", + "mkdirp": "0.5.1", + "requizzle": "0.2.1", + "strip-json-comments": "2.0.1", + "taffydb": "2.6.2", + "underscore": "1.8.3" + } + }, + "klaw": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-2.0.0.tgz", + "integrity": "sha1-WcEo4Nxc5BAgEVEZTuucv4WGUPY=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11" + } + }, + "marked": { + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.12.tgz", + "integrity": "sha512-k4NaW+vS7ytQn6MgJn3fYpQt20/mOgYM5Ft9BYMfQJDz2QT6yEeS9XJ8k2Nw8JTeWK/znPPW2n3UJGzyYEiMoA==", + "dev": true + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "raknet": { + "version": "git+https://github.com/PocketNode/RakNet.git#5b988e43032b0f22171e819aaa6e1c07aac6a971", + "requires": { + "dgram": "1.0.1" + } + }, + "requizzle": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.1.tgz", + "integrity": "sha1-aUPDUwxNmn5G8c3dUcFY/GcM294=", + "dev": true, + "requires": { + "underscore": "1.6.0" + }, + "dependencies": { + "underscore": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", + "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=", + "dev": true + } + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "taffydb": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.6.2.tgz", + "integrity": "sha1-fLy2S1oUG2ou/CxdLGe04VCyomg=", + "dev": true + }, + "time-stamp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.0.0.tgz", + "integrity": "sha1-lcakRTDhW6jW9KPsuMOj+sRto1c=" + }, + "underscore": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", + "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", + "dev": true + }, + "underscore-contrib": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/underscore-contrib/-/underscore-contrib-0.3.0.tgz", + "integrity": "sha1-ZltmwkeD+PorGMn4y7Dix9SMJsc=", + "dev": true, + "requires": { + "underscore": "1.6.0" + }, + "dependencies": { + "underscore": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", + "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=", + "dev": true + } + } + }, + "xmlcreate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-1.0.2.tgz", + "integrity": "sha1-+mv3YqYKQT+z3Y9LA8WyaSONMI8=", + "dev": true + } + } +} diff --git a/src/pocketnode/PocketNode.js b/src/pocketnode/PocketNode.js index 1771aee..f8b5f6d 100644 --- a/src/pocketnode/PocketNode.js +++ b/src/pocketnode/PocketNode.js @@ -25,9 +25,8 @@ class PocketNode { global.TRAVIS_BUILD = process.argv.join(" ").indexOf("--travis-build") !== -1; let server = new Server(this, logger, paths); - if(TRAVIS_BUILD === true){ + if(TRAVIS_BUILD === true) server.shutdown(); - } } } diff --git a/src/pocketnode/Server.js b/src/pocketnode/Server.js index cb50059..720b145 100644 --- a/src/pocketnode/Server.js +++ b/src/pocketnode/Server.js @@ -1,5 +1,6 @@ const MinecraftInfo = pocketnode("network/minecraft/Info"); const Config = pocketnode("utils/Config"); +const Translate = pocketnode("utils/Translate"); const PluginManager = pocketnode("plugin/PluginManager"); const SourcePluginLoader = pocketnode("plugin/SourcePluginLoader"); @@ -10,9 +11,6 @@ const BatchPacket = pocketnode("network/minecraft/protocol/BatchPacket"); const CommandMap = pocketnode("command/CommandMap"); const ConsoleCommandReader = pocketnode("command/ConsoleCommandReader"); -const HelpCommand = pocketnode("command/defaults/HelpCommand"); -const StopCommand = pocketnode("command/defaults/StopCommand"); -const PluginsCommand = pocketnode("command/defaults/PluginsCommand"); const Player = pocketnode("player/Player"); const PlayerList = pocketnode("player/PlayerList"); @@ -21,8 +19,12 @@ const ResourcePackManager = pocketnode("resourcepacks/ResourcePackManager"); const SFS = pocketnode("utils/SimpleFileSystem"); +const fs = require('fs'); + class Server { initVars(){ + global.Server = this; + this.PocketNode = {}; this._bannedIps = {}; @@ -98,6 +100,9 @@ class Server { this._config = new Config(this.getDataPath() + "pocketnode.json", Config.JSON, {}); this._debuggingLevel = this._config.getNested("debugging.level", 0); + this.translate = new Translate(this.getLang()); + this.getLogger().info(this.translate.getString("server.language", [this.getLang()])); + this.getLogger().setDebugging(this._debuggingLevel); //this._scheduler @@ -111,14 +116,15 @@ class Server { if(!TRAVIS_BUILD) process.stdout.write("\x1b]0;" + this.getName() + " " + this.getPocketNodeVersion() + "\x07"); - this.getLogger().debug("Server Id:", this._serverId); + this.getLogger().debug(this.translate.getString("server.id") + ":", this._serverId); - this.getLogger().info("Starting server on " + this.getIp() + ":" + this.getPort()); + this.getLogger().info(this.translate.getString("server.starting") + " " + this.getIp() + ":" + this.getPort()); this._raknetAdapter = new RakNetAdapter(this); - this.getLogger().info("This server is running " + this.getName() + " version " + this.getPocketNodeVersion() + " \"" + this.getCodeName() + "\" (API " + this.getApiVersion() + ")"); - this.getLogger().info("PocketNode is distributed under the GPLv3 License."); + this.getLogger().info( + this.translate.getString("server.running", [this.getName(), this.getPocketNodeVersion(), this.getCodeName(), this.getApiVersion()])); + this.getLogger().info(this.translate.getString("server.license")); this._commandMap = new CommandMap(this); this.registerDefaultCommands(); @@ -146,15 +152,23 @@ class Server { this._tickCounter = 0; - this.getLogger().info("Done ("+(Date.now() - this.PocketNode.START_TIME)+"ms)!"); + this.getLogger().info(this.translate.getString("server.done") + + " ("+(Date.now() - this.PocketNode.START_TIME)+"ms)!"); this.tickProcessor(); } registerDefaultCommands(){ - this.getCommandMap().registerCommand(new HelpCommand()); - this.getCommandMap().registerCommand(new StopCommand()); - this.getCommandMap().registerCommand(new PluginsCommand()); + let dir = __dirname + '/command/defaults'; + const commands = fs.readdirSync(dir); + commands.forEach(defaultCommand => { + defaultCommand = require(dir + '/' + defaultCommand); + this.getCommandMap().registerCommand(new defaultCommand()); + }); + } + + getTranslateString(node, vars = []) { + return this.translate.getString(node, vars); } /** @@ -167,7 +181,7 @@ class Server { shutdown(){ if(!this._running) return; - this.getLogger().info("Shutting down..."); + this.getLogger().info(this.translate.getString("server.shutdown")); this._raknetAdapter.shutdown(); this._pluginManager.disablePlugins(); @@ -306,6 +320,10 @@ class Server { return this._config.getNested("server.motd", this.PocketNode.NAME + " Server"); } + getLang() { + return this._config.getNested("server.lang", "en"); + } + /** * @return {Logger} */ diff --git a/src/pocketnode/command/Command.js b/src/pocketnode/command/Command.js index 411e438..2fcac6b 100644 --- a/src/pocketnode/command/Command.js +++ b/src/pocketnode/command/Command.js @@ -33,7 +33,9 @@ class Command { } getUsage(){ - let usage = TextFormat.RED + "Usage: /" + this.getName() + " "; + let usage = TextFormat.RED + + Server.translate.getString("commandInfo.usage") + + ": /" + this.getName() + " "; this.getArguments().forEach(argument => { if(argument.isRequired()){ diff --git a/src/pocketnode/command/CommandMap.js b/src/pocketnode/command/CommandMap.js index 81e07cf..52d88c2 100644 --- a/src/pocketnode/command/CommandMap.js +++ b/src/pocketnode/command/CommandMap.js @@ -31,7 +31,7 @@ class CommandMap { }); } }else{ - throw new InvalidParameterError("The command: " + command + " is not an instance of Command!"); + throw new InvalidParameterError(Server.translate.getString("commandInfo.invalidParameter", [command])); } } diff --git a/src/pocketnode/command/defaults/HelpCommand.js b/src/pocketnode/command/defaults/HelpCommand.js index 037ac55..a77bec9 100644 --- a/src/pocketnode/command/defaults/HelpCommand.js +++ b/src/pocketnode/command/defaults/HelpCommand.js @@ -3,7 +3,7 @@ const TextFormat = pocketnode("utils/TextFormat"); class HelpCommand extends Command { constructor(){ - super("help", "Show available commands for this server.", "pocketnode.command.help", ["?"]); + super("help", Server.translate.getString("command.help"), "pocketnode.command.help", ["?"]); this.addArgument("command", "string", false); this.addArgument("page", "integer", false); } @@ -45,7 +45,9 @@ class HelpCommand extends Command { if(page < 1) page = 1; - sender.sendMessage(TextFormat.YELLOW + "----- Help (" + page + " of " + Math.ceil(sorted_commands.length / linesPerPage) + ") -----"); + sender.sendMessage(TextFormat.YELLOW + "----- " + + Server.translate.getString("command.help.title") + + " (" + page + " of " + Math.ceil(sorted_commands.length / linesPerPage) + ") -----"); sorted_commands.slice(((page*linesPerPage)-linesPerPage), (page*linesPerPage)).forEach(command => { sender.sendMessage(TextFormat.GOLD + "/" + command.getName() + TextFormat.WHITE + ": " + command.getDescription()); }); @@ -53,12 +55,20 @@ class HelpCommand extends Command { if(sender.getServer().getCommandMap().commandExists(command.toLowerCase())){ let cmd = sender.getServer().getCommandMap().getCommand(command.toLowerCase()); if(true){ //test for perms - sender.sendMessage(TextFormat.YELLOW + "----- Help: /" + cmd.getName() + " -----"); - sender.sendMessage(TextFormat.GOLD + "Description: " + TextFormat.WHITE + cmd.getDescription()); - sender.sendMessage(TextFormat.GOLD + "Usage: " + TextFormat.WHITE + cmd.getUsage().substr(9)); + sender.sendMessage(TextFormat.YELLOW + "----- " + + Server.translate.getString("command.help.title") + +": /" + cmd.getName() + " -----"); + sender.sendMessage(TextFormat.GOLD + + Server.translate.getString("command.desc") + + ": " + TextFormat.WHITE + cmd.getDescription()); + sender.sendMessage(TextFormat.GOLD + + Server.translate.getString(command.usage) + + ": " + TextFormat.WHITE + cmd.getUsage().substr(9)); } }else{ - sender.sendMessage(TextFormat.RED + "No help for " + command.toLowerCase()); + sender.sendMessage(TextFormat.RED + + Server.translate.getString("command.help.noHelp") + + " " + command.toLowerCase()); } } } diff --git a/src/pocketnode/command/defaults/PluginsCommand.js b/src/pocketnode/command/defaults/PluginsCommand.js index c572671..a2f45f1 100644 --- a/src/pocketnode/command/defaults/PluginsCommand.js +++ b/src/pocketnode/command/defaults/PluginsCommand.js @@ -3,7 +3,7 @@ const TextFormat = pocketnode("utils/TextFormat"); class PluginsCommand extends Command { constructor(){ - super("plugins", "List the plugins you have enabled on your server.", "pocketnode.command.plugins", ["pl"]); + super("plugins", Server.translate.getString("command.plugins.desc"), "pocketnode.command.plugins", ["pl"]); } execute(sender, args){ @@ -14,7 +14,7 @@ class PluginsCommand extends Command { list += (plugin.isEnabled() ? TextFormat.GREEN : TextFormat.RED) + plugin.getFullName(); }); - sender.sendMessage("Plugin(s) (" + plugins.length + "): " + list); + sender.sendMessage(Server.translate.getString("command.plugins.text") + " (" + plugins.length + "): " + list); } } diff --git a/src/pocketnode/command/defaults/StopCommand.js b/src/pocketnode/command/defaults/StopCommand.js index 154eaae..b64eace 100644 --- a/src/pocketnode/command/defaults/StopCommand.js +++ b/src/pocketnode/command/defaults/StopCommand.js @@ -2,7 +2,7 @@ const Command = pocketnode("command/Command"); class StopCommand extends Command { constructor(){ - super("stop", "Stops the server.", "pocketnode.command.stop", ["shutdown"]); + super("stop", Server.translate.getString("command.stop.desc"), "pocketnode.command.stop", ["shutdown"]); } execute(sender, args){ diff --git a/src/pocketnode/error/InvalidParameterError.js b/src/pocketnode/error/InvalidParameterError.js index b25b5cb..6065559 100644 --- a/src/pocketnode/error/InvalidParameterError.js +++ b/src/pocketnode/error/InvalidParameterError.js @@ -1 +1 @@ -module.exports = class InvalidParameterError extends Error {} \ No newline at end of file +module.exports = class InvalidParameterError extends Error {}; \ No newline at end of file diff --git a/src/pocketnode/level/Location.js b/src/pocketnode/level/Location.js index e00b2d8..ea2647c 100644 --- a/src/pocketnode/level/Location.js +++ b/src/pocketnode/level/Location.js @@ -21,8 +21,8 @@ class Location extends Position initVars() { - this.yaw; - this.pitch; + this.yaw = 0; + this.pitch = 0; } /** @@ -35,11 +35,10 @@ class Location extends Position * @param {Number} pitch * @param {Level} level */ - constructor(x = 0, y = 0, z = 0, yaw = 0.0, pitch = 0.0, level = null) - { + constructor(x = 0, y = 0, z = 0, yaw = 0.0, pitch = 0.0, level = null) { + super(x, y, z, level); this.yaw = yaw; this.pitch = pitch; - super(x, y, z, level); } /** @@ -89,3 +88,5 @@ class Location extends Position } } + +module.exports = Location; \ No newline at end of file diff --git a/src/pocketnode/level/Position.js b/src/pocketnode/level/Position.js index c027eef..60437d3 100644 --- a/src/pocketnode/level/Position.js +++ b/src/pocketnode/level/Position.js @@ -35,9 +35,7 @@ class Position extends Vector3 */ constructor(x = 0, y = 0, z = 0, level = null) { - this.x = x; - this.y = y; - this.z = z; + super(x, y, z); this.level = level; } diff --git a/src/pocketnode/permission/PermissionLevel.js b/src/pocketnode/permission/PermissionLevel.js index 414191a..b526b5d 100644 --- a/src/pocketnode/permission/PermissionLevel.js +++ b/src/pocketnode/permission/PermissionLevel.js @@ -1,7 +1,8 @@ -const PermissionLevel = {}; -PermissionLevel.VISITOR = 0; -PermissionLevel.MEMBER = 1; -PermissionLevel.OPERATOR = 2; -PermissionLevel.CUSTOM = 3; +const PermissionLevel = { + VISITOR: 0, + MEMBER: 1, + OPERATOR: 2, + CUSTOM: 3 +}; module.exports = PermissionLevel; \ No newline at end of file diff --git a/src/pocketnode/player/Player.js b/src/pocketnode/player/Player.js index 88bf9af..8f43997 100644 --- a/src/pocketnode/player/Player.js +++ b/src/pocketnode/player/Player.js @@ -74,7 +74,7 @@ class Player extends CommandSender { getLeaveMessage(){ if(this.joined){ - return TextFormat.YELLOW + this.getName() + " has left the game"; + return TextFormat.YELLOW + Server.translate.getString("pocketnode.player.leave", [this.getName()]); } return ""; } @@ -131,7 +131,7 @@ class Player extends CommandSender { this.sendPlayStatus(PlayStatusPacket.LOGIN_FAILED_SERVER, true); } - this.close("", "Incompatible Protocol", false); + this.close("", Server.translate.getString("pocketnode.player.invalidProtocol"), false); return true; } @@ -150,7 +150,7 @@ class Player extends CommandSender { //todo: uuids if(Player.isValidUserName(packet.username)){ - this.close("", "Invalid Username"); + this.close("", Server.translate.getString("pocketnode.player.invalidUsername")); return true; } @@ -169,7 +169,7 @@ class Player extends CommandSender { ); if(!skin.isValid()){ - this.close("", "Invalid Skin"); + this.close("", Server.translate.getString("pocketnode.player.invalidSkin")); return true; } @@ -287,20 +287,22 @@ class Player extends CommandSender { if(this.closed) return; if(!isValid){ - this.close("", "Invalid Session"); + this.close("", Server.translate.getString("pocketnode.player.invalidSession")); return; } this._authenticated = isAuthenticated; if(!isAuthenticated){ - if(this.server.requiresAuthentication() && this.kick("This server requires authentication.", false)){ + if(this.server.requiresAuthentication() && this.kick( + Server.translate.getString("pocketnode.player.authRequired" + ), false)){ return; } - this.server.getLogger().debug(this.getName() + " is NOT logged into to Xbox Live"); + this.server.getLogger().debug(Server.translate.getString("pocketnode.player.xboxNotLogged", [this.getName()])); if(packet.xuid === ""){ - this.server.getLogger().error(this.getName() + " should have an XUID, but none found"); + this.server.getLogger().error(Server.translate.getString("pocketnode.player.xuidEmpty", [this.getName()])); } this._xuid = packet.xuid; } @@ -311,13 +313,14 @@ class Player extends CommandSender { _processLogin(){ for(let [,p] of this.server._loggedInPlayers){ if(p !== this && p._iusername === this._iusername){ - if(p.kick("Logged in from another location") === false){ - this.close(this.getLeaveMessage(), "Logged in from another location"); + if(p.kick(Server.translate.getString("pocketnode.player.loginAnotherLocation")) === false){ + this.close(this.getLeaveMessage(), + Server.translate.getString("pocketnode.player.loginAnotherLocation")); return; } }else if(p.loggedIn/* && uuids equal*/){ - if(p.kick("Logged in from another location") === false){ - this.close(this.getLeaveMessage(), "Logged in from another location"); + if(p.kick(Server.translate.getString("pocketnode.player.loginAnotherLocation")) === false){ + this.close(this.getLeaveMessage(), Server.translate.getString("pocketnode.player.loginAnotherLocation")); return; } } @@ -327,7 +330,7 @@ class Player extends CommandSender { this.loggedIn = true; this.server.onPlayerLogin(this); - this.server.getLogger().debug("Player logged in: "+this._username); + this.server.getLogger().debug(Server.translate.getString("pocketnode.player.logged", [this._username])); let pk = new ResourcePacksInfoPacket(); let manager = this.server.getResourcePackManager(); @@ -363,7 +366,7 @@ class Player extends CommandSender { if(packet.getName().toLowerCase() !== "batchpacket") this.server.getLogger().debug("Sending "+packet.getName()+" to "+(this.getName()!==""?this.getName():this._ip+":"+this._port)); if(!this.loggedIn && !packet.canBeSentBeforeLogin()){ - throw new Error("Attempted to send "+packet.getName()+" to "+this.getName()+" before they got logged in."); + throw new Error(Server.translate.getString("packet.attempt", [packet.getName(), this.getName()])); } let identifier = this.getSessionAdapter().sendPacket(packet, needACK, immediate); @@ -380,13 +383,14 @@ class Player extends CommandSender { let message; if(isAdmin){ if(true){//todo: not is banned - message = "Kicked by admin." + (reason !== "" ? " Reason: " + reason : ""); + message = Server.translate.getString("pocketnode.player.kick") + + (reason !== "" ? Server.translate.getString("pocketnode.player.reason", [reason]) : ""); }else{ message = reason; } }else{ if(reason === ""){ - message = "Unknown Reason."; + message = Server.translate.getString("pocketnode.player.unknownReason"); }else{ message = reason; } @@ -413,7 +417,9 @@ class Player extends CommandSender { try{ //save player data }catch(e){ - this.server.getLogger().error("Failed to save player data for "+this.getName()); + this.server.getLogger().error( + Server.translate.getString("pocketnode.player.failedSaveData", [this.getName()]) + ); this.server.getLogger().logError(e); } @@ -452,7 +458,9 @@ class Player extends CommandSender { pk.radius = this._viewDistance; this.dataPacket(pk); - this.server.getLogger().debug("Setting view distance for " + this.getName() + " to " + distance); + this.server.getLogger().debug( + Server.translate.getString("pocketnode.player.viewDistance", [this.getName(), distance]) + ); } completeLoginSequence(){ diff --git a/src/pocketnode/plugin/PluginLoader.js b/src/pocketnode/plugin/PluginLoader.js index a9caa83..fef490c 100644 --- a/src/pocketnode/plugin/PluginLoader.js +++ b/src/pocketnode/plugin/PluginLoader.js @@ -26,7 +26,7 @@ class PluginLoader { let missingMethods; if((missingMethods = ClassHasMethod(this.constructor, methods)) !== true){ - throw new Error("Plugin is missing the following method(s): " + missingMethods.join(", ")); + throw new Error(Server.translate.getString("pocketnode.plugin.missingMethod", [missingMethods.join(", ")])); } } } diff --git a/src/pocketnode/plugin/PluginManager.js b/src/pocketnode/plugin/PluginManager.js index 42e9f13..9dbd9b0 100644 --- a/src/pocketnode/plugin/PluginManager.js +++ b/src/pocketnode/plugin/PluginManager.js @@ -51,7 +51,9 @@ class PluginManager { return plugin; } }catch(e){ - this.server.getLogger().critical("Error trying to load " + manifest.getName()); + this.server.getLogger().critical( + Server.translate.getString("pocketnode.plugin.errorLoad", [manifest.getName()]) + ); this.server.getLogger().logError(e); return null; } @@ -89,26 +91,30 @@ class PluginManager { if(manifest instanceof PluginManifest){ let name = manifest.getName(); if(name.indexOf("pocketnode") !== -1 || name.indexOf("minecraft") !== -1 || name.indexOf("mojang") !== -1){ - this.server.getLogger().error("Plugin name contains invalid keyword!"); + this.server.getLogger().error(Server.translate.getString("pocketnode.plugin.invalidName")); return; }else if(name.indexOf(" ") !== -1){ - this.server.getLogger().warning("Warning for '" + name + "': It is discouraged to have a plugin with a space in the name!"); + this.server.getLogger().warning( + Server.translate.getString("pocketnode.plugin.spaceInName", [name])); } if(plugins.has(name) || this.getPlugin(name) instanceof Plugin){ - this.server.getLogger().error("There is already another plugin with the name '" + name + "'"); + this.server.getLogger().error( + Server.translate.getString("pocketnode.plugin.already", [name])); return; } if(!this.isCompatibleApi(manifest.getCompatibleApis())){ - this.server.getLogger().error("Cannot load '" + name + "': Incompatible Api!"); + this.server.getLogger().error( + Server.translate.getString("pocketnode.plugin.incompatibleApi", [name])); return; } plugins.set(name, file); } }catch(e){ - this.server.getLogger().error("There was an error loading a plugin."); + this.server.getLogger().error( + Server.translate.getString("pocketnode.plugin.errorLoading")); this.server.getLogger().logError(e); } }); @@ -121,7 +127,8 @@ class PluginManager { if((plugin = this.loadPlugin(file, loaders)) instanceof Plugin){ loadedPlugins.set(name, plugin); }else{ - this.server.getLogger().critical("Unable to load plugin: " + name); + this.server.getLogger().critical( + Server.translate.getString("pocketnode.plugin.unableLoad", [name])); } } } diff --git a/src/pocketnode/plugin/PluginManifest.js b/src/pocketnode/plugin/PluginManifest.js index e47adea..eb6c289 100644 --- a/src/pocketnode/plugin/PluginManifest.js +++ b/src/pocketnode/plugin/PluginManifest.js @@ -25,7 +25,8 @@ class PluginManifest { setManifest(data){ this.name = data.name.replace(/[^A-Za-z0-9 _.-]/g, ""); if(this.name === ""){ - throw new PluginException("Invalid PluginManifest name!"); + throw new PluginException( + Server.translate.getString("pocketnode.plugin.manifest.invalidName")); } this.name = this.name.replace(" ", "_"); this.version = data.version; diff --git a/src/pocketnode/plugin/ScriptPluginLoader.js b/src/pocketnode/plugin/ScriptPluginLoader.js index 5e89f67..667282b 100644 --- a/src/pocketnode/plugin/ScriptPluginLoader.js +++ b/src/pocketnode/plugin/ScriptPluginLoader.js @@ -16,11 +16,13 @@ class ScriptPluginLoader extends PluginLoader { if((manifest = this.getPluginManifest(file)) instanceof PluginManifest){ let logger = this.server.getLogger(); - logger.info("Loading plugin " + manifest.getFullName()); + logger.info( + Server.translate.getString("pocketnode.plugin.loading", manifest.getFullName())); let dataFolder = Path.dirname(file) + "/" + manifest.getName(); if(FileSystem.existsSync(dataFolder) && !FileSystem.lstatSync(dataFolder).isDirectory()){ - logger.warning("Data folder '" + dataFolder + "' for plugin " + manifest.getName() + " exists but is not a directory"); + logger.warning( + Server.translate.getString("pocketnode.plugin.folderNotEx", [dataFolder, manifest.getName()])); return null; } @@ -61,8 +63,8 @@ class ScriptPluginLoader extends PluginLoader { enablePlugin(plugin){ if(plugin instanceof PluginBase && !plugin.isEnabled()){ - this.server.getLogger().info("Enabling " + plugin.getFullName()); - + this.server.getLogger().info( + Server.translate.getString("pocketnode.plugin.enable", [plugin.getFullName()])); plugin.setEnabled(true); //todo: event stuff: call PluginEnableEvent @@ -71,7 +73,8 @@ class ScriptPluginLoader extends PluginLoader { disablePlugin(plugin){ if(plugin instanceof PluginBase && plugin.isEnabled()){ - this.server.getLogger().info("Disabling " + plugin.getFullName()); + this.server.getLogger().info( + Server.translate.getString("pocketnode.plugin.disable", [plugin.getFullName()])); //todo: event stuff: call PluginDisableEvent diff --git a/src/pocketnode/plugin/SourcePluginLoader.js b/src/pocketnode/plugin/SourcePluginLoader.js index e893159..48e742a 100644 --- a/src/pocketnode/plugin/SourcePluginLoader.js +++ b/src/pocketnode/plugin/SourcePluginLoader.js @@ -17,11 +17,13 @@ class SourcePluginLoader extends PluginLoader { if((manifest = this.getPluginManifest(file)) instanceof PluginManifest){ let logger = this.server.getLogger(); - logger.info("Loading plugin " + manifest.getFullName()); + logger.info( + Server.translate.getString("pocketnode.plugin.loading", manifest.getFullName())); let dataFolder = Path.dirname(file) + "/" + manifest.getName(); if(FileSystem.existsSync(dataFolder) && !FileSystem.lstatSync(dataFolder).isDirectory()){ - logger.warning("Data folder '" + dataFolder + "' for plugin " + manifest.getName() + " exists but is not a directory"); + logger.warning( + Server.translate.getString("pocketnode.plugin.folderNotEx", [dataFolder, manifest.getName()])); return null; } @@ -36,7 +38,8 @@ class SourcePluginLoader extends PluginLoader { return plugin; }else{ - logger.warning("Couldn't load plugin " + manifest.getName() + ": main not found!"); + logger.warning( + Server.translate.getString("pocketnode.plugin.couldntLoad", [manifest.getName()])); return null; } } @@ -65,7 +68,8 @@ class SourcePluginLoader extends PluginLoader { enablePlugin(plugin){ if(plugin instanceof PluginBase && !plugin.isEnabled()){ - this.server.getLogger().info("Enabling " + plugin.getFullName()); + this.server.getLogger().info( + Server.translate.getString("pocketnode.plugin.enable", [plugin.getFullName()])); plugin.setEnabled(true); @@ -75,7 +79,8 @@ class SourcePluginLoader extends PluginLoader { disablePlugin(plugin){ if(plugin instanceof PluginBase && plugin.isEnabled()){ - this.server.getLogger().info("Disabling " + plugin.getFullName()); + this.server.getLogger().info( + Server.translate.getString("pocketnode.plugin.disable", [plugin.getFullName()])); //todo: event stuff: call PluginDisableEvent diff --git a/src/pocketnode/resourcepacks/ResourcePack.js b/src/pocketnode/resourcepacks/ResourcePack.js index 154600c..f6d92b1 100644 --- a/src/pocketnode/resourcepacks/ResourcePack.js +++ b/src/pocketnode/resourcepacks/ResourcePack.js @@ -13,7 +13,9 @@ class ResourcePack { let missingMethods; if((missingMethods = ClassHasMethod(this.constructor, methods)) !== true){ - throw new Error(this.constructor.name + " is missing the following method(s): " + missingMethods.join(", ")); + throw new Error( + Server.translate.getString("pocketnode.resourcePack.missingMethod", + [this.constructor.name, missingMethods.join(", ")])); } } } diff --git a/src/pocketnode/resourcepacks/ResourcePackManager.js b/src/pocketnode/resourcepacks/ResourcePackManager.js index 52d1ab4..fa48148 100644 --- a/src/pocketnode/resourcepacks/ResourcePackManager.js +++ b/src/pocketnode/resourcepacks/ResourcePackManager.js @@ -32,7 +32,8 @@ class ResourcePackManager { this._config = new Config(path + "resource_packs.json", Config.JSON, {}); this._forceResources = Boolean(this._config.get("force", false)); - server.getLogger().info("Loading resource packs..."); + server.getLogger().info( + Server.translate.getString("pocketnode.resourcePack.loading")); this._config.get("entries", []).forEach((pack, priority) => { try{ @@ -40,7 +41,8 @@ class ResourcePackManager { if(SFS.fileExists(packPath)){ let newPack = null; if(SFS.isDir(packPath)){ - server.getLogger().warning("Skipped resource entry "+pack+" due to directory resource packs currently unsupported") + server.getLogger().warning( + server.translate.getString("pocketnode.resourcePack.dirNotSupported", [pack])) }else{ let newPack; switch(SFS.getExtension(packPath)){ @@ -49,7 +51,8 @@ class ResourcePackManager { newPack = new ZippedResourcePack(packPath); break; default: - server.getLogger().warning("Skipped resource entry "+pack+" due to format not supported"); + server.getLogger().warning( + server.translate.getString("pocketnode.resourcePack.formatNotSupported", [pack])); break; } @@ -59,14 +62,16 @@ class ResourcePackManager { } } }else{ - server.getLogger().warning("Skipped resource entry "+pack+" due to file or directory not found"); + server.getLogger().warning( + server.translate.getString("pocketnode.resourcePack.fileOrDirNotFound", [pack])); } }catch(e){ server.getLogger().logError(e); } }); - server.getLogger().debug("Successfully loaded "+this._resourcePacks.length+" resource packs"); + server.getLogger().debug( + server.translate.getString("pocketnode.resourcePack.success", [this._resourcePacks.length])); } resourcePacksRequired(){ diff --git a/src/pocketnode/resourcepacks/ZippedResourcePack.js b/src/pocketnode/resourcepacks/ZippedResourcePack.js index 4a14606..e147e0a 100644 --- a/src/pocketnode/resourcepacks/ZippedResourcePack.js +++ b/src/pocketnode/resourcepacks/ZippedResourcePack.js @@ -18,7 +18,8 @@ class ZippedResourcePack extends ResourcePack { this._path = zipPath; if(!SFS.fileExists(zipPath)){ - throw new Error("Couldn't open "+zipPath+": file not found"); + throw new Error( + Server.translate.getString("pocketnode.resourcePack.fileNotFound", [zipPath])); } let zip; @@ -26,13 +27,15 @@ class ZippedResourcePack extends ResourcePack { try{ zip = new AdmZip(zipPath); }catch(e){ - throw new Error("Error opening resource pack: "+zipPath); + throw new Error( + Server.translate.getString("pocketnode.resourcePack.errorOpening", [zipPath])); } let manifest; if((manifest = zip.readFile("manifest.json")) === null){ - throw new Error("Could not load resource pack from "+zipPath+": manifest.json not found in the archive root"); + throw new Error( + Server.translate.getString("pocketnode.resourcePack.manifest.notFound", [zipPath])); } this._data = SFS.readFile(zipPath); @@ -41,7 +44,8 @@ class ZippedResourcePack extends ResourcePack { manifest = JSON.parse(manifest.toString()); if(!ZippedResourcePack.validManifest(manifest)){ - throw new Error("Could not load resource pack from "+zipPath+": manifest.json is invalid or incomplete"); + throw new Error( + Server.translate.getString("pocketnode.resourcePack.manifest.invalid", [zipPath])); } this._manifest = manifest; diff --git a/src/pocketnode/resources/pocketnode.json b/src/pocketnode/resources/pocketnode.json index 3077694..47b4c83 100644 --- a/src/pocketnode/resources/pocketnode.json +++ b/src/pocketnode/resources/pocketnode.json @@ -6,7 +6,8 @@ "whitelist": false, "max-players": 20, "gamemode": 1, - "online-mode": true + "online-mode": true, + "lang": "en" }, "network": { "batch-threshold": 256, diff --git a/src/pocketnode/utils/Translate/index.js b/src/pocketnode/utils/Translate/index.js new file mode 100644 index 0000000..070cfa4 --- /dev/null +++ b/src/pocketnode/utils/Translate/index.js @@ -0,0 +1,44 @@ +const fs = require('fs'); + +class Translate { + initVars() { + this.lang = {}; + } + + constructor(lang) { + let file = __dirname + '/lang/' + lang + '.json'; + + if(!fs.existsSync(file)) + file = __dirname + '/lang/en.json'; + + this.lang = JSON.parse(fs.readFileSync(file).toString()); + } + + getString(node, vars = []) { + let parts = node.split("."); + if(!this.lang[parts[0]]){ + return "\\NULL"; + } + + let string = this.lang[parts.shift()]; + + while(parts.length > 0) { + let part = parts.shift(); + if(typeof string[part] !== 'undefined') + string = string[part]; + else + return "\\NULL"; + } + + let i = 0; + vars.forEach(_var => { + string = string.replace('{var' + i + '}', _var); + i++; + }); + + return string + } + +} + +module.exports = Translate; \ No newline at end of file diff --git a/src/pocketnode/utils/Translate/lang/en.json b/src/pocketnode/utils/Translate/lang/en.json new file mode 100644 index 0000000..e18cfbe --- /dev/null +++ b/src/pocketnode/utils/Translate/lang/en.json @@ -0,0 +1,86 @@ +{ + "command": { + "plugins": { + "desc": "List the plugins you have enabled on your server.", + "text": "Plugin(s)" + }, + "help": { + "desc": "Show available commands for this server.", + "title": "Help", + "noHelp": "No help for" + }, + "stop": { + "desc": "Stops the server." + } + }, + "commandInfo": { + "desc": "Description", + "usage": "Usage", + "invalidParameter": "The command: {var0} is not an instance of Command!" + }, + "server": { + "done": "Done", + "id": "Server Id", + "starting": "Starting server on", + "running": "This server is running {var0} version {var1} \"{var2}\" (API {var3})", + "license": "PocketNode is distributed under the GPLv3 License", + "loadConfig": "Loading server configuration...", + "shutdown": "Shutting down...", + "language": "Language: {var0}" + }, + + "pocketnode": { + "player": { + "logged": "Player logged in: {var0}", + "leave": "{var0} has left the game", + "kick": "Kicked by admin.", + "reason": "Reason:", + "unknownReason": "Unknown Reason.", + "invalidProtocol": "Incompatible Protocol", + "invalidUsername": "Invalid Username", + "invalidSkin": "Invalid Skin", + "invalidSession": "Invalid Session", + "authRequired": "This server requires authentication.", + "xboxNotLogged": "{var0} is NOT logged into to Xbox Live", + "xuidEmpty": "{var0} should have an XUID, but none found", + "loginAnotherLocation": "Logged in from another location", + "failedSaveData": "Failed to save player data for {var0}", + "viewDistance": "Setting view distance for {var0} to {var1}" + }, + "packet": { + "attempt": "Attempted to send {var0} to {var1} before they got logged in." + }, + "plugin": { + "manifest": { + "invalidName": "Invalid PluginManifest name" + }, + "loading": "Loading plugin {var0}", + "enable": "Enabling {var0}", + "disable": "Disabling {var0}", + "couldntLoad": "Couldn't load plugin {var0}: main not found!", + "folderNotEx": "Data folder '{var0}' for plugin {var1} exists but is not a directory", + "missingMethod": "Plugin is missing the following method(s): {var0}", + "errorLoad": "Error trying to load {var0}", + "errorLoading": "There was an error loading a plugin.", + "unableLoad": "Unable to load plugin {var0}", + "invalidName": "Plugin name contains invalid keyword!", + "spaceInName": "Warning for '{var0}': It is discouraged to have a plugin with a space in the name!", + "already": "There is already another plugin with the name '{var0}'", + "incompatibleApi": "Cannot load '{var0}': Incompatible Api!" + }, + "resourcePack": { + "manifest": { + "notFound": "Could not load resource pack from {var0}: manifest.json not found in the archive root", + "invalid": "Could not load resource pack from {var0}: manifest.json is invalid or incomplete" + }, + "loading": "Loading resource packs...", + "missingMethod": "{var0} is missing the following method(s): {var1}", + "dirNotSupported": "Skipped resource entry {var0} due to directory resource packs currently unsupported", + "formatNotSupported": "Skipped resource entry {var0} due to format not supported", + "fileOrDirNotFound": "Skipped resource entry {var0} due to file or directory not found", + "fileNotFound": "Couldn't open {var0}: file not found", + "errorOpening": "Error opening resource pack {var0}", + "success": "Successfully loaded {var0} resource packs" + } + } +} \ No newline at end of file diff --git a/src/pocketnode/utils/Translate/lang/ru.json b/src/pocketnode/utils/Translate/lang/ru.json new file mode 100644 index 0000000..05c5177 --- /dev/null +++ b/src/pocketnode/utils/Translate/lang/ru.json @@ -0,0 +1,85 @@ +{ + "command": { + "plugins": { + "desc": "Список плагинов на этом сервере", + "text": "Плагины" + }, + "help": { + "desc": "Подскажет команды на этом сервере", + "title": "Помощь", + "noHelp": "Нет помощи для" + }, + "stop": { + "desc": "Остановка сервера" + } + }, + "commandInfo": { + "desc": "Описание", + "usage": "Использование", + "invalidParameter": "Команда {var0} не наследует Command!" + }, + "server": { + "done": "Загружено", + "id": "ID сервера", + "starting": "Запуск сервера на", + "running": "Сервер {var0} запущен на версии {var1} \"{var2}\" (API {var3})", + "license": "PocketNode распространяется под лицензией GPLv3", + "shutdown": "Выключение...", + "language": "Язык: {var0}" + }, + + "pocketnode": { + "player": { + "logged": "Игрок {var0} вошел в систему", + "leave": "{var0} Вышел из игры", + "kick": "Выгнан администратором.", + "reason": "Причина:", + "unknownReason": "Неизвестная причина.", + "invalidProtocol": "Несовместимый протокол", + "invalidUsername": "Неверное имя пользователя", + "invalidSkin": "Неверный скин", + "invalidSession": "Неверная сессия", + "authRequired": "Этот сервер требует аутентификации", + "xboxNotLogged": "{var0} НЕ вошел в XBOX", + "xuidEmpty": "{var0} должен иметь XUID, но он не найден", + "loginAnotherLocation": "Вход с другого места", + "failedSaveData": "Ошибка сохранения данных для {var0}", + "viewDistance": "Для {var0} установлена дистанция обзора на {var1}" + }, + "packet": { + "attempt": "Attempted to send {var0} to {var1} before they got logged in." + }, + "plugin": { + "manifest": { + "invalidName": "Invalid PluginManifest name" + }, + "loading": "Loading plugin {var0}", + "enable": "Enabling {var0}", + "disable": "Disabling {var0}", + "couldntLoad": "Couldn't load plugin {var0}: main not found!", + "folderNotEx": "Data folder '{var0}' for plugin {var1} exists but is not a directory", + "missingMethod": "Plugin is missing the following method(s): {var0}", + "errorLoad": "Error trying to load {var0}", + "errorLoading": "There was an error loading a plugin.", + "unableLoad": "Unable to load plugin {var0}", + "invalidName": "Plugin name contains invalid keyword!", + "spaceInName": "Warning for '{var0}': It is discouraged to have a plugin with a space in the name!", + "already": "There is already another plugin with the name '{var0}'", + "incompatibleApi": "Cannot load '{var0}': Incompatible Api!" + }, + "resourcePack": { + "manifest": { + "notFound": "Could not load resource pack from {var0}: manifest.json not found in the archive root", + "invalid": "Could not load resource pack from {var0}: manifest.json is invalid or incomplete" + }, + "loading": "Загрузка ресурс-паков...", + "missingMethod": "{var0} is missing the following method(s): {var1}", + "dirNotSupported": "Skipped resource entry {var0} due to directory resource packs currently unsupported", + "formatNotSupported": "Skipped resource entry {var0} due to format not supported", + "fileOrDirNotFound": "Skipped resource entry {var0} due to file or directory not found", + "fileNotFound": "Couldn't open {var0}: file not found", + "errorOpening": "Error opening resource pack {var0}", + "success": "Successfully loaded {var0} resource packs" + } + } +} \ No newline at end of file From 8a63c78b356350483a14515f442a8aac6f375df1 Mon Sep 17 00:00:00 2001 From: AlexBrin Date: Fri, 12 Jan 2018 18:58:48 +0400 Subject: [PATCH 2/2] Fix --- src/pocketnode/command/defaults/HelpCommand.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pocketnode/command/defaults/HelpCommand.js b/src/pocketnode/command/defaults/HelpCommand.js index a77bec9..96de9da 100644 --- a/src/pocketnode/command/defaults/HelpCommand.js +++ b/src/pocketnode/command/defaults/HelpCommand.js @@ -3,7 +3,7 @@ const TextFormat = pocketnode("utils/TextFormat"); class HelpCommand extends Command { constructor(){ - super("help", Server.translate.getString("command.help"), "pocketnode.command.help", ["?"]); + super("help", Server.translate.getString("command.help.desc"), "pocketnode.command.help", ["?"]); this.addArgument("command", "string", false); this.addArgument("page", "integer", false); }