From bb00bdbcab61cd3de29c1a543e4be2beaa9f7060 Mon Sep 17 00:00:00 2001
From: Aleksandras Kostarevas <aleks076@protonmail.com>
Date: Tue, 23 Jul 2024 19:41:06 +0300
Subject: [PATCH] Update German uppercase sharp S

---
 .../inputmethod/latin/common/StringUtils.java    | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/common/src/org/futo/inputmethod/latin/common/StringUtils.java b/common/src/org/futo/inputmethod/latin/common/StringUtils.java
index 42401c5814..13f9bb1dbe 100644
--- a/common/src/org/futo/inputmethod/latin/common/StringUtils.java
+++ b/common/src/org/futo/inputmethod/latin/common/StringUtils.java
@@ -20,6 +20,7 @@ import org.futo.inputmethod.annotations.UsedForTesting;
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.HashMap;
 import java.util.Locale;
 
 import javax.annotation.Nonnull;
@@ -41,6 +42,12 @@ public final class StringUtils {
     private static final char CHAR_LINE_SEPARATOR = 0X2028;
     private static final char CHAR_PARAGRAPH_SEPARATOR = 0X2029;
 
+    // Java's .toUpperCase converts Sharp S to "SS", this is a workaround
+    private static final HashMap<Integer, Integer> uppercaseCodeReplacements = new HashMap<>();
+    static {
+        uppercaseCodeReplacements.put(0x00DF, 0x1E9E); // ß : ẞ
+    }
+
     private StringUtils() {
         // This utility class is not publicly instantiable.
     }
@@ -607,6 +614,15 @@ public final class StringUtils {
         if (label == null) {
             return label;
         }
+
+        if(codePointCount(label) == 1) {
+            int code = label.codePointAt(0);
+            Integer replacementCode = uppercaseCodeReplacements.get(code);
+            if(replacementCode != null) {
+                return new String(Character.toChars(replacementCode));
+            }
+        }
+
         return label.toUpperCase(getLocaleUsedForToTitleCase(locale));
     }
 
-- 
GitLab