diff --git a/build.gradle b/build.gradle
index 4884c99..a5fa628 100644
--- a/build.gradle
+++ b/build.gradle
@@ -24,6 +24,7 @@ ext {
'commons-lang:commons-lang',
'org.yaml:snakeyaml'
]],
+ commons_text: 'org.apache.commons:commons-text:1.9',
lombok: 'org.projectlombok:lombok:1.18.12'
]
}
@@ -42,4 +43,5 @@ dependencies {
annotationProcessor libs.lombok
compileOnly2 libs.bukkit
+ implementation libs.commons_text
}
\ No newline at end of file
diff --git a/src/main/java/ghast/I18n.java b/src/main/java/ghast/I18n.java
new file mode 100644
index 0000000..c56c826
--- /dev/null
+++ b/src/main/java/ghast/I18n.java
@@ -0,0 +1,91 @@
+package ghast;
+
+import com.google.common.collect.HashBasedTable;
+import com.google.common.collect.Table;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+import lombok.experimental.UtilityClass;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.text.StringSubstitutor;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.Reader;
+import java.util.HashMap;
+import java.util.Map;
+
+@UtilityClass
+@SuppressWarnings("unused")
+public class I18n {
+
+ private final String DEFAULT_LANG = "en";
+ private final Table messagesMap = HashBasedTable.create();
+
+ //region Load messages
+ @SuppressWarnings("java:S112")
+ public void loadMessages(String lang, Reader reader) {
+ Map map = messagesMap.row(lang.toLowerCase());
+
+ try {
+ BufferedReader bufferedReader = new BufferedReader(reader);
+ String line;
+ while ((line = bufferedReader.readLine()) != null) {
+ String[] split = line.split("=", 2);
+ map.put(split[0].trim().toLowerCase(), split[1].trim());
+ }
+ } catch (IOException e) {
+ throw new RuntimeException("Error load messages: " + e.getMessage(), e);
+ }
+ }
+
+ public void loadMessages(String lang, Map messages) {
+ Map map = messagesMap.row(lang.toLowerCase());
+ messages.forEach((k, v) -> map.put(k.toLowerCase(), v));
+ }
+
+ public void loadMessages(Reader reader) {
+ loadMessages(DEFAULT_LANG, reader);
+ }
+
+ public void loadMessages(Map messages) {
+ loadMessages(DEFAULT_LANG, messages);
+ }
+ //endregion
+
+ //region Get message
+ public String get(String lang, String key) {
+ return messagesMap.row(lang.toLowerCase()).getOrDefault(key.toLowerCase(), StringUtils.EMPTY);
+ }
+
+ public String get(String lang, String key, Map params) {
+ return StringSubstitutor.replace(get(lang, key.toLowerCase()), params, "{", "}");
+ }
+
+ public String get(String key) {
+ return get(DEFAULT_LANG, key);
+ }
+
+ public String get(String key, Map params) {
+ return get(DEFAULT_LANG, key, params);
+ }
+ //endregion
+
+ public ParamBuilder paramBuilder() {
+ return new ParamBuilder();
+ }
+
+ @NoArgsConstructor(access = AccessLevel.PRIVATE)
+ public static class ParamBuilder {
+
+ private final Map params = new HashMap<>();
+
+ public ParamBuilder add(String key, Object value) {
+ params.put(key, value);
+ return this;
+ }
+
+ public Map build() {
+ return params;
+ }
+ }
+}