From e7fd120d8e51153668beb2419390287f3fdd2751 Mon Sep 17 00:00:00 2001 From: Neil Fuller Date: Tue, 5 Apr 2022 15:31:10 +0100 Subject: [PATCH] Capitalize TZ display name strings Capitalize Settings UI time zone display name strings for languanges like Polish for standalone locations like summaries and lists. The motivating example case is the string for "Coordinated Universal Time" in Polish, which is not capitalized in CLDR, as they capitalize for the middle of sentences by default. In English, Coordinated Universal Time is already capitalized, but the Polish string is not. With this commit all "display name"-like strings have been capitalized (region names, exemplar locations, time zone names like "Coordinated Universal Time" and "British Summer Time") for completeness. For the Polish case, many are already capitalized, but capitalizing the first letter is therefore a no-op. The "GMT+xx:xx"-style strings have not been changed. Bug: 190109975 Test: Visual inspection in English and Polish of UTC, United States, Russia in the time zone picker and the date & time screen on mobile Change-Id: I57d915ac1e30e22cc05e605fcb7d46b102fa8ce1 --- .../timezone/RegionPreferenceController.java | 8 +++-- .../datetime/timezone/RegionSearchPicker.java | 5 +++- .../datetime/timezone/RegionZonePicker.java | 5 +++- .../datetime/timezone/TimeZoneInfo.java | 30 +++++++++++++------ 4 files changed, 35 insertions(+), 13 deletions(-) diff --git a/src/com/android/settings/datetime/timezone/RegionPreferenceController.java b/src/com/android/settings/datetime/timezone/RegionPreferenceController.java index 53959a69514..c4b47b9eef7 100644 --- a/src/com/android/settings/datetime/timezone/RegionPreferenceController.java +++ b/src/com/android/settings/datetime/timezone/RegionPreferenceController.java @@ -15,6 +15,8 @@ */ package com.android.settings.datetime.timezone; +import static com.android.settingslib.datetime.ZoneGetter.capitalizeForStandaloneDisplay; + import android.content.Context; import android.icu.text.LocaleDisplayNames; @@ -23,19 +25,21 @@ import java.util.Locale; public class RegionPreferenceController extends BaseTimeZonePreferenceController { private static final String PREFERENCE_KEY = "region"; + private final Locale mLocale; private final LocaleDisplayNames mLocaleDisplayNames; private String mRegionId = ""; public RegionPreferenceController(Context context) { super(context, PREFERENCE_KEY); Locale locale = context.getResources().getConfiguration().getLocales().get(0); + mLocale = locale; mLocaleDisplayNames = LocaleDisplayNames.getInstance(locale); - } @Override public CharSequence getSummary() { - return mLocaleDisplayNames.regionDisplayName(mRegionId); + return capitalizeForStandaloneDisplay(mLocale, + mLocaleDisplayNames.regionDisplayName(mRegionId)); } public void setRegionId(String regionId) { diff --git a/src/com/android/settings/datetime/timezone/RegionSearchPicker.java b/src/com/android/settings/datetime/timezone/RegionSearchPicker.java index 85d5d705b49..3977aa9010c 100644 --- a/src/com/android/settings/datetime/timezone/RegionSearchPicker.java +++ b/src/com/android/settings/datetime/timezone/RegionSearchPicker.java @@ -16,6 +16,8 @@ package com.android.settings.datetime.timezone; +import static com.android.settingslib.datetime.ZoneGetter.capitalizeForStandaloneDisplay; + import android.app.Activity; import android.app.settings.SettingsEnums; import android.content.Intent; @@ -116,7 +118,8 @@ public class RegionSearchPicker extends BaseTimeZonePicker { final LocaleDisplayNames localeDisplayNames = LocaleDisplayNames.getInstance(getLocale()); long i = 0; for (String regionId : regionIds) { - String name = localeDisplayNames.regionDisplayName(regionId); + String name = capitalizeForStandaloneDisplay( + mLocale, localeDisplayNames.regionDisplayName(regionId)); items.add(new RegionItem(i++, regionId, name)); } return new ArrayList<>(items); diff --git a/src/com/android/settings/datetime/timezone/RegionZonePicker.java b/src/com/android/settings/datetime/timezone/RegionZonePicker.java index 7f988cd0ef0..1bc68a10d4c 100644 --- a/src/com/android/settings/datetime/timezone/RegionZonePicker.java +++ b/src/com/android/settings/datetime/timezone/RegionZonePicker.java @@ -16,6 +16,8 @@ package com.android.settings.datetime.timezone; +import static com.android.settingslib.datetime.ZoneGetter.capitalizeForStandaloneDisplay; + import android.app.settings.SettingsEnums; import android.content.Intent; import android.icu.text.Collator; @@ -65,7 +67,8 @@ public class RegionZonePicker extends BaseTimeZoneInfoPicker { final LocaleDisplayNames localeDisplayNames = LocaleDisplayNames.getInstance(getLocale()); final String regionId = getArguments() == null ? null : getArguments().getString(EXTRA_REGION_ID); - mRegionName = regionId == null ? null : localeDisplayNames.regionDisplayName(regionId); + mRegionName = regionId == null ? null : capitalizeForStandaloneDisplay( + mLocale, localeDisplayNames.regionDisplayName(regionId)); } @Override diff --git a/src/com/android/settings/datetime/timezone/TimeZoneInfo.java b/src/com/android/settings/datetime/timezone/TimeZoneInfo.java index f9e819c4179..5076f72014a 100644 --- a/src/com/android/settings/datetime/timezone/TimeZoneInfo.java +++ b/src/com/android/settings/datetime/timezone/TimeZoneInfo.java @@ -15,6 +15,8 @@ */ package com.android.settings.datetime.timezone; +import static com.android.settingslib.datetime.ZoneGetter.capitalizeForStandaloneDisplay; + import android.icu.text.TimeZoneFormat; import android.icu.text.TimeZoneNames; import android.icu.util.TimeZone; @@ -152,19 +154,29 @@ public class TimeZoneInfo { String canonicalZoneId = getCanonicalZoneId(timeZone); final TimeZoneNames timeZoneNames = mTimeZoneFormat.getTimeZoneNames(); final java.util.TimeZone javaTimeZone = toJavaTimeZone(canonicalZoneId); - final CharSequence gmtOffset = ZoneGetter.getGmtOffsetText(mTimeZoneFormat, mLocale, - javaTimeZone, mNow); + final CharSequence gmtOffset = + ZoneGetter.getGmtOffsetText(mTimeZoneFormat, mLocale, javaTimeZone, mNow); return new TimeZoneInfo.Builder(timeZone) - .setGenericName(timeZoneNames.getDisplayName(canonicalZoneId, - TimeZoneNames.NameType.LONG_GENERIC, mNow.getTime())) - .setStandardName(timeZoneNames.getDisplayName(canonicalZoneId, - TimeZoneNames.NameType.LONG_STANDARD, mNow.getTime())) - .setDaylightName(timeZoneNames.getDisplayName(canonicalZoneId, - TimeZoneNames.NameType.LONG_DAYLIGHT, mNow.getTime())) - .setExemplarLocation(timeZoneNames.getExemplarLocationName(canonicalZoneId)) + .setGenericName(getTzNameForListDisplay(mLocale, timeZoneNames, + canonicalZoneId, mNow, TimeZoneNames.NameType.LONG_GENERIC)) + .setStandardName(getTzNameForListDisplay(mLocale, timeZoneNames, + canonicalZoneId, mNow, TimeZoneNames.NameType.LONG_STANDARD)) + .setDaylightName(getTzNameForListDisplay(mLocale, timeZoneNames, + canonicalZoneId, mNow, TimeZoneNames.NameType.LONG_DAYLIGHT)) + .setExemplarLocation(capitalizeForStandaloneDisplay(mLocale, + timeZoneNames.getExemplarLocationName(canonicalZoneId))) .setGmtOffset(gmtOffset) .build(); } + + private static String getTzNameForListDisplay( + Locale locale, TimeZoneNames timeZoneNames, String canonicalZoneId, Date now, + TimeZoneNames.NameType nameType) { + long nowEpochMillis = now.getTime(); + String displayName = timeZoneNames.getDisplayName( + canonicalZoneId, nameType, nowEpochMillis); + return capitalizeForStandaloneDisplay(locale, displayName); + } } /* package-private */ java.util.TimeZone getJavaTimeZone() {