diff --git a/bigbluebutton-client/resources/prod/locales.xml b/bigbluebutton-client/resources/prod/locales.xml
index c50b23c9bf..2d0de999bf 100755
--- a/bigbluebutton-client/resources/prod/locales.xml
+++ b/bigbluebutton-client/resources/prod/locales.xml
@@ -15,7 +15,7 @@
-
+
diff --git a/bigbluebutton-client/src/BigBlueButton.mxml b/bigbluebutton-client/src/BigBlueButton.mxml
index 7215f09a57..7c52d9b563 100755
--- a/bigbluebutton-client/src/BigBlueButton.mxml
+++ b/bigbluebutton-client/src/BigBlueButton.mxml
@@ -19,9 +19,10 @@ You should have received a copy of the GNU Lesser General Public License along
with BigBlueButton; if not, see .
-->
-.
-
+
diff --git a/bigbluebutton-client/src/org/bigbluebutton/core/BigBlueButtonApplication.as b/bigbluebutton-client/src/org/bigbluebutton/core/BigBlueButtonApplication.as
new file mode 100644
index 0000000000..6f7b1b59ce
--- /dev/null
+++ b/bigbluebutton-client/src/org/bigbluebutton/core/BigBlueButtonApplication.as
@@ -0,0 +1,25 @@
+/**
+ * BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
+ *
+ * Copyright (c) 2018 BigBlueButton Inc. and by respective authors (see below).
+ *
+ * This program is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU Lesser General Public License as published by the Free Software
+ * Foundation; either version 3.0 of the License, or (at your option) any later
+ * version.
+ *
+ * BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License along
+ * with BigBlueButton; if not, see .
+ *
+ */
+package org.bigbluebutton.core {
+ import mx.core.Application;
+
+ [Frame(factoryClass = "org.bigbluebutton.core.managers.SystemManager")]
+ public class BigBlueButtonApplication extends Application {
+ }
+}
diff --git a/bigbluebutton-client/src/org/bigbluebutton/core/managers/ConfigManager2.as b/bigbluebutton-client/src/org/bigbluebutton/core/managers/ConfigManager2.as
index e30c938159..8abe78942e 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/core/managers/ConfigManager2.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/core/managers/ConfigManager2.as
@@ -56,9 +56,8 @@ package org.bigbluebutton.core.managers {
var date:Date = new Date();
var localeReqURL:String = buildRequestURL();
- trace("::loadConfig [{0}]", [localeReqURL]);
- trace(localeReqURL + " session=[" + sessionToken + "]");
+ LOGGER.debug("loadConfig request={0} session=[{1}]", [localeReqURL, sessionToken]);
var request:URLRequest = new URLRequest(localeReqURL);
request.method = URLRequestMethod.GET;
@@ -75,21 +74,19 @@ package org.bigbluebutton.core.managers {
}
private function handleComplete(e:Event):void {
- trace("handleComplete [{0}]", [new XML(e.target.data)]);
+ LOGGER.debug("handleComplete [{0}]", [new XML(e.target.data)]);
var xml:XML = new XML(e.target.data)
var dispatcher:Dispatcher = new Dispatcher();
if (xml.returncode == "FAILED") {
-
- // trace("Getting configXML failed [{0}]", [xml]);
-
+ LOGGER.error("Getting configXML failed [{0}]", [xml]);
dispatcher.dispatchEvent(new MeetingNotFoundEvent(xml.response.logoutURL));
} else {
- // trace("Getting configXML passed [{0}]", [xml]);
+ LOGGER.info("Getting configXML passed [{0}]", [xml]);
_config = new Config(new XML(e.target.data));
- trace("Initializing logging.");
+ LOGGER.debug("Initializing logging.");
LogUtil.initLogging();
dispatcher.dispatchEvent(new ConfigLoadedEvent());
diff --git a/bigbluebutton-client/src/org/bigbluebutton/core/managers/PopUpManagerImpl.as b/bigbluebutton-client/src/org/bigbluebutton/core/managers/PopUpManagerImpl.as
new file mode 100644
index 0000000000..c06ee20ea2
--- /dev/null
+++ b/bigbluebutton-client/src/org/bigbluebutton/core/managers/PopUpManagerImpl.as
@@ -0,0 +1,187 @@
+/**
+ * BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
+ *
+ * Copyright (c) 2018 BigBlueButton Inc. and by respective authors (see below).
+ *
+ * This program is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU Lesser General Public License as published by the Free Software
+ * Foundation; either version 3.0 of the License, or (at your option) any later
+ * version.
+ *
+ * BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License along
+ * with BigBlueButton; if not, see .
+ *
+ */
+package org.bigbluebutton.core.managers {
+ import flash.display.DisplayObject;
+ import flash.geom.Point;
+ import flash.geom.Rectangle;
+
+ import mx.core.FlexVersion;
+ import mx.core.IFlexDisplayObject;
+ import mx.core.IInvalidating;
+ import mx.core.UIComponent;
+ import mx.core.mx_internal;
+ import mx.events.Request;
+ import mx.managers.IPopUpManager;
+ import mx.managers.ISystemManager;
+ import mx.managers.PopUpData;
+ import mx.managers.PopUpManagerImpl;
+
+ use namespace mx_internal;
+
+ public class PopUpManagerImpl extends mx.managers.PopUpManagerImpl {
+
+ /**
+ * @private
+ */
+ private static var instance:IPopUpManager;
+
+ /**
+ * @private
+ */
+ public static function getInstance():IPopUpManager {
+ if (!instance)
+ instance = new org.bigbluebutton.core.managers.PopUpManagerImpl();
+
+ return instance;
+ }
+
+ /**
+ * Centers a popup window over whatever window was used in the call
+ * to the createPopUp()
or addPopUp()
method.
+ *
+ *
Note that the position of the popup window may not
+ * change immediately after this call since Flex may wait to measure and layout the
+ * popup window before centering it.
+ *
+ * @param The IFlexDisplayObject representing the popup.
+ *
+ * @langversion 3.0
+ * @playerversion Flash 9
+ * @playerversion AIR 1.1
+ * @productversion Flex 3
+ */
+ override public function centerPopUp(popUp:IFlexDisplayObject):void {
+ if (popUp is IInvalidating)
+ IInvalidating(popUp).validateNow();
+
+ const o:PopUpData = findPopupInfoByOwner(popUp);
+
+ // If we don't find the pop owner or if the owner's parent is not specified or is not on the
+ // stage, then center based on the popUp's current parent.
+ var popUpParent:DisplayObject = (o && o.parent && o.parent.stage) ? o.parent : popUp.parent;
+ if (popUpParent) {
+ //FLEX-28967 : https://issues.apache.org/jira/browse/FLEX-28967. Fix by miroslav.havrlent
+ var systemManager:ISystemManager;
+ if (o != null) {
+ systemManager = o.systemManager;
+ } else if (popUpParent.hasOwnProperty("systemManager")) {
+ systemManager = popUpParent["systemManager"];
+ } else if (popUpParent is ISystemManager) {
+ systemManager = popUpParent as ISystemManager;
+ }
+
+ if (!systemManager)
+ return; // or throw exception maybe ?
+
+ var x:Number;
+ var y:Number;
+ var appWidth:Number;
+ var appHeight:Number;
+ var parentWidth:Number;
+ var parentHeight:Number;
+ var rect:Rectangle;
+ var clippingOffset:Point = new Point();
+ var pt:Point;
+ var isTopLevelRoot:Boolean;
+ var sbRoot:DisplayObject = systemManager.getSandboxRoot();
+
+ var request:Request;
+ if (hasEventListener("isTopLevelRoot")) {
+ request = new Request("isTopLevelRoot", false, true);
+ }
+ if (request && !dispatchEvent(request))
+ isTopLevelRoot = Boolean(request.value);
+ else
+ isTopLevelRoot = systemManager.isTopLevelRoot();
+
+ if (isTopLevelRoot && (FlexVersion.compatibilityVersion < FlexVersion.VERSION_4_6)) {
+ // The sandbox root is the top level root.
+ // The application width is just the screen width.
+ var screen:Rectangle = systemManager.screen;
+ appWidth = screen.width;
+ appHeight = screen.height;
+ } else {
+ rect = systemManager.getVisibleApplicationRect();
+ rect.topLeft = DisplayObject(systemManager).globalToLocal(rect.topLeft);
+ rect.bottomRight = DisplayObject(systemManager).globalToLocal(rect.bottomRight);
+
+ // Offset the top, left of the window to bring it into view.
+ clippingOffset = rect.topLeft.clone();
+ appWidth = rect.width;
+ appHeight = rect.height;
+ }
+
+ // If parent is a UIComponent, check for clipping between
+ // the object and its SystemManager
+ if (popUpParent is UIComponent) {
+ rect = UIComponent(popUpParent).getVisibleRect();
+ if (UIComponent(popUpParent).systemManager != sbRoot)
+ rect = UIComponent(popUpParent).systemManager.getVisibleApplicationRect(rect);
+ var offset:Point = popUpParent.globalToLocal(rect.topLeft);
+ clippingOffset.x += offset.x;
+ clippingOffset.y += offset.y;
+ parentWidth = rect.width;
+ parentHeight = rect.height;
+ } else {
+ parentWidth = popUpParent.width;
+ parentHeight = popUpParent.height;
+ }
+
+ // The appWidth may smaller than parentWidth if the application is
+ // clipped by the parent application.
+ x = Math.max(0, (Math.min(appWidth, parentWidth) - popUp.width) / 2);
+ y = Math.max(0, (Math.min(appHeight, parentHeight) - popUp.height) / 2);
+
+ // If the layout has been mirrored, then 0,0 is the uppper
+ // right corner; compensate here.
+ // Code removed below, centring a popup does not need RTL layou check
+
+ pt = new Point(clippingOffset.x, clippingOffset.y);
+ pt = popUpParent.localToGlobal(pt);
+ pt = popUp.parent.globalToLocal(pt);
+ popUp.move(Math.round(x) + pt.x, Math.round(y) + pt.y);
+ }
+ }
+
+ /**
+ * @private
+ * Returns the index position of the PopUpData in the popupInfo array (or -1)
+ * for a given popupInfo.owner
+ */
+ private function findPopupInfoIndexByOwner(owner:Object):int {
+ const n:int = popupInfo.length;
+ for (var i:int = 0; i < n; i++) {
+ var o:PopUpData = popupInfo[i];
+ if (o.owner == owner)
+ return i;
+ }
+ return -1;
+ }
+
+ /**
+ * @private
+ * Returns the PopUpData (or null) for a given popupInfo.owner
+ */
+ private function findPopupInfoByOwner(owner:Object):PopUpData {
+ var index:int = findPopupInfoIndexByOwner(owner);
+ return index > -1 ? popupInfo[index] : null;
+ }
+
+ }
+}
diff --git a/bigbluebutton-client/src/org/bigbluebutton/core/managers/SystemManager.as b/bigbluebutton-client/src/org/bigbluebutton/core/managers/SystemManager.as
new file mode 100644
index 0000000000..7dc70248fc
--- /dev/null
+++ b/bigbluebutton-client/src/org/bigbluebutton/core/managers/SystemManager.as
@@ -0,0 +1,34 @@
+/**
+ * BigBlueButton open source conferencing system - http://www.bigbluebutton.org/
+ *
+ * Copyright (c) 2018 BigBlueButton Inc. and by respective authors (see below).
+ *
+ * This program is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU Lesser General Public License as published by the Free Software
+ * Foundation; either version 3.0 of the License, or (at your option) any later
+ * version.
+ *
+ * BigBlueButton is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License along
+ * with BigBlueButton; if not, see .
+ *
+ */
+package org.bigbluebutton.core.managers {
+ import mx.core.Singleton;
+ import mx.core.mx_internal;
+ import mx.managers.SystemManager;
+
+ use namespace mx_internal;
+
+ public class SystemManager extends mx.managers.SystemManager {
+ override mx_internal function kickOff():void {
+ if (document)
+ return;
+ Singleton.registerClass("mx.managers::IPopUpManager", PopUpManagerImpl);
+ super.kickOff();
+ }
+ }
+}
diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/LanguageSelector.mxml b/bigbluebutton-client/src/org/bigbluebutton/main/views/LanguageSelector.mxml
index dee7d02fc8..796f1ae28f 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/main/views/LanguageSelector.mxml
+++ b/bigbluebutton-client/src/org/bigbluebutton/main/views/LanguageSelector.mxml
@@ -42,7 +42,7 @@ with BigBlueButton; if not, see .
}
private function changeLanguage():void {
- ResourceUtil.getInstance().setPreferredLocale(selectedItem);
+ ResourceUtil.getInstance().setPreferredLocale(selectedItem.code);
}
]]>
diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/MainApplicationShell.mxml b/bigbluebutton-client/src/org/bigbluebutton/main/views/MainApplicationShell.mxml
index e711def617..e5183a99e1 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/main/views/MainApplicationShell.mxml
+++ b/bigbluebutton-client/src/org/bigbluebutton/main/views/MainApplicationShell.mxml
@@ -109,6 +109,8 @@ with BigBlueButton; if not, see .
import mx.core.UIComponent;
import mx.events.FlexEvent;
+ import flashx.textLayout.formats.Direction;
+
import flexlib.mdi.effects.effectsLib.MDIVistaEffects;
import org.as3commons.lang.StringUtils;
@@ -164,6 +166,10 @@ with BigBlueButton; if not, see .
import org.bigbluebutton.util.browser.BrowserCheck;
import org.bigbluebutton.util.i18n.ResourceUtil;
+
+
+
+
private static const LOGGER:ILogger = getClassLogger(MainApplicationShell);
private var globalDispatcher:Dispatcher;
@@ -225,6 +231,9 @@ with BigBlueButton; if not, see .
}
public function initOptions(e:Event):void {
+ // Set the layout direction at the application start
+ ResourceUtil.getInstance().updateLayoutDirection();
+
brandingOptions = Options.getOptions(BrandingOptions) as BrandingOptions;
layoutOptions = Options.getOptions(LayoutOptions) as LayoutOptions;
usersOptions = Options.getOptions(UsersOptions) as UsersOptions;
@@ -414,7 +423,11 @@ with BigBlueButton; if not, see .
guestWindow = PopUpUtil.createModalPopUp( FlexGlobals.topLevelApplication as DisplayObject, GuestWindow, false) as GuestWindow;
PopUpUtil.lockPosition(guestWindow, function():Point {
- return new Point(systemManager.screen.width - guestWindow.width - 20, 20);
+ if (ResourceUtil.getInstance().isRTLEnabled() && ResourceUtil.getInstance().getCurrentLanguageDirection() == Direction.RTL) {
+ return new Point(20, 20);
+ } else {
+ return new Point(systemManager.screen.width - guestWindow.width - 20, 20);
+ }
});
guestWindow.addEventListener(Event.CLOSE, closeGuestWindow);
@@ -856,7 +869,11 @@ with BigBlueButton; if not, see .
var popUp:RecordWindow = PopUpUtil.createModalPopUp(FlexGlobals.topLevelApplication as DisplayObject, RecordWindow, false) as RecordWindow;
popUp.setRecordingFlag(e.payload.recording);
PopUpUtil.lockPosition(popUp, function():Point {
- return new Point(parentApplication.width - 150 - popUp.width, y + toolbar.height);
+ if (ResourceUtil.getInstance().isRTLEnabled() && ResourceUtil.getInstance().getCurrentLanguageDirection() == Direction.RTL) {
+ return new Point(150, y + toolbar.height);
+ } else {
+ return new Point(parentApplication.width - popUp.width - 150, y + toolbar.height);
+ }
});
}
@@ -877,9 +894,6 @@ with BigBlueButton; if not, see .
}
private function onLocaleChanged(e:LocaleChangeEvent) : void {
- if (ResourceUtil.getInstance().isRTLEnabled()) {
- FlexGlobals.topLevelApplication.setStyle("layoutDirection", ResourceUtil.getInstance().getCurrentLanguageDirection());
- }
PopUpUtil.initAlert();
}
diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/MainToolbar.mxml b/bigbluebutton-client/src/org/bigbluebutton/main/views/MainToolbar.mxml
index edf9dbac14..af3fca2732 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/main/views/MainToolbar.mxml
+++ b/bigbluebutton-client/src/org/bigbluebutton/main/views/MainToolbar.mxml
@@ -345,7 +345,11 @@ with BigBlueButton; if not, see .
// Needs to be improved in case of RTL layout
PopUpUtil.lockPosition(logoutWindow, function():Point {
- return new Point(width - logoutWindow.width - 5, btnLogout.y + btnLogout.height + 5)
+ if (ResourceUtil.getInstance().isRTLEnabled() && ResourceUtil.getInstance().getCurrentLanguageDirection() == Direction.RTL) {
+ return new Point(5, btnLogout.y + btnLogout.height + 5)
+ } else {
+ return new Point(width - logoutWindow.width - 5, btnLogout.y + btnLogout.height + 5)
+ }
});
} else {
doLogout();
@@ -439,6 +443,8 @@ with BigBlueButton; if not, see .
if (!StringUtils.isEmpty(brandingOptions.toolbarColor)) {
mainBox.setStyle("backgroundColor", uint("0x" + brandingOptions.toolbarColor.substr(1)));
}
+
+ updateStyle();
}
private function onDisconnectTest():void{
@@ -456,15 +462,18 @@ with BigBlueButton; if not, see .
}
private function localeChanged(event:LocaleChangeEvent) : void {
+ updateStyle();
+ initBreakoutRibbon();
+ updateMeetingNameLabel();
+ }
+
+ private function updateStyle():void {
var styleNameExt : String = "";
if (ResourceUtil.getInstance().isRTLEnabled() && ResourceUtil.getInstance().getCurrentLanguageDirection() == Direction.RTL) {
styleNameExt = "RTL";
}
btnLogout.styleName = "logoutButtonStyle" + styleNameExt;
-
- initBreakoutRibbon();
- updateMeetingNameLabel();
}
private function openSettings(e:Event = null):void{
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/ChatBox.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/ChatBox.mxml
index e386e2ae39..c87dfbe49a 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/ChatBox.mxml
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/ChatBox.mxml
@@ -52,11 +52,11 @@ with BigBlueButton; if not, see .
import flash.events.TextEvent;
- import flashx.textLayout.formats.Direction;
-
import mx.binding.utils.BindingUtils;
import mx.events.ScrollEvent;
+ import flashx.textLayout.formats.Direction;
+
import org.as3commons.lang.StringUtils;
import org.as3commons.logging.api.ILogger;
import org.as3commons.logging.api.getClassLogger;
@@ -80,7 +80,6 @@ with BigBlueButton; if not, see .
import org.bigbluebutton.modules.chat.events.SendPrivateChatMessageEvent;
import org.bigbluebutton.modules.chat.events.SendPublicChatMessageEvent;
import org.bigbluebutton.modules.chat.model.ChatConversation;
- import org.bigbluebutton.modules.chat.model.ChatMessage;
import org.bigbluebutton.modules.chat.model.ChatOptions;
import org.bigbluebutton.modules.chat.vo.ChatMessageVO;
import org.bigbluebutton.modules.polling.events.StartCustomPollEvent;
@@ -167,6 +166,8 @@ with BigBlueButton; if not, see .
// chatToolbar.registerListeners(chatMessagesList);
chatMessagesList.addEventListener(ChatEvent.RESIZE_CHAT_TOOLBAR, adjustToolbarWidthAccordingToScrollBar);
+
+ updateStyles();
}
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/layout/views/BroadcastButton.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/layout/views/BroadcastButton.mxml
index fb6d005a48..db453bb3b8 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/layout/views/BroadcastButton.mxml
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/layout/views/BroadcastButton.mxml
@@ -46,6 +46,7 @@ with BigBlueButton; if not, see .
private function init():void {
refreshRole(UsersUtil.amIModerator());
+ updateStyles();
}
private function onClick(e:Event):void {
@@ -57,6 +58,10 @@ with BigBlueButton; if not, see .
}
private function localeChanged(event:LocaleChangeEvent) : void {
+ updateStyles();
+ }
+
+ private function updateStyles():void {
var styleNameExt : String = "";
if (ResourceUtil.getInstance().isRTLEnabled() && ResourceUtil.getInstance().getCurrentLanguageDirection() == Direction.RTL) {
styleNameExt = "RTL";
diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/sharednotes/views/SharedNotesWindow.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/sharednotes/views/SharedNotesWindow.mxml
index bbe0e712f9..6c2b4392fd 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/modules/sharednotes/views/SharedNotesWindow.mxml
+++ b/bigbluebutton-client/src/org/bigbluebutton/modules/sharednotes/views/SharedNotesWindow.mxml
@@ -147,6 +147,8 @@
typistsTimer.addEventListener(TimerEvent.TIMER, updateTypists);
typistsTimer.start();
+
+ updateStyles();
}
private function updateTypists(e:Event):void {
@@ -578,6 +580,10 @@
}
private function onLocaleChanged(event:LocaleChangeEvent):void {
+ updateStyles();
+ }
+
+ private function updateStyles():void {
var styleNameExt : String = "";
if (ResourceUtil.getInstance().isRTLEnabled() && ResourceUtil.getInstance().getCurrentLanguageDirection() == Direction.RTL) {
styleNameExt = "RTL";
diff --git a/bigbluebutton-client/src/org/bigbluebutton/util/i18n/ResourceUtil.as b/bigbluebutton-client/src/org/bigbluebutton/util/i18n/ResourceUtil.as
index 2f7a84f010..f38e843eeb 100755
--- a/bigbluebutton-client/src/org/bigbluebutton/util/i18n/ResourceUtil.as
+++ b/bigbluebutton-client/src/org/bigbluebutton/util/i18n/ResourceUtil.as
@@ -102,11 +102,11 @@ package org.bigbluebutton.util.i18n
preferredLocale = getDefaultLocale();
if (preferredLocale != MASTER_LOCALE) {
- trace("Preferred locale=" + preferredLocale + " is not the same as master locale=" + MASTER_LOCALE);
+ LOGGER.debug("Preferred locale={0} is not the same as master locale={1}", [preferredLocale, MASTER_LOCALE]);
loadMasterLocale(MASTER_LOCALE);
}
- // To improve
- setPreferredLocale({code:preferredLocale, direction:"ltr"});
+
+ setPreferredLocale(preferredLocale);
}
private function parse(xml:XML):void{
@@ -134,12 +134,25 @@ package org.bigbluebutton.util.i18n
return ExternalInterface.call("getLanguage");
}
- private function isPreferredLocaleAvailable(prefLocale:String):Boolean {
- for each(var item:* in locales) {
+ private function findPreferredLocale(prefLocale:String) : * {
+ var item:* = null;
+ // Lookginf for locale in format 'en_US'
+ for each(item in locales) {
if (prefLocale == item.code)
- return true;
+ return item;
}
- return false;
+ // If not found we look for form 'en'
+ var mainLocale : String = prefLocale.substr(0,2);
+ for each(item in locales) {
+ if (mainLocale == item.code)
+ return item;
+ }
+ // If not found we look for the first item that contains 'en'
+ for each(item in locales) {
+ if (StringUtils.startsWith(item.code, mainLocale))
+ return item;
+ }
+ return null;
}
private function getIndexForLocale(prefLocale:String):int {
@@ -150,19 +163,21 @@ package org.bigbluebutton.util.i18n
return -1;
}
- public function setPreferredLocale(locale:Object):void {
- var localeCode : String = locale.code;
+ public function setPreferredLocale(locale:String):void {
+ var localeCode : String = locale;
if (localeCode == DEFAULT_LOCALE_IDENTIFIER) {
localeCode = getDefaultLocale();
}
- if (isPreferredLocaleAvailable(localeCode)) {
- preferredLocale = localeCode;
- }else{
+ var foundLocale : Object = findPreferredLocale(localeCode);
+ if (foundLocale) {
+ preferredLocale = foundLocale.code;
+ preferredDirection = foundLocale.direction;
+ } else {
preferredLocale = MASTER_LOCALE;
+ preferredDirection = "ltr";
}
-
- preferredDirection = locale.direction;
+
changeLocale(preferredLocale);
}
@@ -184,7 +199,7 @@ package org.bigbluebutton.util.i18n
}
private function loadMasterLocale(locale:String):void {
- trace("Loading master locale=" + locale);
+ LOGGER.debug("Loading master locale={0}", [locale]);
/**
* http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/resources/IResourceManager.html#localeChain
* Always load the default language, so if the chosen language
@@ -195,10 +210,10 @@ package org.bigbluebutton.util.i18n
}
private function onMasterLocaleLoaded(event:ResourceEvent):void {
- trace("Master locale is loaded");
+ LOGGER.debug("Master locale is loaded");
masterLocaleLoaded = true;
if (masterLocaleLoadedCallback != null) {
- trace("Calling callback to load a second language");
+ LOGGER.debug("Calling callback to load a second language");
masterLocaleLoadedCallback();
}
}
@@ -208,7 +223,7 @@ package org.bigbluebutton.util.i18n
var date:Date = new Date();
var localeURI:String = buildRequestURL() + 'client/locale/' + language + '_resources.swf?a=' + date.time;
- trace("Loading locale " + localeURI);
+ LOGGER.debug("Loading locale {0}", [localeURI]);
return resourceManager.loadResourceModule( localeURI, false);
}
@@ -227,10 +242,10 @@ package org.bigbluebutton.util.i18n
public function changeLocale(locale:String):void {
if (masterLocaleLoaded || locale == MASTER_LOCALE) {
- trace("Loading immediately " + locale);
+ LOGGER.debug("Loading immediately {0}", [locale]);
changeLocaleHelper(locale);
} else {
- trace("Registering callback to load " + locale + " later");
+ LOGGER.debug("Registering callback to load {0} later", [locale]);
masterLocaleLoadedCallback = function():void {
changeLocaleHelper(locale);
}
@@ -246,7 +261,7 @@ package org.bigbluebutton.util.i18n
var logData:Object = UsersUtil.initLogData();
logData.tags = ["locale"];
logData.message = "Failed to load locale = " + preferredLocale;
- trace(JSON.stringify(logData));
+ LOGGER.debug(JSON.stringify(logData));
}
masterLocaleLoaded = true;
resourceManager.localeChain = [MASTER_LOCALE];
@@ -257,7 +272,7 @@ package org.bigbluebutton.util.i18n
}
private function sendAppAndLocaleVersions():void {
- trace("Sending locale version");
+ LOGGER.debug("Sending locale version");
var dispatcher:Dispatcher = new Dispatcher();
var versionEvent:AppVersionEvent = new AppVersionEvent();
versionEvent.configLocaleVersion = false;
@@ -269,7 +284,7 @@ package org.bigbluebutton.util.i18n
* @param event
*/
private function handleResourceNotLoaded(event:ResourceEvent):void {
- trace("Resource locale [" + preferredLocale + "] could not be loaded.");
+ LOGGER.debug("Resource locale {0} could not be loaded.", [preferredLocale]);
resourceManager.localeChain = [MASTER_LOCALE];
preferredLocale = MASTER_LOCALE;
update();
@@ -278,11 +293,18 @@ package org.bigbluebutton.util.i18n
public function update():void{
reloadLocaleNames();
sendAppAndLocaleVersions();
+ updateLayoutDirection();
var dispatcher:Dispatcher = new Dispatcher;
dispatcher.dispatchEvent(new LocaleChangeEvent(LocaleChangeEvent.LOCALE_CHANGED));
dispatchEvent(new Event(Event.CHANGE));
}
+ public function updateLayoutDirection():void {
+ if (isRTLEnabled()) {
+ FlexGlobals.topLevelApplication.setStyle("layoutDirection", preferredDirection);
+ }
+ }
+
[Bindable("change")]
public function getString(resourceName:String, parameters:Array = null, locale:String = null):String{
/**