Titanium JIRA Archive
Titanium SDK/CLI (TIMOB)

[TIMOB-27892] Android: Update toLocale*String() methods to support locale/options

GitHub Issuen/a
TypeImprovement
PriorityMedium
StatusClosed
ResolutionFixed
Resolution Date2020-07-19T14:16:20.000+0000
Affected Version/sn/a
Fix Version/sRelease 9.1.0
ComponentsAndroid
LabelsDateTimeFormat, Intl, NumberFormat, android, format, locale, localization, parity
ReporterJoshua Quick
AssigneeJoshua Quick
Created2020-05-08T18:57:40.000+0000
Updated2020-12-04T20:31:12.000+0000

Description

*Summary:* On Android, the following methods ignore the locales and options arguments. They also ignore the current locale and always use "en-US" when formatting a string. * [Date.toLocaleString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleString) * [Date.toLocaleDateString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleDateString) * [Date.toLocaleTimeString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleTimeString) * [Number.toLocaleString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toLocaleString) * [String.localeCompare()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare) * [String.toLocaleLowerCase()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLocaleLowerCase) * [String.toLocaleUpperCase()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/toLocaleLowerCase) On iOS, the above methods *+do+* support locale/options. We should add the same on Android for parity and to better support the standard JavaScript APIs. *Note:* To add official Intl support to V8, we would have to #if it in, but this involves adding the ICU (International Components for Unicode) C++ library which is about 20 MB per architecture. This is too big and is not mobile friendly. Especially since Google Play has a 100 MB limit on APKs. So, the most reasonable solution is to implement this ourselves in Java. *Alternatives:* On older Titanium versions, your only option to generate localized strings was via APIs: * [String.formatDecimal()](https://docs.appcelerator.com/platform/latest/#!/api/Global.String-method-formatDecimal) * [String.formatDate()](https://docs.appcelerator.com/platform/latest/#!/api/Global.String-method-formatDate) * [String.formatTime()](https://docs.appcelerator.com/platform/latest/#!/api/Global.String-method-formatTime)

Comments

  1. Joshua Quick 2020-05-09

    PR (master): https://github.com/appcelerator/titanium_mobile/pull/11698
  2. Christopher Williams 2020-07-19

    manually rebase/merged to master, 9_1_X, 9_3_X
  3. Samir Mohammed 2020-07-30

    *Closing ticket*. Fix verified in SDK version 9.1.0.v20200724110711, 9.2.0.v20200724112452 and 9.3.0.v20200724114100. Test and other information can be found at: https://github.com/appcelerator/titanium_mobile/pull/11698 PR (master): https://github.com/appcelerator/titanium_mobile/pull/11830 PR (9.1.x): https://github.com/appcelerator/titanium_mobile/pull/11831 *Test Environment*
       MacOS Big Sur: 11.0 Beta
       Xcode: 12.0 Beta 
       Java Version: 1.8.0_242
       Android NDK: 21.3.6528147
       Node.js: 12.18.1
       ""NPM":"5.0.0","CLI":"8.1.0-master.5""
       API19 Nexus5X
       API29 Pixel XL emulator
       

JSON Source