aboutsummaryrefslogtreecommitdiffstats
path: root/common/src
diff options
context:
space:
mode:
Diffstat (limited to 'common/src')
-rw-r--r--common/src/com/android/inputmethod/latin/common/StringUtils.java47
1 files changed, 29 insertions, 18 deletions
diff --git a/common/src/com/android/inputmethod/latin/common/StringUtils.java b/common/src/com/android/inputmethod/latin/common/StringUtils.java
index be7260308..572f0cd9b 100644
--- a/common/src/com/android/inputmethod/latin/common/StringUtils.java
+++ b/common/src/com/android/inputmethod/latin/common/StringUtils.java
@@ -201,22 +201,22 @@ public final class StringUtils {
public static String capitalizeFirstCodePoint(@Nonnull final String s,
@Nonnull final Locale locale) {
if (s.length() <= 1) {
- return s.toUpperCase(locale);
+ return s.toUpperCase(getLocaleUsedForToTitleCase(locale));
}
// Please refer to the comment below in
// {@link #capitalizeFirstAndDowncaseRest(String,Locale)} as this has the same shortcomings
final int cutoff = s.offsetByCodePoints(0, 1);
- return s.substring(0, cutoff).toUpperCase(locale) + s.substring(cutoff);
+ return s.substring(0, cutoff).toUpperCase(getLocaleUsedForToTitleCase(locale))
+ + s.substring(cutoff);
}
@Nonnull
public static String capitalizeFirstAndDowncaseRest(@Nonnull final String s,
@Nonnull final Locale locale) {
if (s.length() <= 1) {
- return s.toUpperCase(locale);
+ return s.toUpperCase(getLocaleUsedForToTitleCase(locale));
}
// TODO: fix the bugs below
- // - This does not work for Greek, because it returns upper case instead of title case.
// - It does not work for Serbian, because it fails to account for the "lj" character,
// which should be "Lj" in title case and "LJ" in upper case.
// - It does not work for Dutch, because it fails to account for the "ij" digraph when it's
@@ -224,7 +224,8 @@ public final class StringUtils {
// be capitalized as "IJ" as if they were a single letter in most words (not all). If the
// unicode char for the ligature is used however, it works.
final int cutoff = s.offsetByCodePoints(0, 1);
- return s.substring(0, cutoff).toUpperCase(locale) + s.substring(cutoff).toLowerCase(locale);
+ return s.substring(0, cutoff).toUpperCase(getLocaleUsedForToTitleCase(locale))
+ + s.substring(cutoff).toLowerCase(locale);
}
@Nonnull
@@ -584,25 +585,35 @@ public final class StringUtils {
return bytes;
}
- @Nullable
- public static String toUpperCaseOfStringForLocale(@Nullable final String text,
- final boolean needsToUpperCase, @Nonnull final Locale locale) {
- if (text == null || !needsToUpperCase) {
- return text;
+ private static final String LANGUAGE_GREEK = "el";
+
+ @Nonnull
+ private static Locale getLocaleUsedForToTitleCase(@Nonnull final Locale locale) {
+ // In Greek locale {@link String#toUpperCase(Locale)} eliminates accents from its result.
+ // In order to get accented upper case letter, {@link Locale#ROOT} should be used.
+ if (LANGUAGE_GREEK.equals(locale.getLanguage())) {
+ return Locale.ROOT;
}
- return text.toUpperCase(locale);
+ return locale;
}
- public static int toUpperCaseOfCodeForLocale(final int code, final boolean needsToUpperCase,
+ @Nullable
+ public static String toTitleCaseOfKeyLabel(@Nullable final String label,
@Nonnull final Locale locale) {
- if (!Constants.isLetterCode(code) || !needsToUpperCase) {
+ if (label == null) {
+ return label;
+ }
+ return label.toUpperCase(getLocaleUsedForToTitleCase(locale));
+ }
+
+ public static int toTitleCaseOfKeyCode(final int code, @Nonnull final Locale locale) {
+ if (!Constants.isLetterCode(code)) {
return code;
}
- final String text = newSingleCodePointString(code);
- final String casedText = toUpperCaseOfStringForLocale(
- text, needsToUpperCase, locale);
- return codePointCount(casedText) == 1
- ? casedText.codePointAt(0) : Constants.CODE_UNSPECIFIED;
+ final String label = newSingleCodePointString(code);
+ final String titleCaseLabel = toTitleCaseOfKeyLabel(label, locale);
+ return codePointCount(titleCaseLabel) == 1
+ ? titleCaseLabel.codePointAt(0) : Constants.CODE_UNSPECIFIED;
}
public static int getTrailingSingleQuotesCount(@Nonnull final CharSequence charSequence) {