diff --git a/docs/Configuration.md b/docs/Configuration.md index bb97e7e2c4ee..eb57a1c0e41d 100644 --- a/docs/Configuration.md +++ b/docs/Configuration.md @@ -34,7 +34,18 @@ The `theme` setting values above are the technical names of our themes. In order to have RTL mode, just set the HTML attribute `dir` to `rtl` on the `body`, `html` or any other relevant region of your application. -This configuration setting should not be used by applications. It is only internally used for specific integration scenarios. +The `RTL` configuration setting should not be used by applications. It is only internally used for specific integration scenarios. + +*Note:* Whenever you change `dir` dynamically, make sure you call the `applyDirection` method to re-render the RTL-aware components. + +Example: +```js +import applyDirection from "@ui5/webcomponents-base/dist/locale/applyDirection.js"; + +document.body.dir = "rtl"; +applyDirection(); +``` + ### Animation Mode @@ -122,7 +133,7 @@ To do so, please import the desired functionality from the respective `"@ui5/web import { getTheme, setTheme } from "@ui5/webcomponents-base/dist/config/Theme.js"; import { getNoConflict, setNoConflict } from "@ui5/webcomponents-base/dist/config/NoConflict.js"; import { getAnimationMode } from "@ui5/webcomponents-base/dist/config/AnimationMode.js"; -import { getLanguage } from "@ui5/webcomponents-base/dist/config/Language.js"; +import { getLanguage, setLanguage } from "@ui5/webcomponents-base/dist/config/Language.js"; import { getCalendarType } from "@ui5/webcomponents-base/dist/config/CalendarType.js"; import { getFirstDayOfWeek } from "@ui5/webcomponents-base/dist/config/FormatSettings.js"; ``` diff --git a/packages/base/src/CustomElementsRegistry.js b/packages/base/src/CustomElementsRegistry.js index 25f45f450f4c..40d667961825 100644 --- a/packages/base/src/CustomElementsRegistry.js +++ b/packages/base/src/CustomElementsRegistry.js @@ -1,3 +1,5 @@ +import setToArray from "./util/setToArray.js"; + const Definitions = new Set(); const Failures = new Set(); let failureTimeout; @@ -11,11 +13,7 @@ const isTagRegistered = tag => { }; const getAllRegisteredTags = () => { - const arr = []; - Definitions.forEach(tag => { - arr.push(tag); - }); - return arr; + return setToArray(Definitions); }; const recordTagRegistrationFailure = tag => { @@ -29,11 +27,7 @@ const recordTagRegistrationFailure = tag => { }; const displayFailedRegistrations = () => { - const tags = []; // IE only supports Set.prototype.forEach - Failures.forEach(tag => { - tags.push(tag); - }); - console.warn(`The following tags have already been defined by a different UI5 Web Components version: ${tags.join(", ")}`); // eslint-disable-line + console.warn(`The following tags have already been defined by a different UI5 Web Components version: ${setToArray(Failures).join(", ")}`); // eslint-disable-line Failures.clear(); }; diff --git a/packages/base/src/EventProvider.js b/packages/base/src/EventProvider.js index c3fbbeecf8de..e9c16eb818cf 100644 --- a/packages/base/src/EventProvider.js +++ b/packages/base/src/EventProvider.js @@ -34,16 +34,24 @@ class EventProvider { } } + /** + * Fires an event and returns the results of all event listeners as an array. + * Example: If listeners return promises, you can: await fireEvent("myEvent") to know when all listeners have finished. + * + * @param eventName the event to fire + * @param data optional data to pass to each event listener + * @returns {Array} an array with the results of all event listeners + */ fireEvent(eventName, data) { const eventRegistry = this._eventRegistry; const eventListeners = eventRegistry[eventName]; if (!eventListeners) { - return; + return []; } - eventListeners.forEach(event => { - event["function"].call(this, data); // eslint-disable-line + return eventListeners.map(event => { + return event["function"].call(this, data); // eslint-disable-line }); } diff --git a/packages/base/src/RenderScheduler.js b/packages/base/src/RenderScheduler.js index 7e37e4cc548e..3f1a5909508a 100644 --- a/packages/base/src/RenderScheduler.js +++ b/packages/base/src/RenderScheduler.js @@ -1,7 +1,9 @@ import RenderQueue from "./RenderQueue.js"; import { getAllRegisteredTags } from "./CustomElementsRegistry.js"; +import { isRtlAware } from "./locale/RTLAwareRegistry.js"; const MAX_RERENDER_COUNT = 10; +const registeredElements = new Set(); // Tells whether a render task is currently scheduled let renderTaskId; @@ -141,6 +143,36 @@ class RenderScheduler { renderTaskPromise = undefined; } } + + static register(element) { + registeredElements.add(element); + } + + static deregister(element) { + registeredElements.delete(element); + } + + /** + * Re-renders all UI5 Elements on the page, with the option to specify filters to rerender only some components. + * + * Usage: + * reRenderAllUI5Elements() -> rerenders all components + * reRenderAllUI5Elements({rtlAware: true}) -> re-renders only rtlAware components + * reRenderAllUI5Elements({languageAware: true}) -> re-renders only languageAware components + * reRenderAllUI5Elements({rtlAware: true, languageAware: true}) -> re-renders components that are rtlAware or languageAware + * + * @public + * @param {Object|undefined} filters - Object with keys that can be "rtlAware" or "languageAware" + */ + static reRenderAllUI5Elements(filters) { + registeredElements.forEach(element => { + const rtlAware = isRtlAware(element.constructor); + const languageAware = element.constructor.getMetadata().isLanguageAware(); + if (!filters || (filters.rtlAware && rtlAware) || (filters.languageAware && languageAware)) { + RenderScheduler.renderDeferred(element); + } + }); + } } export default RenderScheduler; diff --git a/packages/base/src/UI5Element.js b/packages/base/src/UI5Element.js index 9060f853f26f..d7fac18d7ae4 100644 --- a/packages/base/src/UI5Element.js +++ b/packages/base/src/UI5Element.js @@ -15,6 +15,7 @@ import Float from "./types/Float.js"; import { kebabToCamelCase, camelToKebabCase } from "./util/StringHelper.js"; import isValidPropertyName from "./util/isValidPropertyName.js"; import isSlot from "./util/isSlot.js"; +import { markAsRtlAware } from "./locale/RTLAwareRegistry.js"; const metadata = { events: { @@ -114,6 +115,7 @@ class UI5Element extends HTMLElement { await Promise.resolve(); } + RenderScheduler.register(this); await RenderScheduler.renderImmediately(this); this._domRefReadyPromise._deferredResolve(); if (typeof this.onEnterDOM === "function") { @@ -136,6 +138,7 @@ class UI5Element extends HTMLElement { this._stopObservingDOMChildren(); } + RenderScheduler.deregister(this); if (typeof this.onExitDOM === "function") { this.onExitDOM(); } @@ -672,6 +675,8 @@ class UI5Element extends HTMLElement { * @returns {String|undefined} */ get effectiveDir() { + markAsRtlAware(this.constructor); // if a UI5 Element calls this method, it's considered to be rtl-aware + const doc = window.document; const dirValues = ["ltr", "rtl"]; // exclude "auto" and "" from all calculations const locallyAppliedDir = getComputedStyle(this).getPropertyValue(GLOBAL_DIR_CSS_VAR); diff --git a/packages/base/src/UI5ElementMetadata.js b/packages/base/src/UI5ElementMetadata.js index ceb9e68a71d8..29cf94d88d73 100644 --- a/packages/base/src/UI5ElementMetadata.js +++ b/packages/base/src/UI5ElementMetadata.js @@ -126,6 +126,14 @@ class UI5ElementMetadata { getEvents() { return this.metadata.events || {}; } + + /** + * Determines whether this UI5 Element has any translatable texts (needs to be invalidated upon language change) + * @returns {boolean} + */ + isLanguageAware() { + return !!this.metadata.languageAware; + } } const validateSingleProperty = (value, propData) => { diff --git a/packages/base/src/asset-registries/i18n.js b/packages/base/src/asset-registries/i18n.js index 8a88501724ee..5e8b8007b055 100644 --- a/packages/base/src/asset-registries/i18n.js +++ b/packages/base/src/asset-registries/i18n.js @@ -1,5 +1,6 @@ import { getFeature } from "../FeaturesRegistry.js"; import getLocale from "../locale/getLocale.js"; +import { attachLanguageChange } from "../locale/languageChange.js"; import { fetchTextOnce } from "../util/FetchHelper.js"; import normalizeLocale from "../locale/normalizeLocale.js"; import nextFallbackLocale from "../locale/nextFallbackLocale.js"; @@ -63,6 +64,7 @@ const fetchI18nBundle = async packageName => { } if (!bundlesForPackage[localeId]) { + setI18nBundleData(packageName, null); // reset for the default language (if data was set for a previous language) return; } @@ -90,6 +92,12 @@ const fetchI18nBundle = async packageName => { setI18nBundleData(packageName, data); }; +// When the language changes dynamically (the user calls setLanguage), re-fetch all previously fetched bundles +attachLanguageChange(() => { + const allPackages = [...bundleData.keys()]; + return Promise.all(allPackages.map(fetchI18nBundle)); +}); + export { fetchI18nBundle, registerI18nBundle, diff --git a/packages/base/src/config/Language.js b/packages/base/src/config/Language.js index 99629a2379ac..909a670d76fd 100644 --- a/packages/base/src/config/Language.js +++ b/packages/base/src/config/Language.js @@ -1,7 +1,13 @@ import { getLanguage as getConfiguredLanguage } from "../InitialConfiguration.js"; +import { fireLanguageChange } from "../locale/languageChange.js"; +import RenderScheduler from "../RenderScheduler.js"; let language; +/** + * Returns the currently configured language, or the browser language as a fallback + * @returns {String} + */ const getLanguage = () => { if (language === undefined) { language = getConfiguredLanguage(); @@ -9,4 +15,27 @@ const getLanguage = () => { return language; }; -export { getLanguage }; // eslint-disable-line +/** + * Changes the current language, re-fetches all message bundles, updates all language-aware components + * and returns a promise that resolves when all rendering is done + * + * @param newLanguage + * @returns {Promise} + */ +const setLanguage = async newLanguage => { + if (language === newLanguage) { + return; + } + + language = newLanguage; + + const listenersResults = fireLanguageChange(newLanguage); + await Promise.all(listenersResults); + RenderScheduler.reRenderAllUI5Elements({ languageAware: true }); + return RenderScheduler.whenFinished(); +}; + +export { + getLanguage, + setLanguage, +}; diff --git a/packages/base/src/locale/RTLAwareRegistry.js b/packages/base/src/locale/RTLAwareRegistry.js new file mode 100644 index 000000000000..fd14d9010d0a --- /dev/null +++ b/packages/base/src/locale/RTLAwareRegistry.js @@ -0,0 +1,14 @@ +const rtlAwareSet = new Set(); + +const markAsRtlAware = klass => { + rtlAwareSet.add(klass); +}; + +const isRtlAware = klass => { + return rtlAwareSet.has(klass); +}; + +export { + markAsRtlAware, + isRtlAware, +}; diff --git a/packages/base/src/locale/applyDirection.js b/packages/base/src/locale/applyDirection.js new file mode 100644 index 000000000000..7d5859594063 --- /dev/null +++ b/packages/base/src/locale/applyDirection.js @@ -0,0 +1,15 @@ +import RenderScheduler from "../RenderScheduler.js"; + +/** + * Re-renders all RTL-aware UI5 Elements. + * Call this method whenever you change the "dir" property anywhere in your HTML page + * Example: document.body.dir = "rtl"; applyDirection(); + * + * @returns {Promise} + */ +const applyDirection = () => { + RenderScheduler.reRenderAllUI5Elements({ rtlAware: true }); + return RenderScheduler.whenFinished(); +}; + +export default applyDirection; diff --git a/packages/base/src/locale/languageChange.js b/packages/base/src/locale/languageChange.js new file mode 100644 index 000000000000..02863b12a92e --- /dev/null +++ b/packages/base/src/locale/languageChange.js @@ -0,0 +1,22 @@ +import EventProvider from "../EventProvider.js"; + +const eventProvider = new EventProvider(); +const LANG_CHANGE = "languageChange"; + +const attachLanguageChange = listener => { + eventProvider.attachEvent(LANG_CHANGE, listener); +}; + +const detachLanguageChange = listener => { + eventProvider.detachEvent(LANG_CHANGE, listener); +}; + +const fireLanguageChange = lang => { + return eventProvider.fireEvent(LANG_CHANGE, lang); +}; + +export { + attachLanguageChange, + detachLanguageChange, + fireLanguageChange, +}; diff --git a/packages/base/src/util/setToArray.js b/packages/base/src/util/setToArray.js new file mode 100644 index 000000000000..3ddce745b1ba --- /dev/null +++ b/packages/base/src/util/setToArray.js @@ -0,0 +1,10 @@ +// This is needed as IE11 doesn't have Set.prototype.keys/values/entries, so [...mySet.values()] is not an option +const setToArray = s => { + const arr = []; + s.forEach(item => { + arr.push(item); + }); + return arr; +}; + +export default setToArray; diff --git a/packages/fiori/src/NotificationListGroupItem.js b/packages/fiori/src/NotificationListGroupItem.js index 62f76dee83e2..55b57882a75f 100644 --- a/packages/fiori/src/NotificationListGroupItem.js +++ b/packages/fiori/src/NotificationListGroupItem.js @@ -29,7 +29,6 @@ import NotificationListGroupItemCss from "./generated/themes/NotificationListGro */ const metadata = { tag: "ui5-li-notification-group", - rtlAware: true, languageAware: true, managedSlots: true, properties: /** @lends sap.ui.webcomponents.fiori.NotificationListGroupItem.prototype */ { diff --git a/packages/fiori/src/NotificationListItem.js b/packages/fiori/src/NotificationListItem.js index 9743a21d5a3d..79ff0d13906c 100644 --- a/packages/fiori/src/NotificationListItem.js +++ b/packages/fiori/src/NotificationListItem.js @@ -38,7 +38,6 @@ const MAX_WRAP_HEIGHT = 32; // px. */ const metadata = { tag: "ui5-li-notification", - rtlAware: true, languageAware: true, managedSlots: true, properties: /** @lends sap.ui.webcomponents.fiori.NotificationListItem.prototype */ { diff --git a/packages/fiori/src/ShellBar.js b/packages/fiori/src/ShellBar.js index 6a34ca3a2eae..37aa5b81849e 100644 --- a/packages/fiori/src/ShellBar.js +++ b/packages/fiori/src/ShellBar.js @@ -38,7 +38,6 @@ import styles from "./generated/themes/ShellBar.css.js"; */ const metadata = { tag: "ui5-shellbar", - rtlAware: true, languageAware: true, properties: /** @lends sap.ui.webcomponents.fiori.ShellBar.prototype */ { diff --git a/packages/main/bundle.es5.js b/packages/main/bundle.es5.js index 5c0d28c746be..0ad2120f902d 100644 --- a/packages/main/bundle.es5.js +++ b/packages/main/bundle.es5.js @@ -5,14 +5,18 @@ import "./bundle.esm.js"; import { getAnimationMode } from "@ui5/webcomponents-base/dist/config/AnimationMode.js"; import { getTheme, setTheme } from "@ui5/webcomponents-base/dist/config/Theme.js"; +import { getLanguage, setLanguage } from "@ui5/webcomponents-base/dist/config/Language.js"; import { setNoConflict } from "@ui5/webcomponents-base/dist/config/NoConflict.js"; import { getRTL } from "@ui5/webcomponents-base/dist/config/RTL.js"; import { getFirstDayOfWeek } from "@ui5/webcomponents-base/dist/config/FormatSettings.js"; -import { getRegisteredNames as getIconNames } from "@ui5/webcomponents-base/dist/SVGIconRegistry.js" +import { getRegisteredNames as getIconNames } from "@ui5/webcomponents-base/dist/SVGIconRegistry.js"; +import applyDirection from "@ui5/webcomponents-base/dist/locale/applyDirection.js"; const configuration = { getAnimationMode, getTheme, setTheme, + getLanguage, + setLanguage, setNoConflict, getRTL, getFirstDayOfWeek, @@ -20,4 +24,5 @@ const configuration = { export { configuration, getIconNames, + applyDirection, }; diff --git a/packages/main/bundle.esm.js b/packages/main/bundle.esm.js index df743600da70..dc9c1163f26f 100644 --- a/packages/main/bundle.esm.js +++ b/packages/main/bundle.esm.js @@ -90,19 +90,24 @@ window.isIE = isIE; // attached to the window object for testing purposes // Note: keep in sync with rollup.config value for IIFE import { getAnimationMode } from "@ui5/webcomponents-base/dist/config/AnimationMode.js"; import { getTheme, setTheme } from "@ui5/webcomponents-base/dist/config/Theme.js"; +import { getLanguage, setLanguage } from "@ui5/webcomponents-base/dist/config/Language.js"; import { setNoConflict } from "@ui5/webcomponents-base/dist/config/NoConflict.js"; import { getRTL } from "@ui5/webcomponents-base/dist/config/RTL.js"; import { getFirstDayOfWeek } from "@ui5/webcomponents-base/dist/config/FormatSettings.js"; -import { getRegisteredNames as getIconNames } from "@ui5/webcomponents-base/dist/SVGIconRegistry.js" +import { getRegisteredNames as getIconNames } from "@ui5/webcomponents-base/dist/SVGIconRegistry.js"; +import applyDirection from "@ui5/webcomponents-base/dist/locale/applyDirection.js"; window["sap-ui-webcomponents-bundle"] = { configuration : { getAnimationMode, getTheme, setTheme, + getLanguage, + setLanguage, setNoConflict, getRTL, getFirstDayOfWeek, }, getIconNames, getLocaleData, + applyDirection, }; diff --git a/packages/main/src/Badge.js b/packages/main/src/Badge.js index ab4180b65ef3..e9a72838de78 100644 --- a/packages/main/src/Badge.js +++ b/packages/main/src/Badge.js @@ -15,7 +15,6 @@ import badgeCss from "./generated/themes/Badge.css.js"; */ const metadata = { tag: "ui5-badge", - rtlAware: true, languageAware: true, properties: /** @lends sap.ui.webcomponents.main.Badge.prototype */ { diff --git a/packages/main/src/Button.js b/packages/main/src/Button.js index 27b1d25b024e..b01522d1cd2d 100644 --- a/packages/main/src/Button.js +++ b/packages/main/src/Button.js @@ -21,7 +21,6 @@ let activeButton = null; */ const metadata = { tag: "ui5-button", - rtlAware: true, languageAware: true, properties: /** @lends sap.ui.webcomponents.main.Button.prototype */ { diff --git a/packages/main/src/CalendarHeader.js b/packages/main/src/CalendarHeader.js index 3b9311297cf2..fca9fc69cf7d 100644 --- a/packages/main/src/CalendarHeader.js +++ b/packages/main/src/CalendarHeader.js @@ -13,7 +13,6 @@ import styles from "./generated/themes/CalendarHeader.css.js"; const metadata = { tag: "ui5-calendar-header", - rtlAware: true, properties: { monthText: { type: String, diff --git a/packages/main/src/Card.js b/packages/main/src/Card.js index 6bcbebab5c82..31f057cd2795 100644 --- a/packages/main/src/Card.js +++ b/packages/main/src/Card.js @@ -21,7 +21,6 @@ import cardCss from "./generated/themes/Card.css.js"; */ const metadata = { tag: "ui5-card", - rtlAware: true, languageAware: true, managedSlots: true, slots: /** @lends sap.ui.webcomponents.main.Card.prototype */ { diff --git a/packages/main/src/CheckBox.js b/packages/main/src/CheckBox.js index 3ff238956443..bbf526703ec8 100644 --- a/packages/main/src/CheckBox.js +++ b/packages/main/src/CheckBox.js @@ -21,7 +21,6 @@ import checkboxCss from "./generated/themes/CheckBox.css.js"; */ const metadata = { tag: "ui5-checkbox", - rtlAware: true, languageAware: true, properties: /** @lends sap.ui.webcomponents.main.CheckBox.prototype */ { diff --git a/packages/main/src/ComboBox.js b/packages/main/src/ComboBox.js index 32fab123b6db..5724eb446d38 100644 --- a/packages/main/src/ComboBox.js +++ b/packages/main/src/ComboBox.js @@ -38,7 +38,6 @@ import StandardListItem from "./StandardListItem.js"; */ const metadata = { tag: "ui5-combobox", - rtlAware: true, languageAware: true, defaultSlot: "items", properties: /** @lends sap.ui.webcomponents.main.ComboBox.prototype */ { diff --git a/packages/main/src/DatePicker.js b/packages/main/src/DatePicker.js index b0f680bc3c6f..730960b26f4f 100644 --- a/packages/main/src/DatePicker.js +++ b/packages/main/src/DatePicker.js @@ -36,7 +36,6 @@ import ResponsivePopoverCommonCss from "./generated/themes/ResponsivePopoverComm */ const metadata = { tag: "ui5-datepicker", - rtlAware: true, languageAware: true, managedSlots: true, properties: /** @lends sap.ui.webcomponents.main.DatePicker.prototype */ { diff --git a/packages/main/src/Icon.js b/packages/main/src/Icon.js index 59cdc34697e3..3bc66f6e4de3 100644 --- a/packages/main/src/Icon.js +++ b/packages/main/src/Icon.js @@ -16,7 +16,6 @@ const ICON_NOT_FOUND = "ICON_NOT_FOUND"; */ const metadata = { tag: "ui5-icon", - rtlAware: true, languageAware: true, properties: /** @lends sap.ui.webcomponents.main.Icon.prototype */ { /** diff --git a/packages/main/src/Label.js b/packages/main/src/Label.js index f7a1fc95a864..4a27ce3d8734 100644 --- a/packages/main/src/Label.js +++ b/packages/main/src/Label.js @@ -12,7 +12,6 @@ import labelCss from "./generated/themes/Label.css.js"; */ const metadata = { tag: "ui5-label", - rtlAware: true, properties: /** @lends sap.ui.webcomponents.main.Label.prototype */ { /** diff --git a/packages/main/src/ListItem.js b/packages/main/src/ListItem.js index f8cbc350fef4..6022520d3b45 100644 --- a/packages/main/src/ListItem.js +++ b/packages/main/src/ListItem.js @@ -17,7 +17,6 @@ import styles from "./generated/themes/ListItem.css.js"; * @public */ const metadata = { - rtlAware: true, languageAware: true, properties: /** @lends sap.ui.webcomponents.main.ListItem.prototype */ { diff --git a/packages/main/src/MessageStrip.js b/packages/main/src/MessageStrip.js index c91aff8536f9..6f6add247e53 100644 --- a/packages/main/src/MessageStrip.js +++ b/packages/main/src/MessageStrip.js @@ -20,7 +20,6 @@ import messageStripCss from "./generated/themes/MessageStrip.css.js"; */ const metadata = { tag: "ui5-messagestrip", - rtlAware: true, languageAware: true, properties: /** @lends sap.ui.webcomponents.main.MessageStrip.prototype */ { diff --git a/packages/main/src/MultiComboBox.js b/packages/main/src/MultiComboBox.js index d3dc67840570..f0dd8dee085b 100644 --- a/packages/main/src/MultiComboBox.js +++ b/packages/main/src/MultiComboBox.js @@ -41,7 +41,6 @@ import ResponsivePopoverCommonCss from "./generated/themes/ResponsivePopoverComm */ const metadata = { tag: "ui5-multi-combobox", - rtlAware: true, languageAware: true, managedSlots: true, slots: /** @lends sap.ui.webcomponents.main.MultiComboBox.prototype */ { diff --git a/packages/main/src/RadioButton.js b/packages/main/src/RadioButton.js index 616076a9094c..751436d96d41 100644 --- a/packages/main/src/RadioButton.js +++ b/packages/main/src/RadioButton.js @@ -29,7 +29,6 @@ import radioButtonCss from "./generated/themes/RadioButton.css.js"; */ const metadata = { tag: "ui5-radiobutton", - rtlAware: true, languageAware: true, properties: /** @lends sap.ui.webcomponents.main.RadioButton.prototype */ { diff --git a/packages/main/src/SegmentedButton.js b/packages/main/src/SegmentedButton.js index 67e565539813..7c6b1e5bdd34 100644 --- a/packages/main/src/SegmentedButton.js +++ b/packages/main/src/SegmentedButton.js @@ -19,7 +19,6 @@ import SegmentedButtonCss from "./generated/themes/SegmentedButton.css.js"; */ const metadata = { tag: "ui5-segmentedbutton", - rtlAware: true, languageAware: true, properties: /** @lends sap.ui.webcomponents.main.SegmentedButton.prototype */ {}, managedSlots: true, diff --git a/packages/main/src/Select.js b/packages/main/src/Select.js index b6a03a3d7179..04297ea332fb 100644 --- a/packages/main/src/Select.js +++ b/packages/main/src/Select.js @@ -40,7 +40,6 @@ import ResponsivePopoverCommonCss from "./generated/themes/ResponsivePopoverComm */ const metadata = { tag: "ui5-select", - rtlAware: true, languageAware: true, managedSlots: true, slots: /** @lends sap.ui.webcomponents.main.Select.prototype */ { diff --git a/packages/main/src/Switch.js b/packages/main/src/Switch.js index ca101a5c1dc2..1bd93c9655c9 100644 --- a/packages/main/src/Switch.js +++ b/packages/main/src/Switch.js @@ -24,7 +24,6 @@ import switchCss from "./generated/themes/Switch.css.js"; */ const metadata = { tag: "ui5-switch", - rtlAware: true, languageAware: true, properties: /** @lends sap.ui.webcomponents.main.Switch.prototype */ { diff --git a/packages/main/src/TabContainer.js b/packages/main/src/TabContainer.js index 866ee1416d54..a6aef289006b 100644 --- a/packages/main/src/TabContainer.js +++ b/packages/main/src/TabContainer.js @@ -39,7 +39,6 @@ const staticAreaTabStyles = []; */ const metadata = { tag: "ui5-tabcontainer", - rtlAware: true, languageAware: true, managedSlots: true, slots: /** @lends sap.ui.webcomponents.main.TabContainer.prototype */ { diff --git a/packages/main/src/TimelineItem.js b/packages/main/src/TimelineItem.js index dc33e6afd658..e178d364f8e0 100644 --- a/packages/main/src/TimelineItem.js +++ b/packages/main/src/TimelineItem.js @@ -12,7 +12,6 @@ import styles from "./generated/themes/TimelineItem.css.js"; */ const metadata = { tag: "ui5-timeline-item", - rtlAware: true, slots: /** @lends sap.ui.webcomponents.main.TimelineItem.prototype */ { /** * Determines the description of the ui5-timeline-item. diff --git a/packages/main/src/Toast.js b/packages/main/src/Toast.js index 93613ec83f75..1ebc20ab2859 100644 --- a/packages/main/src/Toast.js +++ b/packages/main/src/Toast.js @@ -16,7 +16,6 @@ const MAX_DURATION = 1000; */ const metadata = { tag: "ui5-toast", - rtlAware: true, properties: /** @lends sap.ui.webcomponents.main.Toast.prototype */ { /** diff --git a/packages/main/src/Token.js b/packages/main/src/Token.js index deaf9d81cf6c..05970a6832d2 100644 --- a/packages/main/src/Token.js +++ b/packages/main/src/Token.js @@ -23,7 +23,6 @@ import styles from "./generated/themes/Token.css.js"; */ const metadata = { tag: "ui5-token", - rtlAware: true, languageAware: true, slots: /** @lends sap.ui.webcomponents.main.Token.prototype */ { /** diff --git a/packages/main/test/pages/RTL.html b/packages/main/test/pages/RTL.html index 181b1e1e6b53..1bc54e96ff57 100644 --- a/packages/main/test/pages/RTL.html +++ b/packages/main/test/pages/RTL.html @@ -2,10 +2,10 @@ - + - Button + RTL and Language @@ -14,39 +14,94 @@ - + - - BODY is rtl - -
- This section does not define dir -
- -
- -
- -
- -
- This section defines dir=ltr -
- -
- -
- -
+ +
+ + EN + DE + BG + ES + HE + AR + +
+ Manually switch RTL: + +
+ +
+ +
+ +
+ This section does not define dir +
+ +
+ +
+ +
+ +
+ This section defines dir=LTR +
+ +
+ +
+ +
+ +
+ This section defines dir=RTL +
+ +
+ +
+ +
+ + +