From 0f9d572677856454680ecca51292a2bebd99d0ac Mon Sep 17 00:00:00 2001 From: Armin Schrenk Date: Mon, 8 May 2023 20:28:56 +0200 Subject: [PATCH] remove static language and read i18dir in constructor --- .../launcher/SupportedLanguages.java | 65 +++++++++---------- .../launcher/SupportedLanguagesTest.java | 31 --------- 2 files changed, 31 insertions(+), 65 deletions(-) delete mode 100644 src/test/java/org/cryptomator/launcher/SupportedLanguagesTest.java diff --git a/src/main/java/org/cryptomator/launcher/SupportedLanguages.java b/src/main/java/org/cryptomator/launcher/SupportedLanguages.java index 10876cf20..453545fb6 100644 --- a/src/main/java/org/cryptomator/launcher/SupportedLanguages.java +++ b/src/main/java/org/cryptomator/launcher/SupportedLanguages.java @@ -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 LANGUAGE_TAGS; - - static { - List 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 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 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('_', '-'); + } + } diff --git a/src/test/java/org/cryptomator/launcher/SupportedLanguagesTest.java b/src/test/java/org/cryptomator/launcher/SupportedLanguagesTest.java deleted file mode 100644 index 8ea48465b..000000000 --- a/src/test/java/org/cryptomator/launcher/SupportedLanguagesTest.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.cryptomator.launcher; - -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.MethodSource; - -import java.util.Locale; -import java.util.ResourceBundle; -import java.util.stream.Stream; - -public class SupportedLanguagesTest { - - @DisplayName("test if resource bundle is localized") - @ParameterizedTest(name = "{0}") - @MethodSource("languageTags") - public void testResourceBundleExists(String tag) { - var locale = Locale.forLanguageTag(tag); - Assertions.assertNotEquals("und", locale.toLanguageTag(), "Undefined language tag"); - - var bundle = Assertions.assertDoesNotThrow(() -> ResourceBundle.getBundle("i18n.strings", locale)); - - Assertions.assertEquals(locale, bundle.getLocale()); - Assertions.assertFalse(bundle.keySet().isEmpty()); - } - - public static Stream languageTags() { - return SupportedLanguages.LANGUAGE_TAGS.stream() // - .filter(tag -> !"en".equals(tag)); // english uses the default bundle - } -} \ No newline at end of file