function loadData(oLocale, bAsync) {

		var sLanguage = oLocale.getLanguage() || "",
			sRegion = oLocale.getRegion() || "",
			sScript = oLocale.getScript() || "";

		/*
		 * Merge a CLDR delta file and a CLDR fallback file.
		 *
		 * Note: this function can't be replaced by sap/base/util/extend or sap/base/util/merge
		 * as its contract for null values differs from those modules.
		 */
		function merge(obj, fallbackObj) {
			var name, value, fallbackValue;

			if ( !fallbackObj ) {
				return;
			}

			for ( name in fallbackObj ) {

				if ( fallbackObj.hasOwnProperty(name) ) {

					value = obj[ name ];
					fallbackValue = fallbackObj[ name ];

					if ( value === undefined ) {
						// 'undefined': value doesn't exist in delta, so take it from the fallback object
						// Note: undefined is not a valid value in JSON, so we can't misunderstand an existing undefined
						obj[name] = fallbackValue;
					} else if ( value === null ) {
						// 'null' is used by the delta tooling as a marker that a value must not be taken form the fallback
						delete obj[name];
					} else if ( typeof value === 'object' && typeof fallbackValue === 'object' && !Array.isArray(value) ) {
						// both values are objects, merge them recursively
						merge(value, fallbackValue);
					}

				}

			}

		}

		function getOrLoad(sId) {
			if (!mLocaleIdToData[sId] && A_SUPPORTED_LOCALES.includes(sId)
					|| mLocaleIdToData[sId] instanceof Promise && !bAsync) {
				mLocaleIdToData[sId] = SyncPromise.resolve(LoaderExtensions.loadResource(`sap/ui/core/cldr/${sId}.json`,
					{
						"async" : bAsync,
						dataType : "json",
						failOnError : false
					})).then((oData) => {
						// Note: When preload bundles are created the files in those bundles are optimized, i.e. for
						// language bundles similar entries/parts are aggregated inside a <language>.json
						// (e.g. 'ar.json') and only the region specific entries remain in the <language>_<region>.json
						// (e.g. 'ar_SA.json').
						// When a <language>_<region>.json is loaded the "__fallbackLocale" property inside the bundle
						// indicates that further CLDR data/entries have to be loaded from the referenced
						// <fallbackLocale>.json.
						if (oData) {
							return getOrLoad(oData.__fallbackLocale).then((oFallBackData) => {
								merge(oData, oFallBackData);
								mLocaleIdToData[sId] = oData;
								delete oData.__fallbackLocale;
								return oData;
							});
						}

						return oData;
					}).unwrap();
			}

			return SyncPromise.resolve(mLocaleIdToData[sId]);
		}

		// normalize language and handle special cases
		sLanguage = (sLanguage && Localization.getModernLanguage(sLanguage)) || sLanguage;
		// Special case 1: in an SAP context, the inclusive language code "no" always means Norwegian Bokmal ("nb")
		if ( sLanguage === "no" ) {
			sLanguage = "nb";
		}
		// Special case 2: for Chinese, derive a default region from the script (this behavior is inherited from Java)
		if ( sLanguage === "zh" && !sRegion ) {
			if ( sScript === "Hans" ) {
				sRegion = "CN";
			} else if ( sScript === "Hant" ) {
				sRegion = "TW";
			}
		}

		// Special case 3: for Serbian, there is script cyrillic and latin, "sh" and "sr-latn" map to "latin", "sr" maps to cyrillic
		// CLDR files: sr.json (cyrillic) and sr_Latn.json (latin)
		if (sLanguage === "sh" || (sLanguage === "sr" && sScript === "Latn")) {
			sLanguage = "sr_Latn";
		}

		// sId is the originally requested locale.
		// this is the key under which the result (even a fallback one) will be stored in the end
		const sId = sLanguage + "_" + sRegion;

		// the locale of the loaded json file
		let sCLDRLocaleId = sId;

		// first try: load CLDR data for specific language/region combination
		return getOrLoad(sId).then((mData) => {
			if (!mData) {
				// second try: no data was found for the language/region combination, try with only the language
				sCLDRLocaleId = sLanguage;
				return getOrLoad(sLanguage);
			}

			return mData;
		}).then((mData) => {
			if (!mData) {
				// last try: no data was found for language/region combination nor the language, load "en" locale data
				sCLDRLocaleId = "en";
				return getOrLoad("en");
			}

			return mData;
		}).then((mData) => {
			return {
				mData: mData,
				sCLDRLocaleId: sCLDRLocaleId.replace(/_/g, "-")
			};
		});
	}
Loads data from the generated CLDR files.

@param {sap.ui.core.Locale} oLocale
  The locale to load the CLDR data for
@param {boolean} [bAsync]
  Whether to load the data asynchronously

@returns {SyncPromise<{mData: Object<string, any>, sCLDRLocaleId: string}>}
  A <code>SyncPromise</code> which resolves with an object with two properties: <code>mData</code>
  containing the loaded CLDR data and <code>sCLDRLocaleId</code>, the used CLDR locale ID (e.g. "ar-SA");
  the <code>SyncPromise</code> never rejects; if neither the <language>_<region>.json nor the
  <language>.json data can be loaded via the second try, the English CLDR data is used as final fallback