private void reInitFromParsedLocaleIdentifier()

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;
  }