diff --git a/pom.xml b/pom.xml
index 39457243b..b458765d5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -302,6 +302,7 @@
config.yml
wiki.json
+ languages/translators.json
tags/*.json
languages/**/*.yml
diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/github/Contributor.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/github/Contributor.java
index d1c8f9fcd..0ab9c5f14 100644
--- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/github/Contributor.java
+++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/github/Contributor.java
@@ -38,7 +38,6 @@ public class Contributor {
private final TriStateOptional headTexture = TriStateOptional.createNew();
private Optional uuid = Optional.empty();
- private boolean immutable = false;
/**
* This creates a new {@link Contributor} with the given ingame name and GitHub profile.
@@ -84,9 +83,7 @@ public class Contributor {
Validate.notNull(role, "The role cannot be null!");
Validate.isTrue(commits >= 0, "Contributions cannot be negative");
- if (!immutable || role.startsWith("translator,")) {
- contributions.put(role, commits);
- }
+ contributions.put(role, commits);
}
/**
@@ -259,13 +256,4 @@ public class Contributor {
public int getPosition() {
return -getTotalContributions();
}
-
- /**
- * This marks this {@link Contributor} as immutable.
- * Immutable {@link Contributor Contributors} will no longer be assigned any contributions.
- * This is useful when you want to prevent some commits from counting twice.
- */
- public void setImmutable() {
- immutable = true;
- }
}
diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/github/GitHubService.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/github/GitHubService.java
index 701800576..86ee1d2a7 100644
--- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/github/GitHubService.java
+++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/github/GitHubService.java
@@ -9,6 +9,7 @@ import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.TimeUnit;
+import java.util.logging.Level;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
@@ -16,7 +17,6 @@ import javax.annotation.Nullable;
import org.apache.commons.lang.Validate;
import io.github.thebusybiscuit.cscorelib2.config.Config;
-import io.github.thebusybiscuit.slimefun4.core.services.localization.Translators;
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
import io.github.thebusybiscuit.slimefun4.utils.HeadTexture;
@@ -88,7 +88,12 @@ public class GitHubService {
addContributor("nahkd123", "&aWinner of the 2020 Addon Jam");
// Translators
- new Translators(this);
+ try {
+ TranslatorsReader translators = new TranslatorsReader(this);
+ translators.load();
+ } catch (Exception x) {
+ SlimefunPlugin.logger().log(Level.SEVERE, "Failed to read 'translators.json'", x);
+ }
}
private void addContributor(@Nonnull String name, @Nonnull String role) {
@@ -113,6 +118,17 @@ public class GitHubService {
return contributor;
}
+ @Nonnull
+ public Contributor addContributor(@Nonnull String username, @Nonnull String role, int commits) {
+ Validate.notNull(username, "Username must not be null.");
+ Validate.notNull(role, "Role should not be null.");
+ Validate.isTrue(commits >= 0, "Commit count cannot be negative.");
+
+ Contributor contributor = contributors.computeIfAbsent(username, key -> new Contributor(username));
+ contributor.setContributions(role, commits);
+ return contributor;
+ }
+
private void loadConnectors(boolean logging) {
this.logging = logging;
addDefaultContributors();
diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/github/TranslatorsReader.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/github/TranslatorsReader.java
new file mode 100644
index 000000000..58a6e7c29
--- /dev/null
+++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/github/TranslatorsReader.java
@@ -0,0 +1,63 @@
+package io.github.thebusybiscuit.slimefun4.core.services.github;
+
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.nio.charset.StandardCharsets;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.stream.Collectors;
+
+import javax.annotation.Nonnull;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
+
+/**
+ * This class reads all translators of this project.
+ * A translator is equivalent to the class {@link Contributor} as it also uses that internally.
+ *
+ * @author TheBusyBiscuit
+ *
+ * @see Contributor
+ *
+ */
+final class TranslatorsReader {
+
+ private final GitHubService github;
+
+ // We maybe should switch to a json file in our resources folder at some point.
+ TranslatorsReader(@Nonnull GitHubService github) {
+ this.github = github;
+ }
+
+ public void load() {
+ InputStream inputStream = SlimefunPlugin.class.getResourceAsStream("/languages/translators.json");
+
+ try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8))) {
+ JsonParser parser = new JsonParser();
+ JsonElement element = parser.parse(reader.lines().collect(Collectors.joining("")));
+ JsonObject json = element.getAsJsonObject();
+
+ for (Map.Entry entry : json.entrySet()) {
+ String languageCode = entry.getKey();
+
+ if (entry.getValue().isJsonArray()) {
+ String role = ContributorRole.TRANSLATOR.getId() + ',' + languageCode;
+ JsonArray users = entry.getValue().getAsJsonArray();
+
+ for (JsonElement user : users) {
+ github.addContributor(user.getAsString(), role, 0);
+ }
+ }
+ }
+ } catch (Exception e) {
+ SlimefunPlugin.logger().log(Level.SEVERE, "Failed to load translators.json file", e);
+ }
+ }
+
+}
diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/localization/Translators.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/localization/Translators.java
deleted file mode 100644
index 7179dc1c7..000000000
--- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/services/localization/Translators.java
+++ /dev/null
@@ -1,220 +0,0 @@
-package io.github.thebusybiscuit.slimefun4.core.services.localization;
-
-import javax.annotation.Nonnull;
-import javax.annotation.ParametersAreNonnullByDefault;
-
-import io.github.thebusybiscuit.slimefun4.core.services.github.Contributor;
-import io.github.thebusybiscuit.slimefun4.core.services.github.GitHubService;
-
-/**
- * This class holds all {@link Translators} of this project.
- * A translator is equivalent to the class {@link Contributor} as it also uses that internally.
- *
- * @author TheBusyBiscuit
- *
- * @see Contributor
- *
- */
-public class Translators {
-
- private final GitHubService github;
-
- // We maybe should switch to a json file in our resources folder at some point.
- public Translators(@Nonnull GitHubService github) {
- this.github = github;
-
- // Translators - German
- addTranslator("TheBusyBiscuit", SupportedLanguage.GERMAN, false);
- addTranslator("MeerBiene", SupportedLanguage.GERMAN, true);
- addTranslator("daro2404", SupportedLanguage.GERMAN, true);
-
- // Translators - French
- addTranslator("JustDams", "D4ms_", SupportedLanguage.FRENCH, true);
- addTranslator("edkerforne", SupportedLanguage.FRENCH, true);
- addTranslator("tnthomastn", SupportedLanguage.FRENCH, true);
- addTranslator("Noumaa", SupportedLanguage.FRENCH, true);
- addTranslator("ishi-sama", SupportedLanguage.FRENCH, true);
- addTranslator("amarcais53", SupportedLanguage.FRENCH, true);
- addTranslator("NinoFutur", SupportedLanguage.FRENCH, true);
- addTranslator("TheRetix", SupportedLanguage.FRENCH, true);
- addTranslator("Aeris1One", SupportedLanguage.FRENCH, true);
- addTranslator("Aomitsu", SupportedLanguage.FRENCH, true);
-
- // Translators - Italian
- addTranslator("xXDOTTORXx", SupportedLanguage.ITALIAN, true);
- addTranslator("Sfiguz7", SupportedLanguage.ITALIAN, false);
- addTranslator("ThatsCube", SupportedLanguage.ITALIAN, true);
- addTranslator("alessandrobasi", SupportedLanguage.ITALIAN, true);
- addTranslator("dracrus", SupportedLanguage.ITALIAN, true);
- addTranslator("prolletto64", SupportedLanguage.ITALIAN, true);
-
- // Translators - Spanish
- addTranslator("Luu7", "_Luu", SupportedLanguage.SPANISH, true);
- addTranslator("Vravinite", SupportedLanguage.SPANISH, true);
- addTranslator("NotUmBr4", SupportedLanguage.SPANISH, true);
- addTranslator("dbzjjoe", SupportedLanguage.SPANISH, true);
- addTranslator("DaHolyCheese", SupportedLanguage.SPANISH, true);
- addTranslator("d-l-n", SupportedLanguage.SPANISH, true);
-
- // Translators - Latvian
- addTranslator("AgnisT", "NIKNAIZ", SupportedLanguage.LATVIAN, true);
-
- // Translators - Hungarian
- addTranslator("andris155", SupportedLanguage.HUNGARIAN, true);
- addTranslator("KingDeadZ", SupportedLanguage.HUNGARIAN, true);
- addTranslator("poma123", SupportedLanguage.HUNGARIAN, false);
-
- // Translators - Vietnamese
- addTranslator("HSGamer", SupportedLanguage.VIETNAMESE, false);
- addTranslator("JustMangoT", "JFF_JustMango", SupportedLanguage.VIETNAMESE, true);
- addTranslator("Julie-Sigtuna", SupportedLanguage.VIETNAMESE, true);
- addTranslator("nahkd123", SupportedLanguage.VIETNAMESE, true);
- addTranslator("JustAPieOP", SupportedLanguage.VIETNAMESE, true);
- addTranslator("that4life", SupportedLanguage.VIETNAMESE, true);
- addTranslator("CactusTheGuy", SupportedLanguage.VIETNAMESE, true);
- addTranslator("hniV", SupportedLanguage.VIETNAMESE, true);
-
- // Translators - Slovak
- addTranslator("KillerXCoder", SupportedLanguage.SLOVAK, true);
- addTranslator("PixelHotDog", SupportedLanguage.SLOVAK, true);
-
- // Translators - Czech
- addTranslator("Nekomitsuki", SupportedLanguage.CZECH, true);
- addTranslator("GGGEDR", SupportedLanguage.CZECH, true);
- addTranslator("jakmanda05", SupportedLanguage.CZECH, true);
- addTranslator("Aile-Minicraftcz", SupportedLanguage.CZECH, true);
- addTranslator("Tengoblinekcz", SupportedLanguage.CZECH, true);
- addTranslator("sirhCCC", SupportedLanguage.CZECH, true);
- addTranslator("Thezerix", SupportedLanguage.CZECH, true);
- addTranslator("IsLineCZ", SupportedLanguage.CZECH, true);
- addTranslator("MrFriggo", SupportedLanguage.CZECH, true);
- addTranslator("100petr", SupportedLanguage.CZECH, true);
- addTranslator("frfole", SupportedLanguage.CZECH, true);
- addTranslator("bobhenl", SupportedLanguage.CZECH, true);
- addTranslator("janvrska", SupportedLanguage.CZECH, true);
- addTranslator("LirCZE", SupportedLanguage.CZECH, true);
-
- // Translators - Russian
- addTranslator("SoSeDiK", SupportedLanguage.RUSSIAN, false);
- addTranslator("KostaTV", SupportedLanguage.RUSSIAN, true);
- addTranslator("TomWiskis", "MrWiskis", SupportedLanguage.RUSSIAN, true);
- addTranslator("cyb3rm4n", "GP_CyberMan", SupportedLanguage.RUSSIAN, true);
-
- // Translators - Ukrainian
- addTranslator("SoSeDiK", SupportedLanguage.UKRAINIAN, false);
-
- // Translators - Swedish
- addTranslator("NihilistBrew", "ma1yang2", SupportedLanguage.SWEDISH, false);
- addTranslator("Tra-sh", "TurretTrash", SupportedLanguage.SWEDISH, true);
-
- // Translators - Finnish
- addTranslator("developer-pseudo", SupportedLanguage.FINNISH, true);
-
- // Translators - Dutch
- addTranslator("Dr4gonD", "DragonD", SupportedLanguage.DUTCH, true);
- addTranslator("svr333", SupportedLanguage.DUTCH, false);
- addTranslator("PabloMarcendo", SupportedLanguage.DUTCH, true);
- addTranslator("milvantiou", SupportedLanguage.DUTCH, true);
- addTranslator("Sven313D", SupportedLanguage.DUTCH, true);
- addTranslator("TypischTeun", SupportedLanguage.DUTCH, true);
- addTranslator("peppower", SupportedLanguage.DUTCH, true);
-
- // Translators - Danish
- addTranslator("Mini-kun", SupportedLanguage.DANISH, true);
-
- // Translators - Polish
- addTranslator("ascpixel", "kbartek_", SupportedLanguage.POLISH, true);
- addTranslator("Xylitus", SupportedLanguage.POLISH, true);
- addTranslator("Wirusiu", SupportedLanguage.POLISH, true);
- addTranslator("koloksk", SupportedLanguage.POLISH, true);
-
- // Translators - Chinese (China)
- addTranslator("StarWishsama", "StarWish_Sama", SupportedLanguage.CHINESE_CHINA, false);
- addTranslator("Rothes", SupportedLanguage.CHINESE_CHINA, true);
- addTranslator("Chihsiao", SupportedLanguage.CHINESE_CHINA, true);
- addTranslator("Jiejue233", SupportedLanguage.CHINESE_CHINA, true);
-
- // Translators - Chinese (Taiwan)
- addTranslator("BrineYT", "HeroBrineKing", SupportedLanguage.CHINESE_TAIWAN, true);
- addTranslator("mio9", SupportedLanguage.CHINESE_TAIWAN, true);
- addTranslator("ALiangLiang", SupportedLanguage.CHINESE_TAIWAN, true);
-
- // Translators - Arabic
- addTranslator("mohkamfer", "AgentBabbie", SupportedLanguage.ARABIC, false);
-
- // Translators - Hebrew
- addTranslator("dhtdht020", SupportedLanguage.HEBREW, true);
- addTranslator("Eylonnn", SupportedLanguage.HEBREW, true);
- addTranslator("sarhatabaot", SupportedLanguage.HEBREW, false);
- addTranslator("Timotiyadeyhakesem", SupportedLanguage.HEBREW, true);
- addTranslator("PaladinBear", SupportedLanguage.HEBREW, true);
- addTranslator("Molioron", SupportedLanguage.HEBREW, true);
- addTranslator("McAlmog", SupportedLanguage.HEBREW, true);
-
- // Translators - Japanese
- addTranslator("bito-blosh", "Bloshop", SupportedLanguage.JAPANESE, false);
-
- // Translators - Korean
- addTranslator("kwonms871", SupportedLanguage.KOREAN, true);
- addTranslator("yumjunstar", SupportedLanguage.KOREAN, true);
- addTranslator("BlWon", SupportedLanguage.KOREAN, true);
- addTranslator("20181241", SupportedLanguage.KOREAN, true);
- addTranslator("kudansul", SupportedLanguage.KOREAN, true);
-
- // Translators - Indonesian
- addTranslator("diradho", SupportedLanguage.INDONESIAN, false);
- addTranslator("Frozenkamui", SupportedLanguage.INDONESIAN, false);
- addTranslator("aril3721", SupportedLanguage.INDONESIAN, false);
- addTranslator("JunederZ", SupportedLanguage.INDONESIAN, false);
- addTranslator("EnderWingZ", SupportedLanguage.INDONESIAN, false);
-
- // Translators - Thai
- addTranslator("phoomin2012", SupportedLanguage.THAI, false);
- addTranslator("film2860", SupportedLanguage.THAI, false);
- addTranslator("Rafrael17k", SupportedLanguage.THAI, false);
- addTranslator("Cupjok", SupportedLanguage.THAI, false);
-
- // Translators - Turkish
- addTranslator("Yunuskrn", SupportedLanguage.TURKISH, true);
- addTranslator("LinoxGH", "ajan_12", SupportedLanguage.TURKISH, false);
-
- // Translators - Macedonian
- addTranslator("TheSilentPro", SupportedLanguage.MACEDONIAN, true);
-
- // Translators - Bulgarian
- addTranslator("DNBGlol", SupportedLanguage.BULGARIAN, true);
- addTranslator("Pukejoy", SupportedLanguage.BULGARIAN, true);
-
- // Translators - Tagalog
- addTranslator("sccooottttie", SupportedLanguage.TAGALOG, true);
-
- // Translators - Portuguese
- addTranslator("Gusstavo", SupportedLanguage.PORTUGUESE_PORTUGAL, true);
-
- // Translators - Portuguese (Brazil)
- addTranslator("G4stavoM1ster", SupportedLanguage.PORTUGUESE_BRAZIL, true);
- addTranslator("yurinogueira", SupportedLanguage.PORTUGUESE_BRAZIL, true);
- addTranslator("Sakanas", SupportedLanguage.PORTUGUESE_BRAZIL, true);
- addTranslator("krazybeat", SupportedLanguage.PORTUGUESE_BRAZIL, true);
- addTranslator("FaolanMalcadh", SupportedLanguage.PORTUGUESE_BRAZIL, true);
- addTranslator("Gusstavo", SupportedLanguage.PORTUGUESE_BRAZIL, true);
- addTranslator("Day-OS", SupportedLanguage.PORTUGUESE_BRAZIL, true);
- addTranslator("ooicram", SupportedLanguage.PORTUGUESE_BRAZIL, true);
- addTranslator("Sxigames", SupportedLanguage.PORTUGUESE_BRAZIL, true);
- }
-
- @ParametersAreNonnullByDefault
- private void addTranslator(String name, SupportedLanguage lang, boolean lock) {
- addTranslator(name, name, lang, lock);
- }
-
- @ParametersAreNonnullByDefault
- private void addTranslator(String username, String minecraftName, SupportedLanguage lang, boolean lock) {
- Contributor contributor = github.addContributor(minecraftName, "https://github.com/" + username, "translator," + lang.getLanguageId(), 0);
-
- if (lock) {
- contributor.setImmutable();
- }
- }
-
-}
diff --git a/src/main/resources/languages/translators.json b/src/main/resources/languages/translators.json
new file mode 100644
index 000000000..99825f674
--- /dev/null
+++ b/src/main/resources/languages/translators.json
@@ -0,0 +1,178 @@
+{
+ "de" : [
+ "TheBusyBiscuit",
+ "MeerBiene",
+ "daro2404"
+ ],
+ "fr" : [
+ "JustDams",
+ "edkerforne",
+ "tnthomastn",
+ "Noumaa",
+ "ishi-sama",
+ "amarcais53",
+ "NinoFutur",
+ "TheRetix",
+ "Aeris1One",
+ "Aomitsu"
+ ],
+ "es" : [
+ "Luu7",
+ "Vravinite",
+ "NotUmBr4",
+ "dbzjjoe",
+ "DaHolyCheese",
+ "d-l-n"
+ ],
+ "it" : [
+ "Sfiguz7",
+ "xXDOTTORXx",
+ "ThatsCube",
+ "alessandrobasi",
+ "dracrus",
+ "prolletto64"
+ ],
+ "lv" : [
+ "AgnisT"
+ ],
+ "hu" : [
+ "poma123",
+ "andris155",
+ "KingDeadZ"
+ ],
+ "vi" : [
+ "HSGamer",
+ "JustMangoT",
+ "Julie-Sigtuna",
+ "nahkd123",
+ "JustAPieOP",
+ "that4life",
+ "CactusTheGuy",
+ "hniV"
+ ],
+ "sk" : [
+ "KillerXCoder",
+ "PixelHotDog"
+ ],
+ "cs" : [
+ "Nekomitsuki",
+ "GGGEDR",
+ "jakmanda05",
+ "Aile-Minicraftcz",
+ "Tengoblinekcz",
+ "sirhCCC",
+ "Thezerix",
+ "IsLineCZ",
+ "MrFriggo",
+ "100petr",
+ "frfole",
+ "bobhenl",
+ "janvrska",
+ "LirCZE"
+ ],
+ "ru" : [
+ "SoSeDiK",
+ "KostaTV",
+ "TomWiskis",
+ "cyb3rm4n"
+ ],
+ "sv" : [
+ "NihilistBrew",
+ "Tra-sh"
+ ],
+ "fi" : [
+ "developer-pseudo"
+ ],
+ "nl" : [
+ "Dr4gonD",
+ "svr333",
+ "PabloMarcendo",
+ "milvantiou",
+ "Sven313D",
+ "TypischTeun",
+ "peppower"
+ ],
+ "da" : [
+ "Mini-kun"
+ ],
+ "pl" : [
+ "ascpixel",
+ "Xylitus",
+ "Wirusiu",
+ "koloksk"
+ ],
+ "zh-CN" : [
+ "StarWishsama",
+ "Rothes",
+ "Chihsiao",
+ "Jiejue233"
+ ],
+ "zh-TW" : [
+ "BrineYT",
+ "mio9",
+ "ALiangLiang"
+ ],
+ "ar" : [
+ "mohkamfer"
+ ],
+ "he" : [
+ "dhtdht020",
+ "Eylonnn",
+ "sarhatabaot",
+ "Timotiyadeyhakesem",
+ "PaladinBear",
+ "Molioron",
+ "McAlmog"
+ ],
+ "ja" : [
+ "bito-blosh"
+ ],
+ "ko" : [
+ "kwonms871",
+ "yumjunstar",
+ "BlWon",
+ "20181241",
+ "kudansul"
+ ],
+ "id" : [
+ "diradho",
+ "Frozenkamui",
+ "aril3721",
+ "JunederZ",
+ "EnderWingZ"
+ ],
+ "th" : [
+ "phoomin2012",
+ "film2860",
+ "Rafrael17k",
+ "Cupjok"
+ ],
+ "tr" : [
+ "Yunuskrn",
+ "LinoxGH"
+ ],
+ "mk" : [
+ "TheSilentPro"
+ ],
+ "bg" : [
+ "DNBGlol",
+ "Pukejoy"
+ ],
+ "tl" : [
+ "sccooottttie"
+ ],
+ "pt" : [
+ "Gusstavo"
+ ],
+ "pt-BR" : [
+ "G4stavoM1ster",
+ "yurinogueira",
+ "Sakanas",
+ "krazybeat",
+ "FaolanMalcadh",
+ "Gusstavo",
+ "Day-OS",
+ "ooicram",
+ "Sxigames"
+ ]
+}