author | Zibi Braniecki <zbraniecki@mozilla.com> |
Sat, 08 Jul 2017 13:54:04 -0700 | |
changeset 368299 | fe0297d33e87197a32cc35dbe02e7dd0c948265f |
parent 368298 | 0e4a948fbae28f323599eedd0da5f75a13289ff5 |
child 368300 | 495183c0c39097efdc623c46c725901b16388ef2 |
push id | 32161 |
push user | cbook@mozilla.com |
push date | Wed, 12 Jul 2017 09:06:33 +0000 |
treeherder | mozilla-central@2ea915a5c474 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | jfkthame |
bugs | 1379420 |
milestone | 56.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/intl/locale/LocaleService.cpp +++ b/intl/locale/LocaleService.cpp @@ -215,16 +215,28 @@ LocaleService::GetAppLocalesAsBCP47(nsTA for (uint32_t i = 0; i < mAppLocales.Length(); i++) { nsAutoCString locale(mAppLocales[i]); SanitizeForBCP47(locale); aRetVal.AppendElement(locale); } } void +LocaleService::GetRegionalPrefsLocales(nsTArray<nsCString>& aRetVal) +{ + bool useOSLocales = Preferences::GetBool("intl.regional_prefs.use_os_locales", false); + + if (useOSLocales && OSPreferences::GetInstance()->GetSystemLocales(aRetVal)) { + return; + } + + GetAppLocalesAsBCP47(aRetVal); +} + +void LocaleService::AssignAppLocales(const nsTArray<nsCString>& aAppLocales) { MOZ_ASSERT(!mIsServer, "This should only be called for LocaleService in client mode."); mAppLocales = aAppLocales; nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService(); if (obs) { obs->NotifyObservers(nullptr, "intl:app-locales-changed", nullptr); @@ -607,16 +619,33 @@ LocaleService::GetAppLocaleAsBCP47(nsACS NegotiateAppLocales(mAppLocales); } aRetVal = mAppLocales[0]; SanitizeForBCP47(aRetVal); return NS_OK; } +NS_IMETHODIMP +LocaleService::GetRegionalPrefsLocales(uint32_t* aCount, char*** aOutArray) +{ + AutoTArray<nsCString,10> rgLocales; + + GetRegionalPrefsLocales(rgLocales); + + *aCount = rgLocales.Length(); + *aOutArray = static_cast<char**>(moz_xmalloc(*aCount * sizeof(char*))); + + for (uint32_t i = 0; i < *aCount; i++) { + (*aOutArray)[i] = moz_xstrdup(rgLocales[i].get()); + } + + return NS_OK; +} + static LocaleService::LangNegStrategy ToLangNegStrategy(int32_t aStrategy) { switch (aStrategy) { case 1: return LocaleService::LangNegStrategy::Matching; case 2: return LocaleService::LangNegStrategy::Lookup;
--- a/intl/locale/LocaleService.h +++ b/intl/locale/LocaleService.h @@ -121,16 +121,36 @@ public: * nsTArray<nsCString> appLocales; * LocaleService::GetInstance()->GetAppLocalesAsLangTags(appLocales); * * (See mozILocaleService.idl for a JS-callable version of this.) */ void GetAppLocalesAsLangTags(nsTArray<nsCString>& aRetVal); void GetAppLocalesAsBCP47(nsTArray<nsCString>& aRetVal); + + /** + * Returns a list of locales to use for any regional specific operations + * like date formatting, calendars, unit formatting etc. + * + * The result is a ordered list of valid locale IDs and it should be + * used for all APIs that accept list of locales, like ECMA402 and L10n APIs. + * + * This API always returns at least one locale. + * + * Example: ["en-US", "de", "pl", "sr-Cyrl", "zh-Hans-HK"] + * + * Usage: + * nsTArray<nsCString> rgLocales; + * LocaleService::GetInstance()->GetRegionalPrefsLocales(rgLocales); + * + * (See mozILocaleService.idl for a JS-callable version of this.) + */ + void GetRegionalPrefsLocales(nsTArray<nsCString>& aRetVal); + /** * This method should only be called in the client mode. * * It replaces all the language negotiation and is supposed to be called * in order to bring the client LocaleService in sync with the server * LocaleService. * * Currently, it's called by the IPC code.
--- a/intl/locale/mozILocaleService.idl +++ b/intl/locale/mozILocaleService.idl @@ -78,16 +78,32 @@ interface mozILocaleService : nsISupport * (See LocaleService.h for a more C++-friendly version of this.) */ void getAppLocalesAsLangTags([optional] out unsigned long aCount, [retval, array, size_is(aCount)] out string aLocales); void getAppLocalesAsBCP47([optional] out unsigned long aCount, [retval, array, size_is(aCount)] out string aLocales); /** + * Returns a list of locales to use for any regional specific operations + * like date formatting, calendars, unit formatting etc. + * + * The result is a ordered list of valid locale IDs and it should be + * used for all APIs that accept list of locales, like ECMA402 and L10n APIs. + * + * This API always returns at least one locale. + * + * Example: ["en-US", "de", "pl", "sr-Cyrl", "zh-Hans-HK"] + * + * (See LocaleService.h for a more C++-friendly version of this.) + */ + void getRegionalPrefsLocales([optional] out unsigned long aCount, + [retval, array, size_is(aCount)] out string aOutArray); + + /** * Negotiates the best locales out of a ordered list of requested locales and * a list of available locales. * * Internally it uses the following naming scheme: * * Requested - locales requested by the user * Available - locales for which the data is available * Supported - locales negotiated by the algorithm
--- a/modules/libpref/init/all.js +++ b/modules/libpref/init/all.js @@ -2187,16 +2187,20 @@ pref("converter.html2txt.always_include_ pref("intl.accept_languages", "chrome://global/locale/intl.properties"); pref("intl.menuitems.alwaysappendaccesskeys","chrome://global/locale/intl.properties"); pref("intl.menuitems.insertseparatorbeforeaccesskeys","chrome://global/locale/intl.properties"); pref("intl.charset.detector", "chrome://global/locale/intl.properties"); pref("intl.charset.fallback.override", ""); pref("intl.charset.fallback.tld", true); pref("intl.ellipsis", "chrome://global-platform/locale/intl.properties"); pref("intl.locale.matchOS", false); +// this pref allows user to request that all internationalization formatters +// like date/time formatting, unit formatting, calendars etc. should use +// OS locale set instead of the app locale set. +pref("intl.regional_prefs.use_os_locales", false); // fallback charset list for Unicode conversion (converting from Unicode) // currently used for mail send only to handle symbol characters (e.g Euro, trademark, smartquotes) // for ISO-8859-1 pref("intl.fallbackCharsetList.ISO-8859-1", "windows-1252"); pref("font.language.group", "chrome://global/locale/intl.properties"); // Android-specific pref to use key-events-only mode for IME-unaware webapps. #ifdef MOZ_WIDGET_ANDROID