diff --git a/.github/release.yml b/.github/release.yml new file mode 100644 index 000000000..5ab2e03f7 --- /dev/null +++ b/.github/release.yml @@ -0,0 +1,29 @@ +# .github/release.yml +# see https://docs.github.com/en/repositories/releasing-projects-on-github/automatically-generated-release-notes#configuring-automatically-generated-release-notes + +changelog: + exclude: + authors: + - cryptobot + - dependabot + - github-actions + categories: + - title: What's New 🎉 + labels: + - type:feature-request + - type:enhancement + - title: Bugfixes 🐛 + labels: + - type:security-issue + - type:bug + - type:minor-bug + - title: Other Changes 📎 + labels: + - "*" + exclude: + labels: + - type:feature-request + - type:enhancement + - type:security-issue + - type:bug + - type:minor-bug \ No newline at end of file diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b31bfa08a..681ba1f94 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -53,4 +53,8 @@ jobs: body: |- :construction: Work in Progress + Please be patient, the builds are still running. We will publish new versions of Cryptomator here in a few moments. + + As usual, the GPG signatures can be checked using [our public key `5811 7AFA 1F85 B3EE C154 677D 615D 449F E6E6 A235`](https://gist.github.com/cryptobot/211111cf092037490275f39d408f461a). --- + \ No newline at end of file diff --git a/dist/linux/common/org.cryptomator.Cryptomator.metainfo.xml b/dist/linux/common/org.cryptomator.Cryptomator.metainfo.xml index 2b830e108..107261f2b 100644 --- a/dist/linux/common/org.cryptomator.Cryptomator.metainfo.xml +++ b/dist/linux/common/org.cryptomator.Cryptomator.metainfo.xml @@ -66,6 +66,7 @@ + diff --git a/pom.xml b/pom.xml index 6c98a255a..084ceeb7e 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 org.cryptomator cryptomator - 1.8.0-SNAPSHOT + 1.9.0-SNAPSHOT Cryptomator Desktop App diff --git a/src/main/java/org/cryptomator/launcher/SupportedLanguages.java b/src/main/java/org/cryptomator/launcher/SupportedLanguages.java index c302c8f9d..10876cf20 100644 --- a/src/main/java/org/cryptomator/launcher/SupportedLanguages.java +++ b/src/main/java/org/cryptomator/launcher/SupportedLanguages.java @@ -1,7 +1,6 @@ package org.cryptomator.launcher; import org.cryptomator.common.settings.Settings; -import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -11,10 +10,13 @@ import java.io.IOException; import java.net.URISyntaxException; import java.nio.file.Files; import java.nio.file.Path; +import java.text.Collator; 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 @@ -26,7 +28,6 @@ public class SupportedLanguages { static { List supportedLanguages = new ArrayList<>(); - supportedLanguages.add("en"); try { var i18Dir = getI18Dir(); try (var dirStream = Files.newDirectoryStream(i18Dir, "strings_*.properties")) { @@ -41,7 +42,7 @@ public class SupportedLanguages { } private static Path getI18Dir() throws URISyntaxException { - var i18nUri = Optional.of(SupportedLanguages.class.getResource("/i18n")).orElseThrow().toURI(); + var i18nUri = Optional.of(SupportedLanguages.class.getResource("/i18n")).get().toURI(); return Path.of(i18nUri); } @@ -50,21 +51,33 @@ public class SupportedLanguages { return fileName.substring("strings_".length(), fileName.indexOf(".properties")).replace('_', '-'); } - @Nullable - private final String preferredLanguage; + public static final String ENGLISH = "en"; + + private final List 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 getLanguageTags() { + return sortedLanguageTags; + } + } diff --git a/src/main/java/org/cryptomator/ui/preferences/InterfacePreferencesController.java b/src/main/java/org/cryptomator/ui/preferences/InterfacePreferencesController.java index baf655d2d..05b733f86 100644 --- a/src/main/java/org/cryptomator/ui/preferences/InterfacePreferencesController.java +++ b/src/main/java/org/cryptomator/ui/preferences/InterfacePreferencesController.java @@ -1,6 +1,5 @@ package org.cryptomator.ui.preferences; -import com.google.common.base.Strings; import org.cryptomator.common.LicenseHolder; import org.cryptomator.common.settings.Settings; import org.cryptomator.common.settings.UiTheme; @@ -35,6 +34,7 @@ public class InterfacePreferencesController implements FxController { private final ObjectProperty selectedTabProperty; private final LicenseHolder licenseHolder; private final ResourceBundle resourceBundle; + private final SupportedLanguages supportedLanguages; public ChoiceBox themeChoiceBox; public CheckBox showMinimizeButtonCheckbox; public CheckBox showTrayIconCheckbox; @@ -44,13 +44,14 @@ public class InterfacePreferencesController implements FxController { public RadioButton nodeOrientationRtl; @Inject - InterfacePreferencesController(Settings settings, TrayMenuComponent trayMenu, ObjectProperty selectedTabProperty, LicenseHolder licenseHolder, ResourceBundle resourceBundle) { + InterfacePreferencesController(Settings settings, SupportedLanguages supportedLanguages, TrayMenuComponent trayMenu, ObjectProperty selectedTabProperty, LicenseHolder licenseHolder, ResourceBundle resourceBundle) { this.settings = settings; this.trayMenuInitialized = trayMenu.isInitialized(); this.trayMenuSupported = trayMenu.isSupported(); this.selectedTabProperty = selectedTabProperty; this.licenseHolder = licenseHolder; this.resourceBundle = resourceBundle; + this.supportedLanguages = supportedLanguages; } @FXML @@ -66,8 +67,7 @@ public class InterfacePreferencesController implements FxController { showTrayIconCheckbox.selectedProperty().bindBidirectional(settings.showTrayIcon()); - preferredLanguageChoiceBox.getItems().add(null); - preferredLanguageChoiceBox.getItems().addAll(SupportedLanguages.LANGUAGE_TAGS); + preferredLanguageChoiceBox.getItems().addAll(supportedLanguages.getLanguageTags()); preferredLanguageChoiceBox.valueProperty().bindBidirectional(settings.languageProperty()); preferredLanguageChoiceBox.setConverter(new LanguageTagConverter(resourceBundle)); @@ -141,9 +141,7 @@ public class InterfacePreferencesController implements FxController { return resourceBundle.getString("preferences.interface.language.auto"); } else { var locale = Locale.forLanguageTag(tag); - var lang = locale.getDisplayLanguage(locale); - var region = locale.getDisplayCountry(locale); - return lang + (Strings.isNullOrEmpty(region) ? "" : " (" + region + ")"); + return locale.getDisplayName(); } }