From f62b5d633d17b94a7ea46c968e073fdaa3fcbe15 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Wed, 19 Nov 2014 13:45:21 +0900 Subject: Fix Greek accented upper case letters Bug: 18418991 Change-Id: I7b34b126bec70300c83e17bea39e1036de4bf7c2 --- .../inputmethod/latin/common/StringUtils.java | 26 +++++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) (limited to 'common/src/com/android') 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, -- cgit v1.2.3-83-g751a