Ver código fonte

Merge branch 'develop' into feature/dynamic-languages

# Conflicts:
#	src/main/java/org/cryptomator/launcher/SupportedLanguages.java
#	src/main/java/org/cryptomator/ui/preferences/InterfacePreferencesController.java
Armin Schrenk 2 anos atrás
pai
commit
baee23b6d4

+ 29 - 0
.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

+ 4 - 0
.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).
             ---
+            <!-- Don't forget to include the 💾 SHA-256 checksums of release artifacts: -->

+ 1 - 0
dist/linux/common/org.cryptomator.Cryptomator.metainfo.xml

@@ -66,6 +66,7 @@
 	</content_rating>
 
 	<releases>
+		<release date="2023-04-25" version="1.8.0"/>
 		<release date="2023-04-07" version="1.7.5"/>
 		<release date="2023-04-05" version="1.7.4"/>
 		<release date="2023-03-15" version="1.7.3"/>

+ 1 - 1
pom.xml

@@ -3,7 +3,7 @@
 	<modelVersion>4.0.0</modelVersion>
 	<groupId>org.cryptomator</groupId>
 	<artifactId>cryptomator</artifactId>
-	<version>1.8.0-SNAPSHOT</version>
+	<version>1.9.0-SNAPSHOT</version>
 	<name>Cryptomator Desktop App</name>
 
 	<organization>

+ 25 - 12
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<String> 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<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;
+	}
+
 }

+ 5 - 7
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<SelectedPreferencesTab> selectedTabProperty;
 	private final LicenseHolder licenseHolder;
 	private final ResourceBundle resourceBundle;
+	private final SupportedLanguages supportedLanguages;
 	public ChoiceBox<UiTheme> 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<SelectedPreferencesTab> selectedTabProperty, LicenseHolder licenseHolder, ResourceBundle resourceBundle) {
+	InterfacePreferencesController(Settings settings, SupportedLanguages supportedLanguages, TrayMenuComponent trayMenu, ObjectProperty<SelectedPreferencesTab> 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();
 			}
 		}