|
@@ -15,41 +15,12 @@ import java.util.ArrayList;
|
|
|
import java.util.Collections;
|
|
|
import java.util.List;
|
|
|
import java.util.Locale;
|
|
|
-import java.util.Optional;
|
|
|
-import java.util.stream.Collectors;
|
|
|
import java.util.stream.StreamSupport;
|
|
|
|
|
|
@Singleton
|
|
|
public class SupportedLanguages {
|
|
|
|
|
|
private static final Logger LOG = LoggerFactory.getLogger(SupportedLanguages.class);
|
|
|
- // these are BCP 47 language codes, not ISO. Note the "-" instead of the "_":
|
|
|
- public static final List<String> LANGUAGE_TAGS;
|
|
|
-
|
|
|
- static {
|
|
|
- List<String> supportedLanguages = new ArrayList<>();
|
|
|
- try {
|
|
|
- var i18Dir = getI18Dir();
|
|
|
- try (var dirStream = Files.newDirectoryStream(i18Dir, "strings_*.properties")) {
|
|
|
- StreamSupport.stream(dirStream.spliterator(), false) //
|
|
|
- .map(SupportedLanguages::getBCP47CodeFromFileName) //
|
|
|
- .forEach(supportedLanguages::add);
|
|
|
- }
|
|
|
- } catch (URISyntaxException | IOException e) {
|
|
|
- LOG.warn("Unable to determine additional supported languages.", e);
|
|
|
- }
|
|
|
- LANGUAGE_TAGS = supportedLanguages;
|
|
|
- }
|
|
|
-
|
|
|
- private static Path getI18Dir() throws URISyntaxException {
|
|
|
- var i18nUri = Optional.of(SupportedLanguages.class.getResource("/i18n")).get().toURI();
|
|
|
- return Path.of(i18nUri);
|
|
|
- }
|
|
|
-
|
|
|
- private static String getBCP47CodeFromFileName(Path p) {
|
|
|
- var fileName = p.getFileName().toString();
|
|
|
- return fileName.substring("strings_".length(), fileName.indexOf(".properties")).replace('_', '-');
|
|
|
- }
|
|
|
|
|
|
public static final String ENGLISH = "en";
|
|
|
|
|
@@ -63,12 +34,13 @@ public class SupportedLanguages {
|
|
|
preferredLocale = preferredLanguage == null ? Locale.getDefault() : Locale.forLanguageTag(preferredLanguage);
|
|
|
var collator = Collator.getInstance(preferredLocale);
|
|
|
collator.setStrength(Collator.PRIMARY);
|
|
|
- var sorted = LANGUAGE_TAGS.stream() //
|
|
|
+ List<String> sortedTags = new ArrayList<>();
|
|
|
+ sortedTags.add(0, Settings.DEFAULT_LANGUAGE);
|
|
|
+ sortedTags.add(1, ENGLISH);
|
|
|
+ getSupportedLanguageTags().stream() //
|
|
|
.sorted((a, b) -> collator.compare(Locale.forLanguageTag(a).getDisplayName(), Locale.forLanguageTag(b).getDisplayName())) //
|
|
|
- .collect(Collectors.toList());
|
|
|
- sorted.add(0, Settings.DEFAULT_LANGUAGE);
|
|
|
- sorted.add(1, ENGLISH);
|
|
|
- sortedLanguageTags = Collections.unmodifiableList(sorted);
|
|
|
+ .forEach(sortedTags::add);
|
|
|
+ sortedLanguageTags = Collections.unmodifiableList(sortedTags);
|
|
|
}
|
|
|
|
|
|
public void applyPreferred() {
|
|
@@ -80,4 +52,29 @@ public class SupportedLanguages {
|
|
|
return sortedLanguageTags;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Iterates over the /i18n directory and extracts from every localization file the BCP 47 code.
|
|
|
+ *
|
|
|
+ * @return list of supported BCP 47 language codes
|
|
|
+ */
|
|
|
+ private static List<String> getSupportedLanguageTags() {
|
|
|
+ try {
|
|
|
+ var i18Dir = Path.of(SupportedLanguages.class.getResource("/i18n").toURI());
|
|
|
+ try (var dirStream = Files.newDirectoryStream(i18Dir, "strings_*.properties")) {
|
|
|
+ return StreamSupport.stream(dirStream.spliterator(), false) //
|
|
|
+ .map(SupportedLanguages::getBCP47CodeFromFileName) //
|
|
|
+ .toList();
|
|
|
+ }
|
|
|
+ } catch (URISyntaxException | IOException e) {
|
|
|
+ LOG.warn("Unable to determine additional supported languages.", e);
|
|
|
+ return List.of();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private static String getBCP47CodeFromFileName(Path p) {
|
|
|
+ var fileName = p.getFileName().toString();
|
|
|
+ return fileName.substring("strings_".length(), fileName.indexOf(".properties")).replace('_', '-');
|
|
|
+ }
|
|
|
+
|
|
|
}
|