aboutsummaryrefslogtreecommitdiffstats
path: root/common/src/com/android
diff options
context:
space:
mode:
authorTadashi G. Takaoka <takaoka@google.com>2014-11-19 13:45:21 +0900
committerTadashi G. Takaoka <takaoka@google.com>2014-11-19 17:57:10 +0900
commitf62b5d633d17b94a7ea46c968e073fdaa3fcbe15 (patch)
treee04b3ac067c6fef569064ef52fec321a383b1386 /common/src/com/android
parentb9116af29f971137e7bd6754c5d74d35aeeed05b (diff)
downloadlatinime-f62b5d633d17b94a7ea46c968e073fdaa3fcbe15.tar.gz
latinime-f62b5d633d17b94a7ea46c968e073fdaa3fcbe15.tar.xz
latinime-f62b5d633d17b94a7ea46c968e073fdaa3fcbe15.zip
Fix Greek accented upper case letters
Bug: 18418991 Change-Id: I7b34b126bec70300c83e17bea39e1036de4bf7c2
Diffstat (limited to 'common/src/com/android')
-rw-r--r--common/src/com/android/inputmethod/latin/common/StringUtils.java26
1 files changed, 20 insertions, 6 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..463eabbee 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 toUpperCaseOfStringForLocale(s, true /* needsToUpperCase */, 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 toUpperCaseOfStringForLocale(
+ s.substring(0, cutoff), true /* needsToUpperCase */, 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 toUpperCaseOfStringForLocale(s, true /* needsToUpperCase */, 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,9 @@ 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);
+ final String titleCaseFirstLetter = toUpperCaseOfStringForLocale(
+ s.substring(0, cutoff), true /* needsToUpperCase */, locale);
+ return titleCaseFirstLetter + s.substring(cutoff).toLowerCase(locale);
}
@Nonnull
@@ -584,13 +586,25 @@ public final class StringUtils {
return bytes;
}
+ 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 locale;
+ }
+
@Nullable
public static String toUpperCaseOfStringForLocale(@Nullable final String text,
final boolean needsToUpperCase, @Nonnull final Locale locale) {
if (text == null || !needsToUpperCase) {
return text;
}
- return text.toUpperCase(locale);
+ return text.toUpperCase(getLocaleUsedForToTitleCase(locale));
}
public static int toUpperCaseOfCodeForLocale(final int code, final boolean needsToUpperCase,