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; + } + } +}