From f4bc4322f050afc362fa1e0090dbee425609e423 Mon Sep 17 00:00:00 2001 From: ljacqu Date: Fri, 15 Apr 2016 23:03:01 +0200 Subject: [PATCH] Create export/import messages task - Allows communication with a web interface (PHP) to translate messages - Saving via import still needs to be improved --- .../translation/ExportMessagesTask.java | 60 +++++++++++++++ .../translation/ImportMessagesTask.java | 75 +++++++++++++++++++ .../messages/translation/LanguageExport.java | 19 +++++ .../messages/translation/MessageExport.java | 22 ++++++ .../translation/export/export-is-written-here | 0 5 files changed, 176 insertions(+) create mode 100644 src/tools/messages/translation/ExportMessagesTask.java create mode 100644 src/tools/messages/translation/ImportMessagesTask.java create mode 100644 src/tools/messages/translation/LanguageExport.java create mode 100644 src/tools/messages/translation/MessageExport.java create mode 100644 src/tools/messages/translation/export/export-is-written-here diff --git a/src/tools/messages/translation/ExportMessagesTask.java b/src/tools/messages/translation/ExportMessagesTask.java new file mode 100644 index 000000000..e6bd5c2cf --- /dev/null +++ b/src/tools/messages/translation/ExportMessagesTask.java @@ -0,0 +1,60 @@ +package messages.translation; + +import com.google.gson.Gson; +import fr.xephi.authme.output.MessageKey; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; +import utils.FileUtils; +import utils.ToolTask; +import utils.ToolsConstants; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +/** + * Task to export all messages for translation purposes. + */ +public class ExportMessagesTask implements ToolTask { + + private final Gson gson = new Gson(); + + @Override + public String getTaskName() { + return "exportMessages"; + } + + @Override + public void execute(Scanner scanner) { + FileConfiguration defaultMessages = YamlConfiguration.loadConfiguration( + new File(ToolsConstants.MAIN_RESOURCES_ROOT + "messages/messages_en.yml")); + + File[] messageFiles = new File(ToolsConstants.MAIN_RESOURCES_ROOT + "messages").listFiles(); + if (messageFiles == null || messageFiles.length == 0) { + throw new IllegalStateException("Could not read messages folder"); + } + + for (File file : messageFiles) { + String code = file.getName().substring("messages_".length(), file.getName().length() - ".yml".length()); + exportLanguage(code, defaultMessages, YamlConfiguration.loadConfiguration(file)); + } + } + + private void exportLanguage(String code, FileConfiguration defaultMessages, FileConfiguration messageFile) { + List list = new ArrayList<>(); + for (MessageKey key : MessageKey.values()) { + list.add(new MessageExport(key.getKey(), key.getTags(), getString(key, defaultMessages), + getString(key, messageFile))); + } + + FileUtils.writeToFile( + ToolsConstants.TOOLS_SOURCE_ROOT + "messages/translation/export/messages_" + code + ".json", + gson.toJson(new LanguageExport(code, list))); + } + + private static String getString(MessageKey key, FileConfiguration configuration) { + return configuration.getString(key.getKey(), ""); + } + +} diff --git a/src/tools/messages/translation/ImportMessagesTask.java b/src/tools/messages/translation/ImportMessagesTask.java new file mode 100644 index 000000000..4b75c9f29 --- /dev/null +++ b/src/tools/messages/translation/ImportMessagesTask.java @@ -0,0 +1,75 @@ +package messages.translation; + +import com.google.common.io.Resources; +import com.google.gson.Gson; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; +import org.yaml.snakeyaml.DumperOptions; +import utils.ToolTask; +import utils.ToolsConstants; + +import java.io.File; +import java.io.IOException; +import java.lang.reflect.Field; +import java.net.URL; +import java.nio.charset.Charset; +import java.util.Scanner; + +/** + * Imports a message file from a JSON export. + */ +public class ImportMessagesTask implements ToolTask { + + private static final String MESSAGES_FOLDER = ToolsConstants.MAIN_RESOURCES_ROOT + "messages/"; + private Gson gson = new Gson(); + + @Override + public String getTaskName() { + return "importMessages"; + } + + @Override + public void execute(Scanner scanner) { + System.out.println("Enter URL to export from"); + String url = scanner.nextLine(); + LanguageExport languageExport = getLanguageExportFromUrl(url); + if (languageExport == null) { + throw new IllegalStateException("An error occurred: constructed language export is null"); + } + + mergeExportIntoFile(languageExport); + System.out.println("Saved to messages file for code '" + languageExport.code + "'"); + } + + private LanguageExport getLanguageExportFromUrl(String url) { + try { + URL uri = new URL(url); + String json = Resources.toString(uri, Charset.forName("UTF-8")); + return gson.fromJson(json, LanguageExport.class); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + private void mergeExportIntoFile(LanguageExport export) { + String languageCode = export.code; + File file = new File(MESSAGES_FOLDER + "messages_" + languageCode + ".yml"); + if (!file.exists()) { + throw new IllegalStateException("Messages file for language code " + languageCode + " does not exist"); + } + FileConfiguration fileConfiguration = YamlConfiguration.loadConfiguration(file); + + for (MessageExport messageExport : export.messages) { + fileConfiguration.set(messageExport.key, messageExport.translatedMessage); + } + try { + Field dumperOptionsField = YamlConfiguration.class.getDeclaredField("yamlOptions"); + dumperOptionsField.setAccessible(true); + DumperOptions options = (DumperOptions) dumperOptionsField.get(fileConfiguration); + options.setDefaultScalarStyle(DumperOptions.ScalarStyle.SINGLE_QUOTED); + fileConfiguration.save(file); + } catch (IOException | NoSuchFieldException | IllegalAccessException e) { + throw new IllegalStateException(e); + } + } +} diff --git a/src/tools/messages/translation/LanguageExport.java b/src/tools/messages/translation/LanguageExport.java new file mode 100644 index 000000000..3be0fa448 --- /dev/null +++ b/src/tools/messages/translation/LanguageExport.java @@ -0,0 +1,19 @@ +package messages.translation; + +import java.util.Collections; +import java.util.List; + +/** + * Export of a language's messages. + */ +public class LanguageExport { + + public final String code; + public final List messages; + + public LanguageExport(String code, List messages) { + this.code = code; + this.messages = Collections.unmodifiableList(messages); + } + +} diff --git a/src/tools/messages/translation/MessageExport.java b/src/tools/messages/translation/MessageExport.java new file mode 100644 index 000000000..da2c08743 --- /dev/null +++ b/src/tools/messages/translation/MessageExport.java @@ -0,0 +1,22 @@ +package messages.translation; + +import fr.xephi.authme.util.StringUtils; + +/** + * Container class for one translatable message. + */ +public class MessageExport { + + public final String key; + public final String tags; + public final String defaultMessage; + public final String translatedMessage; + + public MessageExport(String key, String[] tags, String defaultMessage, String translatedMessage) { + this.key = key; + this.tags = StringUtils.join(",", tags); + this.defaultMessage = defaultMessage; + this.translatedMessage = translatedMessage; + } + +} diff --git a/src/tools/messages/translation/export/export-is-written-here b/src/tools/messages/translation/export/export-is-written-here new file mode 100644 index 000000000..e69de29bb