|
@@ -1,39 +1,53 @@
|
|
|
package org.cryptomator.launcher;
|
|
|
|
|
|
import org.cryptomator.common.settings.Settings;
|
|
|
-import org.jetbrains.annotations.Nullable;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
|
|
import javax.inject.Inject;
|
|
|
import javax.inject.Singleton;
|
|
|
+import java.text.Collator;
|
|
|
+import java.util.Collections;
|
|
|
import java.util.List;
|
|
|
import java.util.Locale;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
@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> LANGUAGAE_TAGS = List.of("en", "ar", "be", "bn", "bs", "ca", "cs", "da", "de", "el", "es", "fil", "fa", "fr", "gl", "he", //
|
|
|
+ // these are BCP 47 language codes, not ISO. Note the "-" instead of the "_".
|
|
|
+ // "en" is not part of this list - it is always inserted at the top.
|
|
|
+ public static final List<String> LANGUAGE_TAGS = List.of("ar", "be", "bn", "bs", "ca", "cs", "da", "de", "el", "es", "fil", "fa", "fr", "gl", "he", //
|
|
|
"hi", "hr", "hu", "id", "it", "ja", "ko", "lv", "mk", "nb", "nl", "nn", "no", "pa", "pl", "pt", "pt-BR", "ro", "ru", "si", "sk", "sr", "sr-Latn", "sv", "sw", //
|
|
|
"ta", "te", "th", "tr", "uk", "vi", "zh", "zh-HK", "zh-TW");
|
|
|
+ public static final String ENGLISH = "en";
|
|
|
|
|
|
- @Nullable
|
|
|
- private final String preferredLanguage;
|
|
|
+ private final List<String> sortedLanguageTags;
|
|
|
+
|
|
|
+ private final Locale preferredLocale;
|
|
|
|
|
|
@Inject
|
|
|
public SupportedLanguages(Settings settings) {
|
|
|
- this.preferredLanguage = settings.languageProperty().get();
|
|
|
+ var preferredLanguage = settings.languageProperty().get();
|
|
|
+ preferredLocale = preferredLanguage == null ? Locale.getDefault() : Locale.forLanguageTag(preferredLanguage);
|
|
|
+ var collator = Collator.getInstance(preferredLocale);
|
|
|
+ collator.setStrength(Collator.PRIMARY);
|
|
|
+ var sorted = LANGUAGE_TAGS.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);
|
|
|
}
|
|
|
|
|
|
public void applyPreferred() {
|
|
|
- if (preferredLanguage == null) {
|
|
|
- LOG.debug("Using system locale");
|
|
|
- return;
|
|
|
- }
|
|
|
- var preferredLocale = Locale.forLanguageTag(preferredLanguage);
|
|
|
- LOG.debug("Applying preferred locale {}", preferredLocale.getDisplayName(Locale.ENGLISH));
|
|
|
+ LOG.debug("Using locale {}", preferredLocale);
|
|
|
Locale.setDefault(preferredLocale);
|
|
|
}
|
|
|
+
|
|
|
+ public List<String> getLanguageTags() {
|
|
|
+ return sortedLanguageTags;
|
|
|
+ }
|
|
|
+
|
|
|
}
|