fi.evolver.ai.vaadin.translations.ResourceBundleTranslationProvider Maven / Gradle / Ivy
The newest version!
package fi.evolver.ai.vaadin.translations;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
public abstract class ResourceBundleTranslationProvider implements TranslationProvider {
protected static final Logger LOG = LoggerFactory.getLogger(ResourceBundleTranslationProvider.class);
private final String bundleBaseName;
private final Set providedLocales;
public ResourceBundleTranslationProvider(String translationsFolder, String translationsBaseName) {
this.bundleBaseName = translationsFolder + "." + translationsBaseName;
providedLocales = loadProvidedLocales(translationsFolder, translationsBaseName);
LOG.debug("Providing locales: {}",
String.join(", ", providedLocales.stream().map(l -> l.equals(Locale.ROOT) ? "default" : l.toString()).toList()));
}
@Override
public Set getProvidedLocales() {
return providedLocales;
}
@Override
public boolean hasTranslation(String key, Locale locale) {
final ResourceBundle bundle = getBundle(locale);
if (bundle == null)
return false;
return bundle.containsKey(key);
}
@Override
public String getTranslation(String key, Locale locale) {
final ResourceBundle bundle = getBundle(locale);
if (bundle == null) {
return key;
}
String value;
try {
value = bundle.getString(key);
}
catch (final MissingResourceException e) {
LOG.debug("Missing resource for key " + key, e);
return "!" + locale.getLanguage() + ": " + key;
}
return value;
}
private ResourceBundle getBundle(Locale locale) {
try {
return ResourceBundle.getBundle(bundleBaseName, locale, getClass().getClassLoader());
}
catch (final MissingResourceException e) {
LOG.warn("Missing translations for locale " + locale.getDisplayName(), e);
}
return null;
}
private static Set loadProvidedLocales(String resourceFolder, String translationsBaseName) {
Pattern translationFileLocalePattern = Pattern.compile(translationsBaseName + "_?(\\w*)\\.properties");
Set providedLocales = new HashSet<>();
try {
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
Resource[] translations = resolver.getResources("classpath:/" + resourceFolder + "/" + translationsBaseName + "*");
for (Resource res : translations) {
Matcher m = translationFileLocalePattern.matcher(res.getFilename());
if (m.find()) {
Locale l = Locale.forLanguageTag(m.group(1).replace('_', '-'));
providedLocales.add(l);
}
}
}
catch (Exception e) {
LOG.error("Error loading provided locales: {}", e.getMessage());
}
return providedLocales;
}
}