From 98485cc5ad428faf6fe292a09067acf9e2a643ca Mon Sep 17 00:00:00 2001 From: bubblobill <45483160+bubblobill@users.noreply.github.com> Date: Sat, 20 Jan 2024 01:56:42 +0800 Subject: [PATCH] Added a utility class for generating a report on i18n strings. Specifically to identify duplicated value strings --- .../net/rptools/maptool/language/I18N.java | 1 + .../rptools/maptool/language/I18nTools.java | 94 +++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 src/main/java/net/rptools/maptool/language/I18nTools.java diff --git a/src/main/java/net/rptools/maptool/language/I18N.java b/src/main/java/net/rptools/maptool/language/I18N.java index 66ab6143d5..95f8cf0ce8 100644 --- a/src/main/java/net/rptools/maptool/language/I18N.java +++ b/src/main/java/net/rptools/maptool/language/I18N.java @@ -54,6 +54,7 @@ public class I18N { static { // Put here to make breakpointing easier. :) BUNDLE = ResourceBundle.getBundle("net.rptools.maptool.language.i18n"); + I18nTools report = new I18nTools(false); } /** diff --git a/src/main/java/net/rptools/maptool/language/I18nTools.java b/src/main/java/net/rptools/maptool/language/I18nTools.java new file mode 100644 index 0000000000..204157da9e --- /dev/null +++ b/src/main/java/net/rptools/maptool/language/I18nTools.java @@ -0,0 +1,94 @@ +/* + * This software Copyright by the RPTools.net development team, and + * licensed under the Affero GPL Version 3 or, at your option, any later + * version. + * + * MapTool Source Code is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public + * License * along with this source Code. If not, please visit + * and specifically the Affero license + * text at . + */ +package net.rptools.maptool.language; + +import java.util.*; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +public class I18nTools { + private static ResourceBundle BUNDLE = null; + private static final Logger log = LogManager.getLogger(I18nTools.class); + private static final String ACCELERATOR_EXTENSION = ".accel"; + private static final String DESCRIPTION_EXTENSION = ".description"; + private static Map> valueKeys = new LinkedHashMap<>(); + private static List accelerators = new ArrayList<>(); + private static List descriptions = new ArrayList<>(); + + public I18nTools(boolean report) { + if (!report) { + return; + } + BUNDLE = ResourceBundle.getBundle("net.rptools.maptool.language.i18n"); + generateReport(); + } + + private void generateReport() { + Set keys = BUNDLE.keySet(); + StringBuilder sb = new StringBuilder(); + for (String key : keys) { + if (key.endsWith(ACCELERATOR_EXTENSION)) { + accelerators.add(key); + } + if (key.endsWith(DESCRIPTION_EXTENSION)) { + descriptions.add(key); + } + String value = I18N.getText(key).trim(); + + if (valueKeys.containsKey(value)) { + List keyList = valueKeys.get(value); + keyList.add(key); + valueKeys.replace(value, keyList); + } else { + List keyList = new ArrayList<>(); + keyList.add(key); + if (valueKeys.containsKey(value + ":")) { + keyList.add(":"); + } + valueKeys.put(value, keyList); + } + } + if (!accelerators.isEmpty()) { + sb.append("Accelerators\n_____________\n"); + for (String key : accelerators) { + sb.append(key + "\n"); + } + } + if (!descriptions.isEmpty()) { + sb.append("\n\nDescriptions\n_____________\n"); + for (String key : descriptions) { + sb.append(key + "\n"); + } + } + sb.append("\n\nDuplicates\n_____________"); + + /* alpha-sort the list */ + LinkedHashMap> result = new LinkedHashMap<>(); + valueKeys.entrySet().stream() + .sorted(Map.Entry.comparingByKey()) + .forEachOrdered(entry -> result.put(entry.getKey(), entry.getValue())); + + for (String value : result.keySet()) { + List keyList = result.get(value); + if (keyList.size() > 1) { + sb.append("\n" + value + ":"); + for (int i = 0; i < keyList.size(); i++) { + sb.append("\n\t" + keyList.get(i)); + } + } + } + log.info(sb.toString()); + } +}