All Downloads are FREE. Search and download functionalities are using the official Maven repository.

fi.evolver.ai.vaadin.translations.ResourceBundleTranslationProvider Maven / Gradle / Ivy

There is a newer version: 1.5.5
Show 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;
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy