package org.molgenis.data.i18n; import org.molgenis.data.DataService; import org.molgenis.data.Entity; import org.molgenis.data.settings.AppSettings; import org.molgenis.security.core.utils.SecurityUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.Locale; import java.util.ResourceBundle; import java.util.stream.Stream; import static org.molgenis.auth.UserMetaData.USER; import static org.molgenis.data.i18n.model.I18nStringMetaData.I18N_STRING; import static org.molgenis.data.i18n.model.LanguageMetadata.LANGUAGE; import static org.molgenis.security.core.runas.RunAsSystemProxy.runAsSystem; @Service public class LanguageService { private final DataService dataService; private final AppSettings appSettings; public static final String DEFAULT_LANGUAGE_CODE = "en"; public static final String DEFAULT_LANGUAGE_NAME = "English"; @Autowired public LanguageService(DataService dataService, AppSettings appSettings) { this.dataService = dataService; this.appSettings = appSettings; } /** * "en": is default * "xx": is a placeholder for having your own language * "nl", "de", "es", "it", "pt", "fr": are extra languages * * @return */ public static Stream<String> getLanguageCodes() { return Stream.of("en", "nl", "de", "es", "it", "pt", "fr", "xx"); } /** * Get ResourceBundle for a language */ public ResourceBundle getBundle(String languageCode) { return ResourceBundle.getBundle(I18N_STRING, new Locale(languageCode), new MolgenisResourceBundleControl(dataService, appSettings)); } /** * Get ResourceBundle for the current user language */ public ResourceBundle getBundle() { return getBundle(getCurrentUserLanguageCode()); } /** * Get the language code of the current user, returns the app default if not set */ public String getCurrentUserLanguageCode() { String currentUserName = SecurityUtils.getCurrentUsername(); return runAsSystem(() -> { String languageCode = null; if (currentUserName != null) { Entity user = dataService.query(USER).eq("username", currentUserName).findOne(); if (user != null) { languageCode = user.getString("languageCode"); if ((languageCode != null) && (dataService.findOneById(LANGUAGE, languageCode) == null)) { languageCode = null; } } } if (languageCode == null) { // Use app default languageCode = appSettings.getLanguageCode(); if ((languageCode == null) || (dataService.findOneById(LANGUAGE, languageCode) == null)) { languageCode = DEFAULT_LANGUAGE_CODE; } } return languageCode; }); } public static boolean hasLanguageCode(String code) { return getLanguageCodes().anyMatch(e -> e.equals(code)); } }