in lib/Platform/Intl/java/com/facebook/hermes/intl/LocaleObjectAndroid.java [54:208]
private void reInitFromParsedLocaleIdentifier() throws JSRangeErrorException {
if (Build.VERSION.SDK_INT < 21) {
mLocale = Locale.ENGLISH; // Ugly hack for very old platforms ..
return;
}
StringBuffer localeIdBuffer = new StringBuffer();
StringBuffer languageSubtagBuffer = new StringBuffer(),
scriptSubtagBuffer = new StringBuffer(),
regionSubtagBuffer = new StringBuffer();
if (mParsedLocaleIdentifier.languageIdentifier.languageSubtag != null
&& !mParsedLocaleIdentifier.languageIdentifier.languageSubtag.isEmpty())
languageSubtagBuffer.append(mParsedLocaleIdentifier.languageIdentifier.languageSubtag);
if (mParsedLocaleIdentifier.languageIdentifier.scriptSubtag != null
&& !mParsedLocaleIdentifier.languageIdentifier.scriptSubtag.isEmpty())
scriptSubtagBuffer.append(mParsedLocaleIdentifier.languageIdentifier.scriptSubtag);
if (mParsedLocaleIdentifier.languageIdentifier.regionSubtag != null
&& !mParsedLocaleIdentifier.languageIdentifier.regionSubtag.isEmpty())
regionSubtagBuffer.append(mParsedLocaleIdentifier.languageIdentifier.regionSubtag);
LocaleIdentifier.replaceLanguageSubtagIfNeeded(
languageSubtagBuffer, scriptSubtagBuffer, regionSubtagBuffer);
if (languageSubtagBuffer.length() > 0) localeIdBuffer.append(languageSubtagBuffer.toString());
if (scriptSubtagBuffer.length() > 0) {
localeIdBuffer.append("-");
localeIdBuffer.append(scriptSubtagBuffer.toString());
}
if (regionSubtagBuffer.length() > 0) {
localeIdBuffer.append("-");
localeIdBuffer.append(LocaleIdentifier.replaceRegionSubtagIfNeeded(regionSubtagBuffer));
}
if (mParsedLocaleIdentifier.languageIdentifier.variantSubtagList != null
&& !mParsedLocaleIdentifier.languageIdentifier.variantSubtagList.isEmpty()) {
localeIdBuffer.append("-");
localeIdBuffer.append(
TextUtils.join("-", mParsedLocaleIdentifier.languageIdentifier.variantSubtagList));
}
// other extensions
if (mParsedLocaleIdentifier.otherExtensionsMap != null) {
for (Map.Entry<Character, ArrayList<String>> entry :
mParsedLocaleIdentifier.otherExtensionsMap.entrySet()) {
localeIdBuffer.append("-");
localeIdBuffer.append(entry.getKey());
localeIdBuffer.append("-");
localeIdBuffer.append(TextUtils.join("-", entry.getValue()));
}
}
// -t-extensions
if (mParsedLocaleIdentifier.transformedLanguageIdentifier != null
|| mParsedLocaleIdentifier.transformedExtensionFields != null) {
localeIdBuffer.append("-");
localeIdBuffer.append('t');
localeIdBuffer.append("-");
StringBuffer transformedExtension = new StringBuffer();
if (mParsedLocaleIdentifier.transformedLanguageIdentifier != null) {
transformedExtension.append(
mParsedLocaleIdentifier.transformedLanguageIdentifier.languageSubtag);
if (mParsedLocaleIdentifier.transformedLanguageIdentifier.scriptSubtag != null) {
transformedExtension.append("-");
transformedExtension.append(
mParsedLocaleIdentifier.transformedLanguageIdentifier.scriptSubtag);
}
if (mParsedLocaleIdentifier.transformedLanguageIdentifier.regionSubtag != null) {
transformedExtension.append("-");
transformedExtension.append(
mParsedLocaleIdentifier.transformedLanguageIdentifier.regionSubtag);
}
if (mParsedLocaleIdentifier.transformedLanguageIdentifier.variantSubtagList != null
&& !mParsedLocaleIdentifier.transformedLanguageIdentifier.variantSubtagList.isEmpty()) {
transformedExtension.append("-");
transformedExtension.append(
TextUtils.join(
"-", mParsedLocaleIdentifier.transformedLanguageIdentifier.variantSubtagList));
}
}
if (mParsedLocaleIdentifier.transformedExtensionFields != null) {
for (Map.Entry<String, ArrayList<String>> entry :
mParsedLocaleIdentifier.transformedExtensionFields.entrySet()) {
String key = entry.getKey();
ArrayList<String> values = entry.getValue();
transformedExtension.append("-" + key);
for (String value : values) transformedExtension.append("-" + value);
}
if (transformedExtension.length() > 0 && transformedExtension.charAt(0) == '-')
transformedExtension.deleteCharAt(0);
}
localeIdBuffer.append(transformedExtension.toString());
}
// -u-extensions
if (mParsedLocaleIdentifier.unicodeExtensionAttributes != null
|| mParsedLocaleIdentifier.unicodeExtensionKeywords != null) {
localeIdBuffer.append("-");
localeIdBuffer.append('u');
localeIdBuffer.append("-");
// unicode extension attributes
StringBuffer extension = new StringBuffer();
if (mParsedLocaleIdentifier.unicodeExtensionAttributes != null)
extension.append(TextUtils.join("-", mParsedLocaleIdentifier.unicodeExtensionAttributes));
// unicode extension keywords
if (mParsedLocaleIdentifier.unicodeExtensionKeywords != null) {
for (Map.Entry<String, ArrayList<String>> entry :
mParsedLocaleIdentifier.unicodeExtensionKeywords.entrySet()) {
String key = entry.getKey();
ArrayList<String> values = entry.getValue();
extension.append("-" + key);
for (String value : values) extension.append("-" + value);
}
}
if (extension.length() > 0 && extension.charAt(0) == '-') extension.deleteCharAt(0);
localeIdBuffer.append(extension.toString());
}
// pu extension
if (mParsedLocaleIdentifier.puExtensions != null) {
localeIdBuffer.append("-");
localeIdBuffer.append('x');
localeIdBuffer.append("-");
localeIdBuffer.append(TextUtils.join("-", mParsedLocaleIdentifier.puExtensions));
}
try {
mLocale = Locale.forLanguageTag(localeIdBuffer.toString());
} catch (RuntimeException ex) {
throw new JSRangeErrorException(ex.getMessage());
}
mIsDirty = false;
}