UNPKG

@openui5/sap.ui.core

Version:

OpenUI5 Core Library sap.ui.core

133 lines (118 loc) 4.14 kB
/*! * OpenUI5 * (c) Copyright 2026 SAP SE or an SAP affiliate company. * Licensed under the Apache License, Version 2.0 - see LICENSE.txt. */ sap.ui.define([ "sap/base/Event", "sap/base/Log", "sap/base/i18n/Formatting", "sap/base/i18n/Localization", "sap/ui/thirdparty/jquery" ], ( BaseEvent, Log, Formatting, Localization, jQuery ) => { 'use strict'; const mRegistry = {}; function getObjectsToUpdate() { let aObjectsToUpdate = []; for (const fnGetObjects of Object.values(mRegistry)) { aObjectsToUpdate = [...aObjectsToUpdate, ...Object.values(fnGetObjects())]; } return aObjectsToUpdate; } function handleLocalizationChange(oEvent) { let sEventId = "LocalizationChanged"; /** * @deprecated As of Version 1.120 */ sEventId = "localizationChanged"; const mChanges = BaseEvent.getParameters(oEvent), oBrowserEvent = jQuery.Event(sEventId, {changes : mChanges}), aObjectsToUpdate = getObjectsToUpdate(), bRTLChanged = mChanges.rtl !== undefined, bLanguageChanged = mChanges.language !== undefined; Log.info("localization settings changed: " + Object.keys(mChanges).join(","), null, "sap/ui/core/util/LocalizationHelper"); // special handling for changes of the RTL mode if (bRTLChanged) { // update the dir attribute of the document document.documentElement.setAttribute("dir", mChanges.rtl ? "rtl" : "ltr"); Log.info("RTL mode " + mChanges.rtl ? "activated" : "deactivated"); } // special handling for changes of the language if (bLanguageChanged) { // update the lang attribute of the document document.documentElement.setAttribute("lang", mChanges.language); } /* * phase 1: update the models */ for (const oObject of aObjectsToUpdate) { for (const sName in oObject.oModels) { const oModel = oObject.oModels[sName]; oModel?._handleLocalizationChange?.(); } } /* * phase 2: update bindings and types */ for (const oObject of aObjectsToUpdate) { for (const sName in oObject.mBindingInfos) { const oBindingInfo = oObject.mBindingInfos[sName]; const aParts = oBindingInfo.parts; if (aParts) { // property or composite binding: visit all parts for (let i = 0; i < aParts.length; i++) { oBindingInfo.type?._handleLocalizationChange?.(); } oBindingInfo.modelChangeHandler?.(); } } // invalidate all UIAreas if RTL changed if (bRTLChanged && oObject.isA("sap.ui.core.UIArea")) { oObject.invalidate(); } // notify Elements via a pseudo browser event (onLocalizationChanged) if (oObject.isA("sap.ui.core.Element")) { oBrowserEvent._bNoReturnValue = true; // localizationChanged handler aren't allowed to return any value, mark for future fatal throw. oObject._handleEvent(oBrowserEvent); } } } Formatting.attachChange(handleLocalizationChange); Localization.attachChange(handleLocalizationChange); /** * Update all localization dependent objects that this managed object can reach, * except for its aggregated children (which will be updated by the Core). * * To make the update work as smooth as possible, it happens in two phases: * <ol> * <li>In phase 1 all known models are updated.</li> * <li>In phase 2 all bindings are updated.</li> * </ol> * This separation is necessary as the models for the bindings might be updated * in some ManagedObject or in the Core and the order in which the objects are visited * is not defined. * * @private * @ui5-restricted sap.ui.core */ const _LocalizationHelper = { init() { const sDir = Localization.getRTL() ? "rtl" : "ltr"; // Set the document's dir property document.documentElement.setAttribute("dir", sDir); // webkit does not allow setting document.dir before the body exists Log.info("Content direction set to '" + sDir + "'", null, "sap/ui/core/util/_LocalizationHelper"); // Set the document's lang property document.documentElement.setAttribute("lang", Localization.getLanguageTag().toString()); }, registerForUpdate(sType, fnGetObjects) { mRegistry[sType] = fnGetObjects; } }; return _LocalizationHelper; });