diff --git a/api/src/main/java/org/densy/polyglot/api/util/LanguageMappingBuilder.java b/api/src/main/java/org/densy/polyglot/api/util/LanguageMappingBuilder.java index 47aeb92..6e94d4a 100644 --- a/api/src/main/java/org/densy/polyglot/api/util/LanguageMappingBuilder.java +++ b/api/src/main/java/org/densy/polyglot/api/util/LanguageMappingBuilder.java @@ -5,15 +5,30 @@ import java.util.HashMap; import java.util.Map; +/** + * Language mapping strategy builder. + */ public final class LanguageMappingBuilder { private final Map mappings = new HashMap<>(); + /** + * Sets the fallback language for a missing language. + * + * @param missingLanguage missing language + * @param mappedLanguage fallback language + * @return the builder itself + */ public LanguageMappingBuilder put(Language missingLanguage, Language mappedLanguage) { this.mappings.put(missingLanguage, mappedLanguage); return this; } + /** + * Builds language strategy. + * + * @return LanguageStrategy + */ public LanguageStrategy build() { return LanguageStrategy.mappingsOf(mappings); } diff --git a/core/src/main/java/org/densy/polyglot/core/language/BaseLanguage.java b/core/src/main/java/org/densy/polyglot/core/language/BaseLanguage.java index 4855531..0780bf0 100644 --- a/core/src/main/java/org/densy/polyglot/core/language/BaseLanguage.java +++ b/core/src/main/java/org/densy/polyglot/core/language/BaseLanguage.java @@ -80,7 +80,7 @@ public static BaseLanguage parseLanguage(String languageCode) { public static BaseLanguage parseLocale(Locale locale) { Objects.requireNonNull(locale, "locale must not be null"); - String language = locale.getISO3Country(); + String language = locale.getLanguage(); String country = locale.getCountry(); if (language.isEmpty() && country.isEmpty()) { diff --git a/core/src/main/java/org/densy/polyglot/core/provider/JsonFileProvider.java b/core/src/main/java/org/densy/polyglot/core/provider/JsonFileProvider.java index a462e07..d1fe57f 100644 --- a/core/src/main/java/org/densy/polyglot/core/provider/JsonFileProvider.java +++ b/core/src/main/java/org/densy/polyglot/core/provider/JsonFileProvider.java @@ -5,6 +5,7 @@ import org.densy.polyglot.api.language.Language; import org.densy.polyglot.api.language.LanguageStandard; import org.densy.polyglot.api.provider.TranslationProvider; +import org.densy.polyglot.core.util.ProviderUtils; import java.io.File; import java.io.FileReader; @@ -48,10 +49,10 @@ private void loadTranslationsFromFolder() { if (languageStandard.matches(languageString)) { Language language = languageStandard.parseLanguage(languageString); - Map data = gson.fromJson(new FileReader(file), new TypeToken>() { + Map translations = gson.fromJson(new FileReader(file), new TypeToken>() { }.getType()); - Map flattenedTranslations = flattenMap(data, ""); - translations.put(language, flattenedTranslations); + Map flattenedTranslations = ProviderUtils.flattenMap(translations, ""); + this.translations.put(language, flattenedTranslations); } } catch (IOException e) { throw new RuntimeException("Error loading translation file: " + file.getName(), e); @@ -61,24 +62,6 @@ private void loadTranslationsFromFolder() { } } - @SuppressWarnings("unchecked") - private Map flattenMap(Map map, String prefix) { - Map flattened = new HashMap<>(); - - for (Map.Entry entry : map.entrySet()) { - String key = prefix.isEmpty() ? entry.getKey() : prefix + "." + entry.getKey(); - Object value = entry.getValue(); - - if (value instanceof Map) { - flattened.putAll(flattenMap((Map) value, key)); - } else { - flattened.put(key, String.valueOf(value)); - } - } - - return flattened; - } - @Override public Map> getTranslations() { return new HashMap<>(translations); diff --git a/core/src/main/java/org/densy/polyglot/core/provider/YamlFileProvider.java b/core/src/main/java/org/densy/polyglot/core/provider/YamlFileProvider.java index cfe8df4..fd10800 100644 --- a/core/src/main/java/org/densy/polyglot/core/provider/YamlFileProvider.java +++ b/core/src/main/java/org/densy/polyglot/core/provider/YamlFileProvider.java @@ -3,6 +3,7 @@ import org.densy.polyglot.api.language.Language; import org.densy.polyglot.api.language.LanguageStandard; import org.densy.polyglot.api.provider.TranslationProvider; +import org.densy.polyglot.core.util.ProviderUtils; import org.yaml.snakeyaml.Yaml; import java.io.File; @@ -47,9 +48,9 @@ private void loadTranslationsFromFolder() { if (languageStandard.matches(languageString)) { Language language = languageStandard.parseLanguage(languageString); - Map data = yaml.load(new FileInputStream(file)); - Map flattenedTranslations = flattenMap(data, ""); - translations.put(language, flattenedTranslations); + Map translations = yaml.load(new FileInputStream(file)); + Map flattenedTranslations = ProviderUtils.flattenMap(translations, ""); + this.translations.put(language, flattenedTranslations); } } catch (IOException e) { throw new RuntimeException("Error loading translation file: " + file.getName(), e); @@ -59,24 +60,6 @@ private void loadTranslationsFromFolder() { } } - @SuppressWarnings("unchecked") - private Map flattenMap(Map map, String prefix) { - Map flattened = new HashMap<>(); - - for (Map.Entry entry : map.entrySet()) { - String key = prefix.isEmpty() ? entry.getKey() : prefix + "." + entry.getKey(); - Object value = entry.getValue(); - - if (value instanceof Map) { - flattened.putAll(flattenMap((Map) value, key)); - } else { - flattened.put(key, String.valueOf(value)); - } - } - - return flattened; - } - @Override public Map> getTranslations() { return new HashMap<>(translations); diff --git a/core/src/main/java/org/densy/polyglot/core/util/ProviderUtils.java b/core/src/main/java/org/densy/polyglot/core/util/ProviderUtils.java new file mode 100644 index 0000000..810b82e --- /dev/null +++ b/core/src/main/java/org/densy/polyglot/core/util/ProviderUtils.java @@ -0,0 +1,38 @@ +package org.densy.polyglot.core.util; + +import lombok.experimental.UtilityClass; + +import java.util.HashMap; +import java.util.Map; + +/** + * General provider utility. + */ +@UtilityClass +public class ProviderUtils { + + /** + * Flattens a nested map into a single-level map. + * + * @param map source map + * @param prefix key prefix + * @return flattened map + */ + @SuppressWarnings("unchecked") + public Map flattenMap(Map map, String prefix) { + Map flattened = new HashMap<>(); + + for (Map.Entry entry : map.entrySet()) { + String key = prefix.isEmpty() ? entry.getKey() : prefix + "." + entry.getKey(); + Object value = entry.getValue(); + + if (value instanceof Map) { + flattened.putAll(flattenMap((Map) value, key)); + } else { + flattened.put(key, String.valueOf(value)); + } + } + + return flattened; + } +}