diff --git a/bbb-api-demo/src/main/webapp/demo_mozilla_persona.jsp b/bbb-api-demo/src/main/webapp/demo_mozilla_persona.jsp index 70bdf36d10..61960a96dd 100755 --- a/bbb-api-demo/src/main/webapp/demo_mozilla_persona.jsp +++ b/bbb-api-demo/src/main/webapp/demo_mozilla_persona.jsp @@ -31,7 +31,7 @@ Author: Marcos Calderon Join Demo Meeting using Mozilla Persona - + @@ -109,7 +109,7 @@ function loggedIn(res){ String data = URLEncoder.encode("assertion", "UTF-8") + "=" + URLEncoder.encode(request.getParameter("assertion"), "UTF-8"); data += "&" + URLEncoder.encode("audience", "UTF-8") + "=" + URLEncoder.encode(BigBlueButtonURL.replace("/bigbluebutton/",""),"UTF-8"); - URL urlBrowserID = new URL("https://browserid.org/verify"); + URL urlBrowserID = new URL("https://verifier.login.persona.org/verify"); URLConnection conn = urlBrowserID.openConnection(); diff --git a/bbb-lti/grails-app/controllers/ToolController.groovy b/bbb-lti/grails-app/controllers/ToolController.groovy index 08e96afa91..e3ade24275 100644 --- a/bbb-lti/grails-app/controllers/ToolController.groovy +++ b/bbb-lti/grails-app/controllers/ToolController.groovy @@ -357,7 +357,7 @@ class ToolController { ' http://www.imsglobal.org/xsd/imsbasiclti_v1p0 http://www.imsglobal.org/xsd/lti/ltiv1p0/imsbasiclti_v1p0.xsd' + ' http://www.imsglobal.org/xsd/imslticm_v1p0 http://www.imsglobal.org/xsd/lti/ltiv1p0/imslticm_v1p0.xsd' + ' http://www.imsglobal.org/xsd/imslticp_v1p0 http://www.imsglobal.org/xsd/lti/ltiv1p0/imslticp_v1p0.xsd">' + - ' ePortfolio' + + ' BigBlueButton' + ' Single Sign On into BigBlueButton' + ' ' + ltiService.retrieveBasicLtiEndpoint() + '' + ' ' + ltiService.retrieveIconEndpoint() + '' + diff --git a/bigbluebutton-apps/src/main/java/org/bigbluebutton/conference/BigBlueButtonApplication.java b/bigbluebutton-apps/src/main/java/org/bigbluebutton/conference/BigBlueButtonApplication.java index 4c50fad439..f2e891ac5a 100755 --- a/bigbluebutton-apps/src/main/java/org/bigbluebutton/conference/BigBlueButtonApplication.java +++ b/bigbluebutton-apps/src/main/java/org/bigbluebutton/conference/BigBlueButtonApplication.java @@ -18,10 +18,12 @@ */ package org.bigbluebutton.conference; +import java.util.HashMap; import java.util.Iterator; +import java.util.Map; import java.util.Set; import org.red5.server.api.Red5; -import org.bigbluebutton.conference.meeting.messaging.red5.ConnectionInvokerService; +import org.bigbluebutton.conference.meeting.messaging.red5.ConnectionInvokerService; import org.bigbluebutton.conference.service.lock.LockSettings; import org.bigbluebutton.conference.service.participants.ParticipantsApplication; import org.bigbluebutton.conference.service.recorder.RecorderApplication; import org.bigbluebutton.core.api.IBigBlueButtonInGW; @@ -138,21 +140,43 @@ public class BigBlueButtonApplication extends MultiThreadedApplicationAdapter { String externalUserID = ((String) params[5]).toString(); String internalUserID = ((String) params[6]).toString(); + + Boolean locked = false; + if(params.length >= 7 && ((Boolean) params[7])) { + locked = true; + } + + Boolean muted = false; + if(params.length >= 8 && ((Boolean) params[8])) { + muted = true; + } + + Map lsMap = null; + if(params.length >= 9) { + try{ + lsMap = (Map ) params[9]; + }catch(Exception e){ + lsMap = new HashMap(); + } + } + + if (record == true) { recorderApplication.createRecordSession(room); } BigBlueButtonSession bbbSession = new BigBlueButtonSession(room, internalUserID, username, role, - voiceBridge, record, externalUserID); + voiceBridge, record, externalUserID, muted); connection.setAttribute(Constants.SESSION, bbbSession); connection.setAttribute("INTERNAL_USER_ID", internalUserID); String debugInfo = "internalUserID=" + internalUserID + ",username=" + username + ",role=" + role + "," + ",voiceConf=" + voiceBridge + ",room=" + room + ",externalUserid=" + externalUserID; log.debug("User [{}] connected to room [{}]", debugInfo, room); - -// bbbGW.createMeeting2(room, record, voiceBridge); + + participantsApplication.createRoom(room, locked, new LockSettings(lsMap)); + connInvokerService.addConnection(bbbSession.getInternalUserID(), connection); diff --git a/bigbluebutton-apps/src/main/java/org/bigbluebutton/conference/BigBlueButtonSession.java b/bigbluebutton-apps/src/main/java/org/bigbluebutton/conference/BigBlueButtonSession.java index e1b7140a15..48b33d17de 100755 --- a/bigbluebutton-apps/src/main/java/org/bigbluebutton/conference/BigBlueButtonSession.java +++ b/bigbluebutton-apps/src/main/java/org/bigbluebutton/conference/BigBlueButtonSession.java @@ -27,10 +27,11 @@ public class BigBlueButtonSession { private final String voiceBridge; private final Boolean record; private final String externalUserID; + private final Boolean startAsMuted; public BigBlueButtonSession(String room, String internalUserID, String username, String role, String voiceBridge, Boolean record, - String externalUserID){ + String externalUserID, Boolean startAsMuted){ this.internalUserID = internalUserID; this.username = username; this.role = role; @@ -38,6 +39,7 @@ public class BigBlueButtonSession { this.voiceBridge = voiceBridge; this.record = record; this.externalUserID = externalUserID; + this.startAsMuted = startAsMuted; } public String getUsername() { @@ -67,4 +69,8 @@ public class BigBlueButtonSession { public String getExternUserID() { return externalUserID; } + + public Boolean getStartAsMuted() { + return startAsMuted; + } } diff --git a/bigbluebutton-apps/src/main/java/org/bigbluebutton/conference/IRoomListener.java b/bigbluebutton-apps/src/main/java/org/bigbluebutton/conference/IRoomListener.java index 005c444ece..823daa4d95 100755 --- a/bigbluebutton-apps/src/main/java/org/bigbluebutton/conference/IRoomListener.java +++ b/bigbluebutton-apps/src/main/java/org/bigbluebutton/conference/IRoomListener.java @@ -20,12 +20,16 @@ package org.bigbluebutton.conference; import java.util.ArrayList; +import java.util.Map; public interface IRoomListener { public String getName(); + + public void lockSettingsChange(Map lockSettings); public void participantStatusChange(User p, String status, Object value); public void participantJoined(User participant); public void participantLeft(User participant); public void assignPresenter(ArrayList presenter); public void endAndKickAll(); + public void recordingStatusChange(User p, Boolean recording); } \ No newline at end of file diff --git a/bigbluebutton-apps/src/main/java/org/bigbluebutton/conference/RoomListener.java b/bigbluebutton-apps/src/main/java/org/bigbluebutton/conference/RoomListener.java index 2eb3338ba2..00138c74fe 100755 --- a/bigbluebutton-apps/src/main/java/org/bigbluebutton/conference/RoomListener.java +++ b/bigbluebutton-apps/src/main/java/org/bigbluebutton/conference/RoomListener.java @@ -21,6 +21,8 @@ package org.bigbluebutton.conference; import java.util.ArrayList; import java.util.List; +import java.util.Map; + import org.red5.server.api.so.ISharedObject; public class RoomListener implements IRoomListener{ @@ -64,5 +66,20 @@ public class RoomListener implements IRoomListener{ public void endAndKickAll() { // no-op + } + + @Override + public void lockSettingsChange(Map lockSettings) { + List list = new ArrayList(); + list.add(lockSettings); + so.sendMessage("lockSettingsChange", list); } + + @SuppressWarnings("unchecked") + public void recordingStatusChange(User p, Boolean recording){ + List list = new ArrayList(); + list.add(p.getInternalUserID()); + list.add(recording); + so.sendMessage("recordingStatusChange", list); + } } diff --git a/bigbluebutton-apps/src/main/java/org/bigbluebutton/conference/User.java b/bigbluebutton-apps/src/main/java/org/bigbluebutton/conference/User.java index 2a17a00ba4..c011c4f297 100755 --- a/bigbluebutton-apps/src/main/java/org/bigbluebutton/conference/User.java +++ b/bigbluebutton-apps/src/main/java/org/bigbluebutton/conference/User.java @@ -39,13 +39,14 @@ public class User implements Serializable { private final Map status; private Map unmodifiableStatus; - public User(String internalUserID, String name, String role, String externalUserID, Map status) { + public User(String internalUserID, String name, String role, String externalUserID, Map status, Boolean locked) { this.internalUserID = internalUserID; this.name = name; this.role = role; this.externalUserID = externalUserID; this.status = new ConcurrentHashMap(status); unmodifiableStatus = Collections.unmodifiableMap(status); + setStatus("locked", locked); } public boolean isModerator() { @@ -116,4 +117,8 @@ public class User implements Serializable { m.put("status", new HashMap(unmodifiableStatus)); return m; } + + public Boolean isLocked() { + return ((Boolean) getStatus().get("locked") ); + } } \ No newline at end of file diff --git a/bigbluebutton-apps/src/main/java/org/bigbluebutton/conference/service/lock/LockService.java b/bigbluebutton-apps/src/main/java/org/bigbluebutton/conference/service/lock/LockService.java new file mode 100755 index 0000000000..e066ecb9ae --- /dev/null +++ b/bigbluebutton-apps/src/main/java/org/bigbluebutton/conference/service/lock/LockService.java @@ -0,0 +1,153 @@ +/** +* BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ +* +* Copyright (c) 2012 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.conference.service.lock; + +import java.util.ArrayList; +import java.util.Map; +import org.bigbluebutton.conference.BigBlueButtonSession; +import org.bigbluebutton.conference.Constants; +import org.bigbluebutton.conference.service.participants.ParticipantsApplication; +import org.red5.logging.Red5LoggerFactory; +import org.red5.server.api.Red5; +import org.slf4j.Logger; + +public class LockService { + private static Logger log = Red5LoggerFactory.getLogger( LockService.class, "bigbluebutton" ); + + private ParticipantsApplication application; + private final static Boolean lockModerators = true; + + /** + * Internal function used to get the session + * */ + private BigBlueButtonSession getBbbSession() { + return (BigBlueButtonSession) Red5.getConnectionLocal().getAttribute(Constants.SESSION); + } + + /** + * Internal function used to set participants application (from xml) + * */ + public void setParticipantsApplication(ParticipantsApplication a) { + log.debug("Setting Participants Applications"); + application = a; + } + + /** + * Called from client to get lock settings for this room. + * */ + public Map getLockSettings(){ + String roomID = getBbbSession().getRoom(); +// RoomsManager rm = application.getRoomsManager(); +// Room room = rm.getRoom(roomID); + +// return room.getLockSettings().toMap(); + + return null; + } + + /** + * Called from client to get lock settings for this room. + * + * If room don't have any lock settings, it applies the defaultSettings + * sent from client (came from config.xml). + * + * Returns the new lock settings for the room. + * */ + public void setLockSettings(Map newSettings){ +// String roomID = getBbbSession().getRoom(); +// RoomsManager rm = application.getRoomsManager(); +// Room room = rm.getRoom(roomID); + +// room.setLockSettings(new LockSettings(newSettings)); + //Send notification to clients + + } + + /** + * Method called from client on connect to know if the room is locked or not + * */ + public boolean isRoomLocked(){ +// String roomID = getBbbSession().getRoom(); +// RoomsManager rm = application.getRoomsManager(); +// Room room = rm.getRoom(roomID); + +// return room.isLocked(); + + return false; + } + + /** + * This method locks (or unlocks), based on lock parameter + * all users but the users listed in array dontLockTheseUsers + * */ + public void setAllUsersLock(Boolean lock, ArrayList dontLockTheseUsers){ + log.debug("setAllUsersLock ({}, {})", new Object[] { lock, dontLockTheseUsers }); + /* + String roomID = getBbbSession().getRoom(); + RoomsManager rm = application.getRoomsManager(); + Room room = rm.getRoom(roomID); + room.setLocked(lock); + + Map roomUserMap = application.getParticipants(roomID); + Collection allUsers = roomUserMap.values(); + + for(User user : allUsers) { + if(lock && user.isModerator() && !room.getLockSettings().getAllowModeratorLocking()){ + log.debug("setAllUsersLock::Will not set lock for user " + user.getInternalUserID()+" because it's a moderator and allowModeratorLocking is false"); + continue; + } + + //Don't lock users listed in dontLockTheseUsers array + if(lock && dontLockTheseUsers.contains(user.getInternalUserID())){ + log.debug("setAllUsersLock::Will not lock user " + user.getInternalUserID()); + continue; + } + + log.debug("setAllUsersLock::Will lock user " + user.getInternalUserID()); + application.setParticipantStatus(roomID, user.getInternalUserID(), "locked", lock); + } + + */ + } + + /** + * This method locks or unlocks a specific user + * */ + public void setUserLock(Boolean lock, String internalUserID){ + log.debug("setUserLock ({}, {}, {})", new Object[] { lock, internalUserID }); + /* + String roomID = getBbbSession().getRoom(); + Map roomUserMap = application.getParticipants(roomID); + + User user = null; + + if((user = roomUserMap.get(internalUserID)) != null) { + RoomsManager rm = application.getRoomsManager(); + Room room = rm.getRoom(roomID); + + if(lock && user.isModerator() && !room.getLockSettings().getAllowModeratorLocking()){ + log.debug("setUserLock::Will not set lock for user " + user.getInternalUserID()+" because it's a moderator and allowModeratorLocking is false"); + return; + } + + application.setParticipantStatus(roomID, user.getInternalUserID(), "locked", lock); + } + */ + } +} diff --git a/bigbluebutton-apps/src/main/java/org/bigbluebutton/conference/service/lock/LockSettings.java b/bigbluebutton-apps/src/main/java/org/bigbluebutton/conference/service/lock/LockSettings.java new file mode 100644 index 0000000000..799089d826 --- /dev/null +++ b/bigbluebutton-apps/src/main/java/org/bigbluebutton/conference/service/lock/LockSettings.java @@ -0,0 +1,114 @@ +/** +* BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ +* +* Copyright (c) 2012 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.conference.service.lock; + +import java.util.HashMap; +import java.util.Map; + +public class LockSettings { + private Boolean allowModeratorLocking; + private Boolean disableCam; + private Boolean disableMic; + private Boolean disablePrivateChat; + private Boolean disablePublicChat; + + /** + * Read a map object received from client + * */ + public LockSettings(Map lsMap) { + if(lsMap.containsKey("allowModeratorLocking")) + allowModeratorLocking = lsMap.get("allowModeratorLocking"); + else + allowModeratorLocking = true; + + if(lsMap.containsKey("disableCam")) + disableCam = lsMap.get("disableCam"); + else + disableCam = true; + + if(lsMap.containsKey("disableMic")) + disableMic = lsMap.get("disableMic"); + else + disableMic = true; + + if(lsMap.containsKey("disablePrivateChat")) + disablePrivateChat = lsMap.get("disablePrivateChat"); + else + disablePrivateChat = true; + + if(lsMap.containsKey("disablePublicChat")) + disablePublicChat = lsMap.get("disablePublicChat"); + else + disablePublicChat = true; + } + + /** + * Create a map object to be sent to client + * */ + public Map toMap() { + HashMap lsMap = new HashMap(); + lsMap.put("allowModeratorLocking", allowModeratorLocking); + lsMap.put("disableCam", disableCam); + lsMap.put("disableMic", disableMic); + lsMap.put("disablePrivateChat", disablePrivateChat); + lsMap.put("disablePublicChat", disablePublicChat); + + return lsMap; + } + + public Boolean getDisableMic() { + return disableMic; + } + + public void setDisableMic(Boolean disableMic) { + this.disableMic = disableMic; + } + + public Boolean getDisableCam() { + return disableCam; + } + + public void setDisableCam(Boolean disableCam) { + this.disableCam = disableCam; + } + + public Boolean getDisablePublicChat() { + return disablePublicChat; + } + + public void setDisablePublicChat(Boolean disablePublicChat) { + this.disablePublicChat = disablePublicChat; + } + + public Boolean getDisablePrivateChat() { + return disablePrivateChat; + } + + public void setDisablePrivateChat(Boolean disablePrivateChat) { + this.disablePrivateChat = disablePrivateChat; + } + + public Boolean getAllowModeratorLocking() { + return allowModeratorLocking; + } + + public void setAllowModeratorLocking(Boolean allowModeratorLocking) { + this.allowModeratorLocking = allowModeratorLocking; + } +} diff --git a/bigbluebutton-apps/src/main/java/org/bigbluebutton/conference/service/messaging/MessagingConstants.java b/bigbluebutton-apps/src/main/java/org/bigbluebutton/conference/service/messaging/MessagingConstants.java index 6ddacc3683..da62044c7a 100755 --- a/bigbluebutton-apps/src/main/java/org/bigbluebutton/conference/service/messaging/MessagingConstants.java +++ b/bigbluebutton-apps/src/main/java/org/bigbluebutton/conference/service/messaging/MessagingConstants.java @@ -38,7 +38,7 @@ public class MessagingConstants { public static final String MEETING_ENDED_EVENT = "MeetingEndedEvent"; public static final String USER_JOINED_EVENT = "UserJoinedEvent"; public static final String USER_LEFT_EVENT = "UserLeftEvent"; - public static final String USER_STATUS_CHANGE_EVENT = "UserStatusChangeEvent"; - - public static final String SEND_POLLS_EVENT = "SendPollsEvent"; + public static final String USER_STATUS_CHANGE_EVENT = "UserStatusChangeEvent"; + public static final String SEND_POLLS_EVENT = "SendPollsEvent"; + public static final String RECORD_STATUS_EVENT = "RecordStatusEvent"; } diff --git a/bigbluebutton-apps/src/main/java/org/bigbluebutton/conference/service/participants/ParticipantsApplication.java b/bigbluebutton-apps/src/main/java/org/bigbluebutton/conference/service/participants/ParticipantsApplication.java index 28ba7c6be0..25c32415e3 100755 --- a/bigbluebutton-apps/src/main/java/org/bigbluebutton/conference/service/participants/ParticipantsApplication.java +++ b/bigbluebutton-apps/src/main/java/org/bigbluebutton/conference/service/participants/ParticipantsApplication.java @@ -21,17 +21,45 @@ package org.bigbluebutton.conference.service.participants; import org.slf4j.Logger; import org.red5.logging.Red5LoggerFactory; import java.util.Map; import org.bigbluebutton.core.api.IBigBlueButtonInGW; +import org.bigbluebutton.conference.service.lock.LockSettings; public class ParticipantsApplication { private static Logger log = Red5LoggerFactory.getLogger( ParticipantsApplication.class, "bigbluebutton" ); - private IBigBlueButtonInGW bbbInGW; + + public boolean createRoom(String name, Boolean locked, LockSettings lockSettings) { +// if(!roomsManager.hasRoom(name)){ +// log.info("Creating room " + name); +// roomsManager.addRoom(new Room(name, locked, lockSettings)); +// return true; +// } + return false; + } + + public boolean destroyRoom(String name) { +// if (roomsManager.hasRoom(name)) { +// log.info("Destroying room " + name); +// roomsManager.removeRoom(name); +// } else { +// log.warn("Destroying non-existing room " + name); +// } + return true; + } + + public void destroyAllRooms() { +// roomsManager.destroyAllRooms(); + } + + public boolean hasRoom(String name) { +// return roomsManager.hasRoom(name); + return false; + } public void setParticipantStatus(String room, String userid, String status, Object value) { bbbInGW.setUserStatus(room, userid, status, value); } - + public boolean participantLeft(String roomName, String userid) { log.debug("Participant " + userid + " leaving room " + roomName); bbbInGW.userLeft(userid, userid); @@ -40,9 +68,36 @@ public class ParticipantsApplication { } public boolean participantJoin(String roomName, String userid, String username, String role, String externUserID, Map status) { + bbbInGW.userJoin(roomName, userid, username, role, externUserID); return true; - + +/* + log.debug("participant joining room " + roomName); + if (roomsManager.hasRoom(roomName)) { + Room room = roomsManager.getRoom(roomName); + Boolean userLocked = false; + + LockSettings ls = room.getLockSettings(); + + if(room.isLocked()) { + //If room is locked and it's not a moderator, user join as locked + if(!"MODERATOR".equals(role)) + userLocked = true; + else { + //If it's a moderator, check for lockSettings + if(ls.getAllowModeratorLocking()) { + userLocked = true; + } + } + } + + User p = new User(userid, username, role, externUserID, status, userLocked); + room.addParticipant(p); + + log.debug("participant joined room " + roomName); + return true; +*/ } public void assignPresenter(String room, String newPresenterID, String newPresenterName, String assignedBy){ @@ -56,5 +111,13 @@ public class ParticipantsApplication { public void setBigBlueButtonInGW(IBigBlueButtonInGW inGW) { bbbInGW = inGW; } - + + public void setRecordingStatus(String room, String userid, Boolean recording) { +// roomsManager.changeRecordingStatus(room, userid, recording); + } + + public Boolean getRecordingStatus(String roomName) { +// return roomsManager.getRecordingStatus(roomName); + return true; + } } diff --git a/bigbluebutton-apps/src/main/java/org/bigbluebutton/conference/service/participants/ParticipantsService.java b/bigbluebutton-apps/src/main/java/org/bigbluebutton/conference/service/participants/ParticipantsService.java index 0b35255b11..d3e843c4db 100755 --- a/bigbluebutton-apps/src/main/java/org/bigbluebutton/conference/service/participants/ParticipantsService.java +++ b/bigbluebutton-apps/src/main/java/org/bigbluebutton/conference/service/participants/ParticipantsService.java @@ -60,4 +60,16 @@ public class ParticipantsService { private BigBlueButtonSession getBbbSession() { return (BigBlueButtonSession) Red5.getConnectionLocal().getAttribute(Constants.SESSION); } + + public void setRecordingStatus(String userid, Boolean recording) { + String roomName = Red5.getConnectionLocal().getScope().getName(); + log.debug("Setting recording status " + roomName + " " + userid + " " + recording); + application.setRecordingStatus(roomName, userid, recording); + } + + public Boolean getRecordingStatus() { + String roomName = Red5.getConnectionLocal().getScope().getName(); + log.info("Client is requesting the recording status in [" + roomName + "]."); + return application.getRecordingStatus(roomName); + } } diff --git a/bigbluebutton-apps/src/main/java/org/bigbluebutton/conference/service/recorder/participants/ParticipantsEventRecorder.java b/bigbluebutton-apps/src/main/java/org/bigbluebutton/conference/service/recorder/participants/ParticipantsEventRecorder.java index fc86c547e7..b717e0f8b1 100755 --- a/bigbluebutton-apps/src/main/java/org/bigbluebutton/conference/service/recorder/participants/ParticipantsEventRecorder.java +++ b/bigbluebutton-apps/src/main/java/org/bigbluebutton/conference/service/recorder/participants/ParticipantsEventRecorder.java @@ -19,6 +19,8 @@ package org.bigbluebutton.conference.service.recorder.participants; import java.util.ArrayList; +import java.util.Map; + import org.bigbluebutton.conference.IRoomListener; import org.bigbluebutton.conference.User; import org.bigbluebutton.conference.service.recorder.RecorderApplication; @@ -98,4 +100,19 @@ public class ParticipantsEventRecorder implements IRoomListener { return this.name; } + @Override + public void lockSettingsChange(Map lockSettings) { + + } + + @Override + public void recordingStatusChange(User p, Boolean recording) { + RecordStatusRecordEvent ev = new RecordStatusRecordEvent(); + ev.setTimestamp(System.currentTimeMillis()); + ev.setUserId(p.getInternalUserID()); + ev.setMeetingId(session); + ev.setRecordingStatus(recording.toString()); + + recorder.record(session, ev); + } } diff --git a/bigbluebutton-apps/src/main/java/org/bigbluebutton/conference/service/recorder/participants/RecordStatusRecordEvent.java b/bigbluebutton-apps/src/main/java/org/bigbluebutton/conference/service/recorder/participants/RecordStatusRecordEvent.java new file mode 100644 index 0000000000..a00e60fafc --- /dev/null +++ b/bigbluebutton-apps/src/main/java/org/bigbluebutton/conference/service/recorder/participants/RecordStatusRecordEvent.java @@ -0,0 +1,35 @@ +/** +* BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ +* +* Copyright (c) 2012 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.conference.service.recorder.participants; + +public class RecordStatusRecordEvent extends AbstractParticipantRecordEvent { + + public RecordStatusRecordEvent() { + super(); + setEvent("RecordStatusEvent"); + } + + public void setUserId(String userId) { + eventMap.put("userId", userId); + } + + public void setRecordingStatus(String status) { + eventMap.put("status", status); + } +} diff --git a/bigbluebutton-apps/src/main/java/org/bigbluebutton/conference/service/voice/VoiceHandler.java b/bigbluebutton-apps/src/main/java/org/bigbluebutton/conference/service/voice/VoiceHandler.java index c8dd66c26e..d2961bf0cd 100755 --- a/bigbluebutton-apps/src/main/java/org/bigbluebutton/conference/service/voice/VoiceHandler.java +++ b/bigbluebutton-apps/src/main/java/org/bigbluebutton/conference/service/voice/VoiceHandler.java @@ -113,6 +113,7 @@ public class VoiceHandler extends ApplicationAdapter implements IApplication{ String voiceBridge = getBbbSession().getVoiceBridge(); String meetingid = getBbbSession().getRoom(); Boolean record = getBbbSession().getRecord(); + Boolean muted = getBbbSession().getStartAsMuted(); if (!connection.getScope().hasAttribute(VOICE_BRIDGE)) { connection.getScope().setAttribute(VOICE_BRIDGE, getBbbSession().getVoiceBridge()); @@ -120,7 +121,7 @@ public class VoiceHandler extends ApplicationAdapter implements IApplication{ log.debug("Setting up voiceBridge " + voiceBridge); clientManager.addSharedObject(connection.getScope().getName(), voiceBridge, so); - conferenceService.createConference(voiceBridge, meetingid, record); + conferenceService.createConference(voiceBridge, meetingid, record, muted); return true; } diff --git a/bigbluebutton-apps/src/main/java/org/bigbluebutton/conference/service/voice/VoiceService.java b/bigbluebutton-apps/src/main/java/org/bigbluebutton/conference/service/voice/VoiceService.java index e8a349a073..e634fd0793 100755 --- a/bigbluebutton-apps/src/main/java/org/bigbluebutton/conference/service/voice/VoiceService.java +++ b/bigbluebutton-apps/src/main/java/org/bigbluebutton/conference/service/voice/VoiceService.java @@ -17,12 +17,19 @@ * */ package org.bigbluebutton.conference.service.voice; - import org.slf4j.Logger; import org.red5.server.api.Red5; import org.bigbluebutton.conference.BigBlueButtonSession; import org.bigbluebutton.conference.Constants; import org.red5.logging.Red5LoggerFactory; -import org.bigbluebutton.webconference.voice.ConferenceService; import java.util.ArrayList; import java.util.HashMap; + import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; -import org.bigbluebutton.webconference.voice.Participant; +import org.bigbluebutton.conference.BigBlueButtonSession; +import org.bigbluebutton.conference.Constants; +import org.bigbluebutton.webconference.voice.ConferenceService; +import org.bigbluebutton.webconference.voice.Participant; +import org.red5.logging.Red5LoggerFactory; +import org.red5.server.api.Red5; +import org.slf4j.Logger; + public class VoiceService { private static Logger log = Red5LoggerFactory.getLogger( VoiceService.class, "bigbluebutton" ); @@ -59,7 +66,6 @@ public class VoiceService { pmap.put("name", p.getName()); pmap.put("muted", p.isMuted()); pmap.put("talking", p.isTalking()); - pmap.put("locked", p.isMuteLocked()); log.debug("[" + p.getId() + "," + p.getName() + "," + p.isMuted() + "," + p.isTalking() + "]"); result.put(p.getId(), pmap); } @@ -67,11 +73,17 @@ public class VoiceService { return result; } + public void muteAllUsers(boolean mute, List dontMuteThese) { + String conference = getBbbSession().getVoiceBridge(); + log.debug("Mute all users in room[" + conference + "], dontLockThese list size = " + dontMuteThese.size()); + conferenceService.muteAllBut(conference, mute, dontMuteThese); + } + public void muteAllUsers(boolean mute) { String conference = getBbbSession().getVoiceBridge(); log.debug("Mute all users in room[" + conference + "]"); conferenceService.mute(conference, mute); - } + } public boolean isRoomMuted(){ String conference = getBbbSession().getVoiceBridge(); @@ -83,12 +95,6 @@ public class VoiceService { log.debug("MuteUnmute request for user [" + userid + "] in room[" + conference + "]"); conferenceService.mute(userid, conference, mute); } - - public void lockMuteUser(Integer userid, Boolean lock) { - String conference = getBbbSession().getVoiceBridge(); - log.debug("Lock request for user [" + userid + "] in room[" + conference + "]"); - conferenceService.lock(userid, conference, lock); - } public void kickUSer(Integer userid) { String conference = getBbbSession().getVoiceBridge(); diff --git a/bigbluebutton-apps/src/main/java/org/bigbluebutton/webconference/red5/voice/ClientManager.java b/bigbluebutton-apps/src/main/java/org/bigbluebutton/webconference/red5/voice/ClientManager.java index 19c718161d..c78479e9bd 100755 --- a/bigbluebutton-apps/src/main/java/org/bigbluebutton/webconference/red5/voice/ClientManager.java +++ b/bigbluebutton-apps/src/main/java/org/bigbluebutton/webconference/red5/voice/ClientManager.java @@ -22,10 +22,10 @@ import java.util.ArrayList; import java.util.List; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; + import org.bigbluebutton.webconference.voice.events.ConferenceEvent; import org.bigbluebutton.webconference.voice.events.ParticipantJoinedEvent; import org.bigbluebutton.webconference.voice.events.ParticipantLeftEvent; -import org.bigbluebutton.webconference.voice.events.ParticipantLockedEvent; import org.bigbluebutton.webconference.voice.events.ParticipantMutedEvent; import org.bigbluebutton.webconference.voice.events.ParticipantTalkingEvent; import org.red5.logging.Red5LoggerFactory; @@ -55,7 +55,7 @@ public class ClientManager implements ClientNotifier { if (soi != null) voiceRooms.remove(soi.getVoiceRoom()); } - private void joined(String room, Integer participant, String name, Boolean muted, Boolean talking, Boolean locked){ + private void joined(String room, Integer participant, String name, Boolean muted, Boolean talking){ log.debug("Participant " + name + "joining room " + room); RoomInfo soi = voiceRooms.get(room); if (soi != null) { @@ -65,7 +65,7 @@ public class ClientManager implements ClientNotifier { list.add(name); list.add(muted); list.add(talking); - list.add(locked); + log.debug("Sending join to client " + name); soi.getSharedObject().sendMessage("userJoin", list); } @@ -92,17 +92,6 @@ public class ClientManager implements ClientNotifier { } } - private void locked(String room, Integer participant, Boolean locked){ - log.debug("Participant " + participant + " is locked = " + locked); - RoomInfo soi = voiceRooms.get(room); - if (soi != null) { - List list = new ArrayList(); - list.add(participant); - list.add(locked); - soi.getSharedObject().sendMessage("userLockedMute", list); - } - } - private void talking(String room, Integer participant, Boolean talking){ log.debug("Participant " + participant + " is talking = " + talking); RoomInfo soi = voiceRooms.get(room); @@ -117,7 +106,7 @@ public class ClientManager implements ClientNotifier { public void handleConferenceEvent(ConferenceEvent event) { if (event instanceof ParticipantJoinedEvent) { ParticipantJoinedEvent pje = (ParticipantJoinedEvent) event; - joined(pje.getRoom(), pje.getParticipantId(), pje.getCallerIdName(), pje.getMuted(), pje.getSpeaking(), pje.isLocked()); + joined(pje.getRoom(), pje.getParticipantId(), pje.getCallerIdName(), pje.getMuted(), pje.getSpeaking()); } else if (event instanceof ParticipantLeftEvent) { left(event.getRoom(), event.getParticipantId()); } else if (event instanceof ParticipantMutedEvent) { @@ -126,9 +115,6 @@ public class ClientManager implements ClientNotifier { } else if (event instanceof ParticipantTalkingEvent) { ParticipantTalkingEvent pte = (ParticipantTalkingEvent) event; talking(pte.getRoom(), pte.getParticipantId(), pte.isTalking()); - } else if (event instanceof ParticipantLockedEvent) { - ParticipantLockedEvent ple = (ParticipantLockedEvent) event; - locked(ple.getRoom(), ple.getParticipantId(), ple.isLocked()); } } } diff --git a/bigbluebutton-apps/src/main/java/org/bigbluebutton/webconference/voice/ConferenceService.java b/bigbluebutton-apps/src/main/java/org/bigbluebutton/webconference/voice/ConferenceService.java index 3a2aa8fbbc..129d11cc56 100755 --- a/bigbluebutton-apps/src/main/java/org/bigbluebutton/webconference/voice/ConferenceService.java +++ b/bigbluebutton-apps/src/main/java/org/bigbluebutton/webconference/voice/ConferenceService.java @@ -19,10 +19,11 @@ package org.bigbluebutton.webconference.voice; import java.util.ArrayList; +import java.util.List; + import org.bigbluebutton.webconference.red5.voice.ClientManager; import org.bigbluebutton.webconference.voice.events.ConferenceEvent; import org.bigbluebutton.webconference.voice.events.ConferenceEventListener; -import org.bigbluebutton.webconference.voice.events.ParticipantLockedEvent; import org.bigbluebutton.webconference.voice.internal.RoomManager; import org.red5.logging.Red5LoggerFactory; import org.slf4j.Logger; @@ -53,9 +54,9 @@ public class ConferenceService implements ConferenceEventListener { } } - public void createConference(String room, String meetingid, boolean record) { + public void createConference(String room, String meetingid, boolean record, boolean muted) { if (roomMgr.hasRoom(room)) return; - roomMgr.createRoom(room, record, meetingid); + roomMgr.createRoom(room, record, meetingid, muted); confProvider.populateRoom(room); } @@ -65,13 +66,6 @@ public class ConferenceService implements ConferenceEventListener { roomMgr.destroyRoom(room); } - public void lock(Integer participant, String room, Boolean lock) { - if (roomMgr.hasParticipant(room, participant)) { - ParticipantLockedEvent ple = new ParticipantLockedEvent(participant, room, lock); - handleConferenceEvent(ple); - } - } - public void recordSession(String room, String meetingid){ confProvider.record(room, meetingid); } @@ -85,29 +79,34 @@ public class ConferenceService implements ConferenceEventListener { muteParticipant(participant, room, mute); } - public void mute(String room, Boolean mute) { + public void muteAllBut(String room, Boolean mute, List dontMuteThese) { if (roomMgr.hasRoom(room)) { roomMgr.mute(room, mute); ArrayList p = getParticipants(room); + for (Participant o : p) { - if (! roomMgr.isParticipantMuteLocked(o.getId(), room)) { - muteParticipant(o.getId(), room, mute); - } + if(dontMuteThese == null || !dontMuteThese.contains(o.getId())) + muteParticipant(o.getId(), room, mute); } } } + public void mute(String room, Boolean mute) { + this.muteAllBut(room, mute, null); + } + public boolean isRoomMuted(String room){ if (roomMgr.hasRoom(room)) { return roomMgr.isRoomMuted(room); } return false; } - + private void muteParticipant(Integer participant, String room, Boolean mute) { confProvider.mute(room, participant, mute); } + public void eject(Integer participant, String room) { if (roomMgr.hasParticipant(room, participant)) ejectParticipant(room, participant); diff --git a/bigbluebutton-apps/src/main/java/org/bigbluebutton/webconference/voice/Participant.java b/bigbluebutton-apps/src/main/java/org/bigbluebutton/webconference/voice/Participant.java index 675ec2790c..bbccff0d34 100755 --- a/bigbluebutton-apps/src/main/java/org/bigbluebutton/webconference/voice/Participant.java +++ b/bigbluebutton-apps/src/main/java/org/bigbluebutton/webconference/voice/Participant.java @@ -23,6 +23,5 @@ public interface Participant { public boolean isTalking(); public int getId(); public String getName(); - public boolean isMuteLocked(); public String getUserID(); } diff --git a/bigbluebutton-apps/src/main/java/org/bigbluebutton/webconference/voice/VoiceEventRecorder.java b/bigbluebutton-apps/src/main/java/org/bigbluebutton/webconference/voice/VoiceEventRecorder.java index e88b9745de..aa096a57b4 100755 --- a/bigbluebutton-apps/src/main/java/org/bigbluebutton/webconference/voice/VoiceEventRecorder.java +++ b/bigbluebutton-apps/src/main/java/org/bigbluebutton/webconference/voice/VoiceEventRecorder.java @@ -76,7 +76,6 @@ public class VoiceEventRecorder { evt.setCallerNumber(pje.getCallerIdName()); evt.setMuted(pje.getMuted()); evt.setTalking(pje.getSpeaking()); - evt.setLocked(pje.isLocked()); recorder.record(room, evt); } diff --git a/bigbluebutton-apps/src/main/java/org/bigbluebutton/webconference/voice/events/ParticipantJoinedEvent.java b/bigbluebutton-apps/src/main/java/org/bigbluebutton/webconference/voice/events/ParticipantJoinedEvent.java index 30336e28af..9c59d1c527 100755 --- a/bigbluebutton-apps/src/main/java/org/bigbluebutton/webconference/voice/events/ParticipantJoinedEvent.java +++ b/bigbluebutton-apps/src/main/java/org/bigbluebutton/webconference/voice/events/ParticipantJoinedEvent.java @@ -24,7 +24,6 @@ public class ParticipantJoinedEvent extends ConferenceEvent { private final String callerIdName; private final Boolean muted; private final Boolean speaking; - private final Boolean locked = false; public ParticipantJoinedEvent(Integer participantId, String room, String callerIdNum, String callerIdName, @@ -51,8 +50,4 @@ public class ParticipantJoinedEvent extends ConferenceEvent { public Boolean getSpeaking() { return speaking; } - - public Boolean isLocked() { - return locked; - } } diff --git a/bigbluebutton-apps/src/main/java/org/bigbluebutton/webconference/voice/internal/ParticipantImp.java b/bigbluebutton-apps/src/main/java/org/bigbluebutton/webconference/voice/internal/ParticipantImp.java index 7b0f20aa32..374b732e98 100755 --- a/bigbluebutton-apps/src/main/java/org/bigbluebutton/webconference/voice/internal/ParticipantImp.java +++ b/bigbluebutton-apps/src/main/java/org/bigbluebutton/webconference/voice/internal/ParticipantImp.java @@ -33,7 +33,6 @@ class ParticipantImp implements Participant { private final String name; private boolean muted = false; private boolean talking = false; - private boolean locked = false; private final String userID; @@ -76,14 +75,6 @@ class ParticipantImp implements Participant { return id; } - public boolean isMuteLocked() { - return locked; - } - - public void setLock(boolean lock) { - locked = lock; - } - public String getName() { return name; } diff --git a/bigbluebutton-apps/src/main/java/org/bigbluebutton/webconference/voice/internal/RoomImp.java b/bigbluebutton-apps/src/main/java/org/bigbluebutton/webconference/voice/internal/RoomImp.java index 74dc6ae954..653e3a656a 100755 --- a/bigbluebutton-apps/src/main/java/org/bigbluebutton/webconference/voice/internal/RoomImp.java +++ b/bigbluebutton-apps/src/main/java/org/bigbluebutton/webconference/voice/internal/RoomImp.java @@ -24,26 +24,27 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; +import net.jcip.annotations.ThreadSafe; + import org.bigbluebutton.webconference.voice.Participant; import org.bigbluebutton.webconference.voice.Room; -import net.jcip.annotations.ThreadSafe; - @ThreadSafe public class RoomImp implements Room { private final String name; private final ConcurrentMap participants; - private boolean muted = false; + private boolean muted; private boolean record = false; private String meetingid; private boolean recording = false; - public RoomImp(String name, boolean record, String meetingid) { + public RoomImp(String name, boolean record, String meetingid, Boolean muted) { this.name = name; this.record = record; this.meetingid = meetingid; + this.muted = muted; participants = new ConcurrentHashMap(); } diff --git a/bigbluebutton-apps/src/main/java/org/bigbluebutton/webconference/voice/internal/RoomManager.java b/bigbluebutton-apps/src/main/java/org/bigbluebutton/webconference/voice/internal/RoomManager.java index 22e6a8bbc8..6c0a58671f 100755 --- a/bigbluebutton-apps/src/main/java/org/bigbluebutton/webconference/voice/internal/RoomManager.java +++ b/bigbluebutton-apps/src/main/java/org/bigbluebutton/webconference/voice/internal/RoomManager.java @@ -20,19 +20,20 @@ package org.bigbluebutton.webconference.voice.internal; import java.util.ArrayList; import java.util.concurrent.ConcurrentHashMap; + +import net.jcip.annotations.ThreadSafe; + import org.bigbluebutton.webconference.voice.ConferenceService; import org.bigbluebutton.webconference.voice.Participant; import org.bigbluebutton.webconference.voice.VoiceEventRecorder; import org.bigbluebutton.webconference.voice.events.ConferenceEvent; import org.bigbluebutton.webconference.voice.events.ParticipantJoinedEvent; import org.bigbluebutton.webconference.voice.events.ParticipantLeftEvent; -import org.bigbluebutton.webconference.voice.events.ParticipantLockedEvent; import org.bigbluebutton.webconference.voice.events.ParticipantMutedEvent; import org.bigbluebutton.webconference.voice.events.ParticipantTalkingEvent; import org.bigbluebutton.webconference.voice.events.StartRecordingEvent; import org.red5.logging.Red5LoggerFactory; import org.slf4j.Logger; -import net.jcip.annotations.ThreadSafe; @ThreadSafe public class RoomManager { @@ -55,9 +56,9 @@ public class RoomManager { return -1; } - public void createRoom(String name, boolean record, String meetingid) { + public void createRoom(String name, boolean record, String meetingid, Boolean muted) { log.debug("Creating room: " + name); - RoomImp r = new RoomImp(name, record, meetingid); + RoomImp r = new RoomImp(name, record, meetingid, muted); rooms.putIfAbsent(name, r); } @@ -96,24 +97,6 @@ public class RoomManager { } return rm.getParticipants(); } - - public boolean isParticipantMuteLocked(Integer participant, String room) { - RoomImp rm = rooms.get(room); - if (rm != null) { - Participant p = rm.getParticipant(participant); - return p.isMuteLocked(); - } - return false; - } - - private void lockParticipant(String room, Integer participant, Boolean lock) { - RoomImp rm = rooms.get(room); - if (rm != null) { - ParticipantImp p = (ParticipantImp) rm.getParticipant(participant); - if (p != null) - p.setLock(lock); - } - } /** * Process the event from the voice conferencing server. @@ -135,8 +118,6 @@ public class RoomManager { handleParticipantMutedEvent(event, rm); } else if (event instanceof ParticipantTalkingEvent) { handleParticipantTalkingEvent(event, rm); - } else if (event instanceof ParticipantLockedEvent) { - handleParticipantLockedEvent(event, rm); } else if (event instanceof StartRecordingEvent) { // do nothing but let it through. // later on we need to dispatch an event to the client that the voice recording has started. @@ -210,11 +191,6 @@ public class RoomManager { if (p != null) p.setTalking(pte.isTalking()); } - private void handleParticipantLockedEvent(ConferenceEvent event, RoomImp rm) { - ParticipantLockedEvent ple = (ParticipantLockedEvent) event; - lockParticipant(ple.getRoom(), ple.getParticipantId(), ple.isLocked()); - } - public void setVoiceEventRecorder(VoiceEventRecorder recorder) { this.recorder = recorder; } diff --git a/bigbluebutton-apps/src/main/webapp/WEB-INF/bbb-voice-app.xml b/bigbluebutton-apps/src/main/webapp/WEB-INF/bbb-voice-app.xml index 50b4ad9eb6..75b1655dc0 100755 --- a/bigbluebutton-apps/src/main/webapp/WEB-INF/bbb-voice-app.xml +++ b/bigbluebutton-apps/src/main/webapp/WEB-INF/bbb-voice-app.xml @@ -48,5 +48,5 @@ with BigBlueButton; if not, see . - + diff --git a/bigbluebutton-client/branding/default/style/css/BBBBlack.css b/bigbluebutton-client/branding/default/style/css/BBBBlack.css index 39ff535af8..77449763fe 100755 --- a/bigbluebutton-client/branding/default/style/css/BBBBlack.css +++ b/bigbluebutton-client/branding/default/style/css/BBBBlack.css @@ -608,3 +608,33 @@ MDIWindow { /*None of the following properties are overridden by the MDIWindow c { icon: Embed('assets/images/play-blue.png'); } + +.lockSettingsDefaultLabelStyle { + fontFamily: Arial; + fontSize: 14; + fontWeight: bold; +} + +.lockSettingsWindowStyle { + borderColor: #000000; + borderAlpha: 1; + borderThicknessLeft: 10; + borderThicknessTop: 0; + borderThicknessBottom: 10; + borderThicknessRight: 10; + roundedBottomCorners: true; + cornerRadius: 5; + headerHeight: 20; + backgroundAlpha: 1; + headerColors: #000000, #000000; + footerColors: #000000, #000000; + backgroundColor: #000000; + dropShadowEnabled: true; + titleStyleName: "micSettingsWindowTitleStyle"; +} + +.lockSettingsWindowTitleStyle { + fontFamily: Arial; + fontSize: 20; + fontWeight: bold; +} \ No newline at end of file diff --git a/bigbluebutton-client/branding/default/style/css/BBBDefault.css b/bigbluebutton-client/branding/default/style/css/BBBDefault.css index 7f83f31f55..5d7c1b4f11 100755 --- a/bigbluebutton-client/branding/default/style/css/BBBDefault.css +++ b/bigbluebutton-client/branding/default/style/css/BBBDefault.css @@ -47,7 +47,7 @@ Panel { color: #e1e2e5; } -Button, .logoutButtonStyle, .chatSendButtonStyle, .helpLinkButtonStyle, .cameraDisplaySettingsWindowChangeResolutionCombo, .languageSelectorStyle { +Button, .logoutButtonStyle, .chatSendButtonStyle, .helpLinkButtonStyle, .cameraDisplaySettingsWindowChangeResolutionCombo, .languageSelectorStyle, .testJavaLinkButtonStyle, .recordButtonStyleNormal, .recordButtonStyleStart, .recordButtonStyleStop { textIndent: 0; paddingLeft: 10; paddingRight: 10; @@ -90,6 +90,27 @@ Button, .logoutButtonStyle, .chatSendButtonStyle, .helpLinkButtonStyle, .cameraD fontWeight: bold; } +.testJavaLinkButtonStyle { + paddingLeft: 4; + paddingRight: 4; + paddingTop: 2; + paddingBottom: 2; + fontSize: 14; + rollOverColor: #cccccc; + selectionColor: #cccccc; + color: #e3e3e3; + textRollOverColor: #504f46; + textSelectedColor: #504f46; + fontWeight: bold; + textDecoration: none; +} + +.javaVersionRequiredLabelStyle { + fontSize: 12; + color: #000000; + fontFamily: Arial; +} + .logoutButtonStyle { paddingLeft: 0; paddingRight: 0; @@ -676,10 +697,52 @@ MDIWindow { /*None of the following properties are overridden by the MDIWindow c } Alert { - borderColor: #DFDFDF; - backgroundColor: #EFEFEF; + borderColor: #DFDFDF; + backgroundColor: #EFEFEF; + borderAlpha: 1; + shadowDistance: 1; + dropShadowColor: #FFFFFF; + color: #000000; +} + +.lockSettingsDefaultLabelStyle { + fontFamily: Arial; + fontSize: 14; + fontWeight: bold; +} + +.lockSettingsWindowStyle { + borderColor: #b9babc; borderAlpha: 1; - shadowDistance: 1; - dropShadowColor: #FFFFFF; - color: #000000; -} \ No newline at end of file + borderThicknessLeft: 10; + borderThicknessTop: 0; + borderThicknessBottom: 10; + borderThicknessRight: 10; + roundedBottomCorners: true; + cornerRadius: 5; + headerHeight: 20; + backgroundAlpha: 1; + headerColors: #b9babc, #b9babc; + footerColors: #b9babc, #b9babc; + backgroundColor: #EFEFEF; + dropShadowEnabled: true; + titleStyleName: "micSettingsWindowTitleStyle"; +} + +.lockSettingsWindowTitleStyle { + fontFamily: Arial; + fontSize: 20; + fontWeight: bold; +} + +.recordButtonStyleNormal { + icon: Embed('assets/images/control-record.png'); +} + +.recordButtonStyleStart { + icon: Embed('assets/images/control-record-start.png'); +} + +.recordButtonStyleStop { + icon: Embed('assets/images/control-record-stop.png'); +} diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/control-record-start.png b/bigbluebutton-client/branding/default/style/css/assets/images/control-record-start.png new file mode 100644 index 0000000000..e26a3d5ae3 Binary files /dev/null and b/bigbluebutton-client/branding/default/style/css/assets/images/control-record-start.png differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/control-record-stop.png b/bigbluebutton-client/branding/default/style/css/assets/images/control-record-stop.png new file mode 100644 index 0000000000..c10cc1e504 Binary files /dev/null and b/bigbluebutton-client/branding/default/style/css/assets/images/control-record-stop.png differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/control-record.png b/bigbluebutton-client/branding/default/style/css/assets/images/control-record.png new file mode 100644 index 0000000000..c11d60b052 Binary files /dev/null and b/bigbluebutton-client/branding/default/style/css/assets/images/control-record.png differ diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/icons-license.txt b/bigbluebutton-client/branding/default/style/css/assets/images/icons-license.txt index 9f25609678..9cbdc68e81 100755 --- a/bigbluebutton-client/branding/default/style/css/assets/images/icons-license.txt +++ b/bigbluebutton-client/branding/default/style/css/assets/images/icons-license.txt @@ -22,7 +22,7 @@ Any other questions about this icon set please contact mjames@gmail.com ================================================== -Diagona Icons +Diagona Icons / Fugue Icons Copyright (C) 2007 Yusuke Kamiyamane. All rights reserved. The icons are licensed under a Creative Commons Attribution diff --git a/bigbluebutton-client/branding/default/style/css/assets/images/stop.png b/bigbluebutton-client/branding/default/style/css/assets/images/stop.png new file mode 100644 index 0000000000..0cfd585963 Binary files /dev/null and b/bigbluebutton-client/branding/default/style/css/assets/images/stop.png differ diff --git a/bigbluebutton-client/build.xml b/bigbluebutton-client/build.xml index d798b53c19..acce8ff3a7 100755 --- a/bigbluebutton-client/build.xml +++ b/bigbluebutton-client/build.xml @@ -3,14 +3,14 @@ - + - + @@ -135,6 +135,10 @@ + + + + diff --git a/bigbluebutton-client/locale/az_AZ/bbbResources.properties b/bigbluebutton-client/locale/az_AZ/bbbResources.properties index e299f88110..68febacffc 100644 --- a/bigbluebutton-client/locale/az_AZ/bbbResources.properties +++ b/bigbluebutton-client/locale/az_AZ/bbbResources.properties @@ -181,7 +181,10 @@ bbb.desktopPublish.title = İşçi masasını göstər # bbb.desktopPublish.minimizeBtn.toolTip = Minimize # bbb.desktopPublish.minimizeBtn.accessibilityName = Minimize the Desktop Sharing Publish Window # bbb.desktopPublish.maximizeRestoreBtn.accessibilityName = Maximize the Desktop Sharing Publish Window -# bbb.desktopPublish.closeBtn.accessibilityName = Stop Sharing and Close the Desktop Sharing Publish Window +# bbb.desktopPublish.javaRequiredLabel = Requires Java 7u45 (or later) to run. +# bbb.desktopPublish.javaTestLinkLabel = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip.accessibility = Test Java bbb.desktopView.title = Pəncərə paylaşması bbb.desktopView.fitToWindow = Pəncərə boyda et bbb.desktopView.actualSize = Aktual ölçüyə gətir diff --git a/bigbluebutton-client/locale/bg_BG/bbbResources.properties b/bigbluebutton-client/locale/bg_BG/bbbResources.properties index d30ab4caa8..be6e3e3a19 100644 --- a/bigbluebutton-client/locale/bg_BG/bbbResources.properties +++ b/bigbluebutton-client/locale/bg_BG/bbbResources.properties @@ -181,7 +181,10 @@ bbb.desktopPublish.closeBtn.toolTip = Спиране на споделянето bbb.desktopPublish.minimizeBtn.toolTip = Минимизиране bbb.desktopPublish.minimizeBtn.accessibilityName = Минимизиране на прозореца Публикуване на споделен екран bbb.desktopPublish.maximizeRestoreBtn.accessibilityName = Максимизиране на прозореца Публикуване на споделен екран -bbb.desktopPublish.closeBtn.accessibilityName = Спрете споделянето и затворете прозорец Публикуване на споделен екран +# bbb.desktopPublish.javaRequiredLabel = Requires Java 7u45 (or later) to run. +# bbb.desktopPublish.javaTestLinkLabel = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip.accessibility = Test Java bbb.desktopView.title = Споделяне на екрана bbb.desktopView.fitToWindow = Вмести в прозореца bbb.desktopView.actualSize = Покажи в реален размер diff --git a/bigbluebutton-client/locale/bn_IN/bbbResources.properties b/bigbluebutton-client/locale/bn_IN/bbbResources.properties index 0ec4f32d14..279899c116 100644 --- a/bigbluebutton-client/locale/bn_IN/bbbResources.properties +++ b/bigbluebutton-client/locale/bn_IN/bbbResources.properties @@ -181,7 +181,10 @@ bbb.presentation.ok = ঠিক আছে # bbb.desktopPublish.minimizeBtn.toolTip = Minimize # bbb.desktopPublish.minimizeBtn.accessibilityName = Minimize the Desktop Sharing Publish Window # bbb.desktopPublish.maximizeRestoreBtn.accessibilityName = Maximize the Desktop Sharing Publish Window -# bbb.desktopPublish.closeBtn.accessibilityName = Stop Sharing and Close the Desktop Sharing Publish Window +# bbb.desktopPublish.javaRequiredLabel = Requires Java 7u45 (or later) to run. +# bbb.desktopPublish.javaTestLinkLabel = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip.accessibility = Test Java # bbb.desktopView.title = Desktop Sharing # bbb.desktopView.fitToWindow = Fit to Window # bbb.desktopView.actualSize = Display actual size diff --git a/bigbluebutton-client/locale/ca_ES/bbbResources.properties b/bigbluebutton-client/locale/ca_ES/bbbResources.properties index a4a9ebf474..4e718ebdf3 100644 --- a/bigbluebutton-client/locale/ca_ES/bbbResources.properties +++ b/bigbluebutton-client/locale/ca_ES/bbbResources.properties @@ -181,7 +181,10 @@ bbb.desktopPublish.closeBtn.toolTip = Aturar la compartició i tancar aquesta fi bbb.desktopPublish.minimizeBtn.toolTip = Minimitzar aquesta finestra. bbb.desktopPublish.minimizeBtn.accessibilityName = Minimitzar la finestra d'iniciar el compartir escriptori bbb.desktopPublish.maximizeRestoreBtn.accessibilityName = Maximitzar la finestra d'iniciar el compartir escriptori -bbb.desktopPublish.closeBtn.accessibilityName = Cancel i Tancar la Finestra de Compartir Escriptori +# bbb.desktopPublish.javaRequiredLabel = Requires Java 7u45 (or later) to run. +# bbb.desktopPublish.javaTestLinkLabel = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip.accessibility = Test Java bbb.desktopView.title = Compartició de pantalla bbb.desktopView.fitToWindow = Ajustar a la finestra bbb.desktopView.actualSize = Mostrar la mida actual diff --git a/bigbluebutton-client/locale/cs_CZ/bbbResources.properties b/bigbluebutton-client/locale/cs_CZ/bbbResources.properties index b8d84bcd79..076a2ce7aa 100644 --- a/bigbluebutton-client/locale/cs_CZ/bbbResources.properties +++ b/bigbluebutton-client/locale/cs_CZ/bbbResources.properties @@ -181,7 +181,10 @@ bbb.desktopPublish.closeBtn.toolTip = Ukončit sdílení a zavřít toto okno. bbb.desktopPublish.minimizeBtn.toolTip = Minimalizovat toto okno. # bbb.desktopPublish.minimizeBtn.accessibilityName = Minimize the Desktop Sharing Publish Window # bbb.desktopPublish.maximizeRestoreBtn.accessibilityName = Maximize the Desktop Sharing Publish Window -# bbb.desktopPublish.closeBtn.accessibilityName = Stop Sharing and Close the Desktop Sharing Publish Window +# bbb.desktopPublish.javaRequiredLabel = Requires Java 7u45 (or later) to run. +# bbb.desktopPublish.javaTestLinkLabel = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip.accessibility = Test Java bbb.desktopView.title = Sdílení plochy bbb.desktopView.fitToWindow = Přizpůsobit oknu bbb.desktopView.actualSize = Zobrazit aktuální velikost diff --git a/bigbluebutton-client/locale/cy_GB/bbbResources.properties b/bigbluebutton-client/locale/cy_GB/bbbResources.properties new file mode 100644 index 0000000000..6fd8090a73 --- /dev/null +++ b/bigbluebutton-client/locale/cy_GB/bbbResources.properties @@ -0,0 +1,497 @@ +bbb.mainshell.locale.version = 0.8 +bbb.mainshell.statusProgress.connecting = Cysylltu â'r gweinydd +bbb.mainshell.statusProgress.loading = Llwytho {0} modiwl +bbb.mainshell.statusProgress.cannotConnectServer = Mae'n ddrwg gennym, ni allwn cysylltu â'r gweinydd. +bbb.mainshell.copyrightLabel2 = (c) 2013 BigBlueButton Inc. [build {0}] - Am fwy o wybodaeth ymwelwch http\://www.bigbluebutton.org +bbb.mainshell.logBtn.toolTip = Agor ffenestr cofnodi +bbb.mainshell.resetLayoutBtn.toolTip = Ailosod Gosodiad +bbb.oldlocalewindow.reminder1 = Efallai bod gennych hen gyfieithiadau iaith BigBlueButton. +bbb.oldlocalewindow.reminder2 = Gliriwch storfa eich porwr a cheisiwch eto. +bbb.oldlocalewindow.windowTitle = Rhybudd\: Hen Cyfieithiadau Iaith +bbb.micSettings.speakers.header = Gwirio'r Uchelseinydd +bbb.micSettings.microphone.header = Gwirio'r Meicroffon +bbb.micSettings.playSound = Gwirio'r uchelseinydd +bbb.micSettings.playSound.toolTip = Chwarae cerddoriaeth i brofi eich uchelseinydd +bbb.micSettings.hearFromHeadset = Dylech glywed sain yn eich clustffonau, nid drwy uchelseinyddion eich cyfrifiadur. +bbb.micSettings.speakIntoMic = Gwirio neu newid eich meicroffon (argymhellir 'headset'). +bbb.micSettings.changeMic = Gwirio neu newid eich meicroffon. +bbb.micSettings.changeMic.toolTip = Agorwch flwch deialog gosodiadau meicroffon Flash Player +bbb.micSettings.join = Ymuno â'r Sain +bbb.micSettings.cancel = Diddymu +bbb.micSettings.cancel.toolTip = Canslo ymuno â'r gynhadledd sain +bbb.micSettings.access.helpButton = Agor fideos tiwtorial mewn tudalen newydd. +bbb.micSettings.access.title = Gosodiadau sain. Bydd y ffocws yn parhau ar y ffenestr gosodiadau sain tra bydd ar agor. +bbb.mainToolbar.helpBtn = Cymorth +bbb.mainToolbar.logoutBtn = Allgofnodi +bbb.mainToolbar.logoutBtn.toolTip = Allgofnodi +bbb.mainToolbar.langSelector = Dewis iaith +bbb.mainToolbar.settingsBtn = Gosodiadau +bbb.mainToolbar.settingsBtn.toolTip = Agor Gosodiadau +bbb.mainToolbar.shortcutBtn = Cymorth Llwybrau Byr +bbb.mainToolbar.shortcutBtn.toolTip = Agor ffenestr Cymorth Llwybrau Byr +bbb.window.minimizeBtn.toolTip = Lleihau +bbb.window.maximizeRestoreBtn.toolTip = Ehangu +bbb.window.closeBtn.toolTip = Cau +bbb.videoDock.titleBar = Bar Teitl y Ffenestr Gwegamera +bbb.presentation.titleBar = Bar Teitl y Ffenestr Cyflwyniad +bbb.chat.titleBar = Bar Teitl y Ffenestr Sgwrsio +bbb.users.title = Defnyddwyr{0} {1} +bbb.users.titleBar = Bar Teitl y Ffenestr Defnyddwyr +bbb.users.quickLink.label = Ffenestr Defnyddwyr +bbb.users.minimizeBtn.accessibilityName = Lleihau Ffenestr Defnyddwyr +bbb.users.maximizeRestoreBtn.accessibilityName = Ehangu Ffenestr Defnyddwyr +bbb.users.settings.buttonTooltip = Gosodiadau +bbb.users.settings.audioSettings = Gosodiadau Sain +bbb.users.settings.webcamSettings = Gosodiadau Gewgamera +bbb.users.settings.muteAll = Pylu Pob Defnyddiwr +bbb.users.settings.muteAllExcept = Pylu Pob Defnyddiwr Ac Eithrio'r Cyflwynydd +bbb.users.settings.unmuteAll = Datpylu Pob Defnyddiwr +bbb.users.settings.lowerAllHands = Gostwng Pop Llaw +bbb.users.raiseHandBtn.toolTip = Codi Llaw +bbb.users.pushToTalk.toolTip = Siarad +bbb.users.pushToMute.toolTip = Pylu eich hun +bbb.users.muteMeBtnTxt.talk = Datpylu +bbb.users.muteMeBtnTxt.mute = Pylu +bbb.users.muteMeBtnTxt.muted = Pylwyd +bbb.users.muteMeBtnTxt.unmuted = Datpylwyd +bbb.users.usersGrid.accessibilityName = Rhestr Defnyddwyr. Defnyddiwch y bysellau saeth i lywio. +bbb.users.usersGrid.nameItemRenderer = Enw +bbb.users.usersGrid.nameItemRenderer.youIdentifier = chi +bbb.users.usersGrid.statusItemRenderer = Statws +bbb.users.usersGrid.statusItemRenderer.changePresenter = Newid cyflwynydd +bbb.users.usersGrid.statusItemRenderer.presenter = Cyflwynydd +bbb.users.usersGrid.statusItemRenderer.moderator = Cymedrolwr +bbb.users.usersGrid.statusItemRenderer.lowerHand = Gostwng Llaw +bbb.users.usersGrid.statusItemRenderer.handRaised = Codwyd Llaw +bbb.users.usersGrid.statusItemRenderer.viewer = Gwyliwr +bbb.users.usersGrid.mediaItemRenderer = Cyfrwng +bbb.users.usersGrid.mediaItemRenderer.talking = Siarad +bbb.users.usersGrid.mediaItemRenderer.webcam = Rhannu Gwegamera +bbb.users.usersGrid.mediaItemRenderer.webcamBtn = Gweld Gwegamera +bbb.users.usersGrid.mediaItemRenderer.pushToTalk = Datpylu {0} +bbb.users.usersGrid.mediaItemRenderer.pushToMute = Pylu {0} +bbb.users.usersGrid.mediaItemRenderer.pushToLock = Cloi meic {0} +bbb.users.usersGrid.mediaItemRenderer.pushToUnlock = Datgloi meic {0} +bbb.users.usersGrid.mediaItemRenderer.kickUser = Cicio {0} +bbb.users.usersGrid.mediaItemRenderer.webcam = Rhannu Gwegamera +bbb.users.usersGrid.mediaItemRenderer.micOff = Meicroffon i ffwrdd +bbb.users.usersGrid.mediaItemRenderer.micOn = Meicroffon ar +bbb.users.usersGrid.mediaItemRenderer.noAudio = Dim mewn cynhadledd sain +bbb.presentation.title = Cyflwyniad +bbb.presentation.titleWithPres = Cyflwyniad\: {0} +bbb.presentation.quickLink.label = Ffenestr Cyflwyniad +bbb.presentation.fitToWidth.toolTip = Addasu'r cyflwyniad i'r lled +bbb.presentation.fitToPage.toolTip = Addasu'r cyflwyniad i'r dudalen +bbb.presentation.uploadPresBtn.toolTip = Agor blwch deialog Llwytho i Fyny Cyflwyniad. +bbb.presentation.backBtn.toolTip = Sleid Blaenorol +bbb.presentation.btnSlideNum.toolTip = Dewiswch slide +bbb.presentation.forwardBtn.toolTip = Sleid nesaf +bbb.presentation.maxUploadFileExceededAlert = Gwall\: Mae'r ffeil yn fwy na'r hyn a ganiateir. +bbb.presentation.uploadcomplete = Llwythwyd i fyny. Arhoswch tra trosir y ddogfen. +bbb.presentation.uploaded = wedi'i lwytho i fynnu. +bbb.presentation.document.supported = Cefnogir y ddogfen a lwythwyd i fyny. Dechrau trosi... +bbb.presentation.document.converted = Troswyd y ddogfen yn llwyddiannus. +bbb.presentation.error.document.convert.failed = Gwall\: Methwyd trosi'r dogfen. +bbb.presentation.error.io = Gwall IO\: Cysylltwch â'r gweinyddwr. +bbb.presentation.error.security = Gwall Diogelwch\: Cysylltwch â'r gweinyddwr. +bbb.presentation.error.convert.notsupported = Gwall\: Ni chefnogir y ddogfen a lwythwyd i fyny. Llwythwch i fyny dogfen a gefnogir. +bbb.presentation.error.convert.nbpage = Gwall\: Methwyd darganfod nifer o dudalennau yn a dogfen a lwythwyd i fyny. +bbb.presentation.error.convert.maxnbpagereach = Gwall\: Mae'r ddogfen a lwythwyd i fyny a gormodd o dudalennau. +bbb.presentation.converted = Sleid {0} o {1} wedi eu trosi +bbb.presentation.ok = Iawn +bbb.presentation.slider = Lefel chwyddo'r cyflwyniad +bbb.presentation.slideloader.starttext = Dechrau testun y slied +bbb.presentation.slideloader.endtext = Diwedd testun y slied +bbb.presentation.uploadwindow.presentationfile = Ffeil Cyflwyniad +bbb.presentation.uploadwindow.pdf = PDF +bbb.presentation.uploadwindow.word = WORD +bbb.presentation.uploadwindow.excel = EXCEL +bbb.presentation.uploadwindow.powerpoint = POWERPOINT +bbb.presentation.uploadwindow.image = DELWEDD +bbb.presentation.minimizeBtn.accessibilityName = Lleihau Ffenestr Cyflwyniad +bbb.presentation.maximizeRestoreBtn.accessibilityName = Ehangu Ffenestr Cyflwyniad +bbb.presentation.closeBtn.accessibilityName = Cau Ffenestr Cyflwyniad +bbb.fileupload.title = Ychwanegu Ffeiliau i'ch Cyflwyniad +bbb.fileupload.fileLbl = Dewiswch Ffeil i'w Lwytho i Fyny\: +bbb.fileupload.selectBtn.label = Dewis Ffeil +bbb.fileupload.selectBtn.toolTip = Agor blwch deialog i ddewis ffeil +bbb.fileupload.uploadBtn = Llwytho i fyny +bbb.fileupload.uploadBtn.toolTip = Llwytho i fyny'r ffeil a ddewiswyd +bbb.fileupload.presentationNamesLbl = Cyflwyniadau wedi'u llwytho\: +bbb.fileupload.deleteBtn.toolTip = Dileu'r Cyflwyniad +bbb.fileupload.showBtn = Dangos +bbb.fileupload.showBtn.toolTip = Dangos y Cyflwyniad +bbb.fileupload.okCancelBtn = Cau +bbb.fileupload.okCancelBtn.toolTip = Cau'r blwch deialog Llwytho i Fyny Ffeil +bbb.fileupload.genThumbText = Cynhyrchu mân-luniau. +bbb.fileupload.progBarLbl = Ar y gweill\: +bbb.chat.title = Sgwrs +bbb.chat.quickLink.label = Ffenestr Sgwrsio +bbb.chat.cmpColorPicker.toolTip = Lliw'r Testun +bbb.chat.input.accessibilityName = Maes Golygu Neges Sgwrsio +bbb.chat.sendBtn = Anfon +bbb.chat.sendBtn.toolTip = Anfon Neges +bbb.chat.sendBtn.accessibilityName = Anfon neges sgwrsio +bbb.chat.publicChatUsername = Cyhoeddus +bbb.chat.optionsTabName = Dewisiadau +bbb.chat.privateChatSelect = Dewiswch defnyddiwr i sgwrsio gyda'n breifat +bbb.chat.private.userLeft = Gadawodd y defnyddiwr. +bbb.chat.usersList.toolTip = Dewiswch gyfranogwr i agor sgwrs breifat +bbb.chat.chatOptions = Dewisiadau sgwrsio +bbb.chat.fontSize = Maint Testun Neges Sgwrsio +bbb.chat.cmbFontSize.toolTip = Dweis maint testun neges sgwrsio +bbb.chat.messageList = Blwch Neges +bbb.chat.minimizeBtn.accessibilityName = Lleihau Ffenestr Sgwrsio +bbb.chat.maximizeRestoreBtn.accessibilityName = Ehangu Ffenestr Sgwrsio +bbb.chat.closeBtn.accessibilityName = Cau Ffenestr Sgwrsio +bbb.chat.chatTabs.accessibleNotice = Neges newydd yn y tab +bbb.publishVideo.changeCameraBtn.labelText = Newid Gwegamera +bbb.publishVideo.changeCameraBtn.toolTip = Agor blwch deialog newid gwegamera +bbb.publishVideo.cmbResolution.tooltip = Dewiswch gydraniad gwegamera +bbb.publishVideo.startPublishBtn.labelText = Dechrau Rhannu +bbb.publishVideo.startPublishBtn.toolTip = Dechrau rannu eich gwegamera +bbb.videodock.title = Gewgamerau +bbb.videodock.quickLink.label = Ffenestr Gewgamera +bbb.video.minimizeBtn.accessibilityName = Lleihau Ffenestr Gwegamera +bbb.video.maximizeRestoreBtn.accessibilityName = Ehangu Ffenestr Gewgamera +bbb.video.controls.muteButton.toolTip = Pylu neu datpylu {0} +bbb.video.controls.switchPresenter.toolTip = Gwneud {0} y cyflwynydd +bbb.video.controls.ejectUserBtn.toolTip = Diarddel {0} o'r cyfarfod +bbb.video.controls.privateChatBtn.toolTip = Sgwrsio gyda {0} +bbb.video.publish.hint.noCamera = Dim gwegamera ar gael +bbb.video.publish.hint.cantOpenCamera = Methu agor eich gwegamera +bbb.video.publish.hint.waitingApproval = Aros am gymeradwyaeth +bbb.video.publish.hint.videoPreview = Rhagolwg Gwegamera +bbb.video.publish.hint.openingCamera = Agor gwegamera... +bbb.video.publish.hint.cameraDenied = Gwrthodir mynediad i'r wegamera +bbb.video.publish.hint.cameraIsBeingUsed = Defnyddir y wegamera gan raglen arall +bbb.video.publish.hint.publishing = Cyhoeddi... +bbb.video.publish.closeBtn.accessName = Cau blwch deialog newid gwegamera +bbb.video.publish.closeBtn.label = Diddymu +bbb.video.publish.titleBar = Cyhoeddi Ffenestr Gwegamera +bbb.desktopPublish.title = Rhannu Bwrdd Gwaith\: Rhagolwg Cyflwynydd +bbb.desktopPublish.fullscreen.tooltip = Rhannu fy holl fwrdd gwaith. +bbb.desktopPublish.fullscreen.label = Llenwi'r Sgrin +bbb.desktopPublish.region.tooltip = Rhannu rhan o'm fwrdd gwaith. +bbb.desktopPublish.region.label = Rhanbarth +bbb.desktopPublish.stop.tooltip = Cau rhannu bwrdd gwaith +bbb.desktopPublish.stop.label = Cau +bbb.desktopPublish.maximizeRestoreBtn.toolTip = Ni allwch ehangu'r ffenestr hon. +bbb.desktopPublish.closeBtn.toolTip = Terfynu'r Rhannu a Chau +bbb.desktopPublish.minimizeBtn.toolTip = Lleihau +bbb.desktopPublish.minimizeBtn.accessibilityName = Lleihau'r Ffenestr Cyhoeddi Rhannu Bwrdd Gwaith +bbb.desktopPublish.maximizeRestoreBtn.accessibilityName = Ehangu'r Ffenestr Cyhoeddi Rhannu Bwrdd Gwaith +bbb.desktopPublish.javaRequiredLabel = Angen Java 7u45 (neu'n ddiweddarach) i redeg. +bbb.desktopPublish.javaTestLinkLabel = Gwirio Java +bbb.desktopPublish.javaTestLinkLabel.tooltip = Gwirio Java +bbb.desktopPublish.javaTestLinkLabel.tooltip.accessibility = Gwirio Java +bbb.desktopView.title = Rhannu Bwrdd Gwaith +bbb.desktopView.fitToWindow = Addasu i'r Ffenestr +bbb.desktopView.actualSize = Dangos faint gwirioneddol +bbb.desktopView.minimizeBtn.accessibilityName = Lleihau'r Ffenestr Gweld Rhannu Bwrdd Gwaith +bbb.desktopView.maximizeRestoreBtn.accessibilityName = Ehangu'r Ffenestr Gweld Rhannu Bwrdd Gwaith +bbb.desktopView.closeBtn.accessibilityName = Cau'r Ffenestr Gweld Rhannu Bwrdd Gwaith +bbb.toolbar.phone.toolTip.start = Ymuno â'r Sain +bbb.toolbar.phone.toolTip.stop = Gadael y Sain. +bbb.toolbar.deskshare.toolTip.start = Rhannu Fy Mwrdd Gwaith. +bbb.toolbar.deskshare.toolTip.stop = Terfynu Rhannu Fy Mwrdd Gwaith +bbb.toolbar.video.toolTip.start = Rhannu Fy Ngwegamera +bbb.toolbar.video.toolTip.stop = Terfynu Rhannu Fy Ngwegamera +bbb.layout.addButton.toolTip = Ychwanegu'r addasiad gosodiad i'r rhestr +bbb.layout.combo.toolTip = Newid y gosodiad bresennol +bbb.layout.loadButton.toolTip = Llwytho cynllun sgrin o ffeil +bbb.layout.saveButton.toolTip = Arbed cynllun sgrin i ffeil +bbb.layout.lockButton.toolTip = Terfynu'r gosodiad +bbb.layout.combo.prompt = Cymhwyso gosodiad +bbb.layout.combo.custom = * Addasiad gosodiad +bbb.layout.combo.customName = Addasiad gosodiad +bbb.layout.combo.remote = Anghysbell +bbb.layout.save.complete = Arbedwyd y gosodiadau yn llwyddiannus +bbb.layout.load.complete = Llwythwyd y gosodiadau yn llwyddiannus +bbb.layout.load.failed = Methwyd llwytho'r gosodiadau +bbb.highlighter.toolbar.pencil = Pensil +bbb.highlighter.toolbar.pencil.accessibilityName = Newid cyrchwr bwrdd gwyn i bensil +bbb.highlighter.toolbar.ellipse = Cylch +bbb.highlighter.toolbar.ellipse.accessibilityName = Newid cyrchwr bwrdd gwyn i gylch +bbb.highlighter.toolbar.rectangle = Petryal +bbb.highlighter.toolbar.rectangle.accessibilityName = Newid cyrchwr bwrdd gwyn i betryal +bbb.highlighter.toolbar.panzoom = Tremio a Chwyddo +bbb.highlighter.toolbar.panzoom.accessibilityName = Newid cyrchwr bwrdd gwyn i dremio a chwyddo +bbb.highlighter.toolbar.clear = Dudalen Clir +bbb.highlighter.toolbar.clear.accessibilityName = Clirio'r dudalen bwrdd gwyn +bbb.highlighter.toolbar.undo = Dadwneud Siâp +bbb.highlighter.toolbar.undo.accessibilityName = Dadwneud y siâp bwrdd gwyn diwethaf +bbb.highlighter.toolbar.color = Dewis Lliw +bbb.highlighter.toolbar.color.accessibilityName = Lliw lluniadu'r bwrdd gwyn +bbb.highlighter.toolbar.thickness = Newid Trwch +bbb.highlighter.toolbar.thickness.accessibilityName = Trwch lluniadu'r bwrdd gwyn +bbb.logout.title = Allgofnodwyd +bbb.logout.button.label = Iawn +bbb.logout.appshutdown = Mae'r rhaglen gweinyddu wedi'i gau i lawr +bbb.logout.asyncerror = Digwyddodd Gwall Anghydamseredig +bbb.logout.connectionclosed = Caewyd cysylltiad â'r gweinydd +bbb.logout.connectionfailed = Methwyd cysylltiad â'r gweinydd +bbb.logout.rejected = Gwrthodwyd cysylltiad â'r gweinydd +bbb.logout.invalidapp = Nid yw'r rhaglen red5 yn bodoli +bbb.logout.unknown = Collwyd cysylltiad â'r gweinydd gan eich cleient +bbb.logout.usercommand = Fe allgofnodoch o'r gynhadledd +bbb.logout.confirm.title = Cadarnhau Allgofnodi +bbb.logout.confirm.message = Ydych chi'n sicr eich bod eisiau allgofnodi? +bbb.logout.confirm.yes = Ydw +bbb.logout.confirm.no = Nac ydw +bbb.notes.title = Nodiadau +bbb.notes.cmpColorPicker.toolTip = Lliw'r Testun +bbb.notes.saveBtn = Arbed +bbb.notes.saveBtn.toolTip = Arbed nodiadau +bbb.settings.deskshare.instructions = Dewiswch Ganiatáu ar yr annog sy'n amlygu'i hun i wirio bod rhannu bwrdd gwaith yn gweithio'n iawn i chi +bbb.settings.deskshare.start = Gwirio Rhannu Bwrdd Gwaith +bbb.settings.voice.volume = Gweithgaredd Meicroffon +bbb.settings.java.label = Gwall fersiwn Java +bbb.settings.java.text = Mae gennych Java {0} wedi'i osod, ond mae angen o leiaf fersiwn {1} i defnyddio BigBlueButton yn effeithiol. Bydd y botwm isod yn gosod y fersiwn diweddaraf o Java JRE. +bbb.settings.java.command = Gosodwch Java diweddaraf +bbb.settings.flash.label = Gwall fersiwn Flash +bbb.settings.flash.text = Mae gennych Flash {0} wedi'i osod, ond mae angen o leiaf fersiwn {1} i defnyddio BigBlueButton yn effeithiol. Bydd y botwm isod yn gosod y fersiwn diweddaraf o Adobe Flash. +bbb.settings.flash.command = Gosodwch Flash diweddaraf +bbb.settings.isight.label = Gwall gwegamera iSight +bbb.settings.isight.text = Os oes broblemau gyda'ch gwegamera iSight, yna all fod o ganlyniad i redeg OS X 10.6.5, sy'n adnabyddus am broblem gyda Flash yn cipio fideo o wegamera iSight.\nI gywiro hyn, bydd y ddolen isod yn gosod fersiwn mwy diweddar o Flash, neu ddiweddwch eich Mac i'r fersiwn diweddaraf +bbb.settings.isight.command = Gosodwch Flash 10.2 RC2 +bbb.settings.warning.label = Rhybudd +bbb.settings.warning.close = Cau'r rhybudd hwn +bbb.settings.noissues = Ni ddarganfuwyd materion sydd heb ei ddatrys +bbb.settings.instructions = Derbyniwch yr anogwr Flash sy'n gofyn am ganiatâd gwe-gamera. Os yw'r allbwn yn cyfateb i'r hyn a ddisgwylir, mae eich porwr wedi'i osod yn gywir. Rhestrir materion potensial eraill rhestru isod, archwiliwch hwy i ganfod datrysiadau phosibl. +ltbcustom.bbb.highlighter.toolbar.triangle = Triongl +ltbcustom.bbb.highlighter.toolbar.triangle.accessibilityName = Newid cyrchwr bwrdd gwyn i driongl +ltbcustom.bbb.highlighter.toolbar.line = Llinell +ltbcustom.bbb.highlighter.toolbar.line.accessibilityName = Newid cyrchwr bwrdd gwyn i linell +ltbcustom.bbb.highlighter.toolbar.text = Testun +ltbcustom.bbb.highlighter.toolbar.text.accessibilityName = Newid cyrchwr bwrdd gwyn i destun +ltbcustom.bbb.highlighter.texttoolbar.textColorPicker = Lliw'r Testun +ltbcustom.bbb.highlighter.texttoolbar.textSizeMenu = Maint Ffont + +bbb.accessibility.chat.chatBox.reachedFirst = Fe gyrhaeddwyd y neges gyntaf +bbb.accessibility.chat.chatBox.reachedLatest = Fe gyrhaeddwyd y neges ddiweddaraf +bbb.accessibility.chat.chatBox.navigatedFirst = Fe lywiwyd i'r neges gyntaf +bbb.accessibility.chat.chatBox.navigatedLatest = Fe lywiwyd i'r neges ddiweddaraf +bbb.accessibility.chat.chatBox.navigatedLatestRead = Fe lywiwyd i'r neges ddiweddaraf a ddarllenwyd +bbb.accessibility.chat.chatwindow.input = Mewnbwn sgwrsio + +bbb.accessibility.chat.initialDescription = Defnyddiwch y bysellau saeth i lywio drwy negeseuon sgwrsio. + +bbb.accessibility.notes.notesview.input = Mewnbwn nodiadau + +bbb.shortcuthelp.title = Cymorth Llwybrau Byr +bbb.shortcuthelp.minimizeBtn.accessibilityName = Lleihau ffenestr Cymorth Llwybrau Byr +bbb.shortcuthelp.maximizeRestoreBtn.accessibilityName = Ehangu ffenestr Cymorth Llwybrau Byr +bbb.shortcuthelp.closeBtn.accessibilityName = Cau ffenestr Cymorth Llwybrau Byr +bbb.shortcuthelp.dropdown.general = Llwybrau Byr Cyffredinol +bbb.shortcuthelp.dropdown.presentation = Llwybrau Byr Cyflwyniad +bbb.shortcuthelp.dropdown.chat = Llwybrau Byr Sgwrsio +bbb.shortcuthelp.dropdown.users = Llwybrau Byr Defnyddwyr +bbb.shortcuthelp.dropdown.polling = Llwybrau byr arolwg barn cyflwynwr +bbb.shortcuthelp.dropdown.polling2 = Llwybrau byr arolwg barn gwyliwr +bbb.shortcuthelp.headers.shortcut = Llwybr Byr +bbb.shortcuthelp.headers.function = Ffrwythiant + +bbb.shortcutkey.general.minimize = 189 +bbb.shortcutkey.general.minimize.function = Lleihau ffenestr bresennol +bbb.shortcutkey.general.maximize = 187 +bbb.shortcutkey.general.maximize.function = Ehangu ffenestr bresennol + +bbb.shortcutkey.flash.exit = 81 +bbb.shortcutkey.flash.exit.function = Symud ffocws oddi ar y ffenestr Flash +bbb.shortcutkey.users.muteme = 77 +bbb.shortcutkey.users.muteme.function = Pylu neu Datpylu eich meicroffon +bbb.shortcutkey.chat.chatinput = 73 +bbb.shortcutkey.chat.chatinput.function = Ffocysu'r maes mewnbwn sgwrsio +bbb.shortcutkey.present.focusslide = 67 +bbb.shortcutkey.present.focusslide.function = Ffocysu’r sleid cyflwyniad +bbb.shortcutkey.whiteboard.undo = 90 +bbb.shortcutkey.whiteboard.undo.function = Dadwneud lluniad olaf y bwrdd gwyn + +bbb.shortcutkey.focus.users = 49 +bbb.shortcutkey.focus.users.function = Symud ffocws i'r Ffenestr Defnyddwyr. +bbb.shortcutkey.focus.video = 50 +bbb.shortcutkey.focus.video.function = Symud ffocws i'r Ffenestr Gwegamera +bbb.shortcutkey.focus.presentation = 51 +bbb.shortcutkey.focus.presentation.function = Symud ffocws i'r Ffenestr Cyflwyniad +bbb.shortcutkey.focus.chat = 52 +bbb.shortcutkey.focus.chat.function = Symud ffocws i'r Ffenestr Sgwrsio +bbb.shortcutkey.focus.pollingCreate = 67 +bbb.shortcutkey.focus.pollingCreate.function = Symud ffocws i'r ffenestr Creu Arolwg Barn, os yw ar agor. +bbb.shortcutkey.focus.pollingStats = 83 +bbb.shortcutkey.focus.pollingStats.function = Symud ffocws i'r ffenestr Ystadegau Arolwg Barn, os yw ar agor. +bbb.shortcutkey.focus.voting = 89 +bbb.shortcutkey.focus.voting.function = Symud ffocws i'r ffenestr Pleidleisio, os yw ar agor. + +bbb.shortcutkey.share.desktop = 68 +bbb.shortcutkey.share.desktop.function = Agor ffenestr rhannu bwrdd gwaith +bbb.shortcutkey.share.microphone = 79 +bbb.shortcutkey.share.microphone.function = Agor ffenestr gosodiadau sain +bbb.shortcutkey.share.webcam = 66 +bbb.shortcutkey.share.webcam.function = Agor ffenestr rhannu gwegamera + +bbb.shortcutkey.shortcutWindow = 72 +bbb.shortcutkey.shortcutWindow.function = Agor/ffocysu'r ffenestr cymorth llwybrau byr +bbb.shortcutkey.logout = 76 +bbb.shortcutkey.logout.function = Allgofnodi o'r cyfarfod +bbb.shortcutkey.raiseHand = 82 +bbb.shortcutkey.raiseHand.function = Codi eich llaw + +bbb.shortcutkey.present.upload = 85 +bbb.shortcutkey.present.upload.function = Llwytho i fyny cyflwyniad +bbb.shortcutkey.present.previous = 65 +bbb.shortcutkey.present.previous.function = Symud yn ôl i'r sleid blaenorol +bbb.shortcutkey.present.select = 83 +bbb.shortcutkey.present.select.function = Gweld pob sleid +bbb.shortcutkey.present.next = 69 +bbb.shortcutkey.present.next.function = Symud ymlaen i'r sleid nesaf +bbb.shortcutkey.present.fitWidth = 70 +bbb.shortcutkey.present.fitWidth.function = Addasu'r sleid i'r lled +bbb.shortcutkey.present.fitPage = 80 +bbb.shortcutkey.present.fitPage.function = Addasu'r sleid i'r dudalen + +bbb.shortcutkey.users.makePresenter = 80 +bbb.shortcutkey.users.makePresenter.function = Gwneud y person a ddetholir yn gyflwynydd. +bbb.shortcutkey.users.kick = 75 +bbb.shortcutkey.users.kick.function = Cicio'r person a ddewiswyd o'r cyfarfod +bbb.shortcutkey.users.mute = 83 +bbb.shortcutkey.users.mute.function = Pylu neu datpylu'r person detholedig +bbb.shortcutkey.users.muteall = 65 +bbb.shortcutkey.users.muteall.function = Pylu neu datpylu pob defnyddiwr +bbb.shortcutkey.users.focusUsers = 85 +bbb.shortcutkey.users.focusUsers.function = Ffocysu'r rhestr defnyddwyr +bbb.shortcutkey.users.muteAllButPres = 65 +bbb.shortcutkey.users.muteAllButPres.function = Pylu pawb ac eithrio'r Cyflwynydd + +bbb.shortcutkey.chat.focusTabs = 89 +bbb.shortcutkey.chat.focusTabs.function = Ffocysu'r tabiau sgwrsio +bbb.shortcutkey.chat.focusBox = 66 +bbb.shortcutkey.chat.focusBox.function = Ffocysu'r blwch sgwrsio +bbb.shortcutkey.chat.changeColour = 67 +bbb.shortcutkey.chat.changeColour.function = Ffocysu'r dweissydd lliw ffont. +bbb.shortcutkey.chat.sendMessage = 83 +bbb.shortcutkey.chat.sendMessage.function = Anfon neges sgwrsio +bbb.shortcutkey.chat.explanation = ---- +bbb.shortcutkey.chat.explanation.function = Er mwyn llywio negeseuon, mae'n rhaid ffocysu'r blwch sgwrsio. + +bbb.shortcutkey.chat.chatbox.advance = 40 +bbb.shortcutkey.chat.chatbox.advance.function = Llywio i'r neges nesaf +bbb.shortcutkey.chat.chatbox.goback = 38 +bbb.shortcutkey.chat.chatbox.goback.function = Llywio i'r neges flaenorol +bbb.shortcutkey.chat.chatbox.repeat = 32 +bbb.shortcutkey.chat.chatbox.repeat.function = Ailadrodd y neges bresennol +bbb.shortcutkey.chat.chatbox.golatest = 39 +bbb.shortcutkey.chat.chatbox.golatest.function = Llywio i'r neges ddiweddaraf +bbb.shortcutkey.chat.chatbox.gofirst = 37 +bbb.shortcutkey.chat.chatbox.gofirst.function = Llywio i'r neges gyntaf +bbb.shortcutkey.chat.chatbox.goread = 75 +bbb.shortcutkey.chat.chatbox.goread.function = Llywio i'r neges ddiweddaraf a ddarllenwyd +bbb.shortcutkey.chat.chatbox.debug = 71 +bbb.shortcutkey.chat.chatbox.debug.function = Bysell frys dadfygio dros dro + +bbb.polling.createPoll = Creu Arolwg Barn Newydd +bbb.polling.createPoll.moreThanOneResponse = Caniatáu defnyddwyr i ddewis mwy nag un ateb. +bbb.polling.createPoll.hint = Awgrym\: Dechreuwch bob ateb â llinell newydd +bbb.polling.createPoll.answers = Atebion\: +bbb.polling.createPoll.question = Cwestiwn\: +bbb.polling.createPoll.title = Teitl\: +bbb.polling.createPoll.publishToWeb = Galluogi pleidleisio ar y we + +bbb.polling.pollPreview = Rhagolwg Pleidleisio +bbb.polling.pollPreview.modify = Newid +bbb.polling.pollPreview.publish = Cyhoeddi +bbb.polling.pollPreview.preview = Rhagolwg +bbb.polling.pollPreview.save = Arbed +bbb.polling.pollPreview.cancel = Diddymu +bbb.polling.pollPreview.modify = Newid +bbb.polling.pollPreview.hereIsYourPoll = Dyma eich arolwg barn\: +bbb.polling.pollPreview.ifYouWantChanges = os ydych am wneud unrhyw newidiadau defnyddiwch y botwm 'Newid' +bbb.polling.pollPreview.checkAll = (dewiswch bob ateb sy'n berthnasol) +bbb.polling.pollPreview.pollWillPublishOnline = Mi fydd yr arolwg barn ar gael ar gyfer pleidleisio ar y we. + +bbb.polling.validation.toolongAnswer = Mae'ch atebion yn rhy hir. Uchafswm hyd yw +bbb.polling.validation.toolongQuestion = Cwestiwn yn rhy hir. Uchafswm hyd\: +bbb.polling.validation.toolongTitle = Teitl yn rhy hir, Uchafswm\: +bbb.polling.validation.noQuestion = Rhowch Cwestiwn +bbb.polling.validation.noTitle = Rhowch Teitl +bbb.polling.validation.toomuchAnswers = Mae gennych ormod o atebion. Caniateir dim mwy na\: +bbb.polling.validation.eachNewLine = Darparwch o leiaf 2 Ateb. Dechreuwch bob un â llinell newydd +bbb.polling.validation.answerUnique = Dylai pob ateb fod yn unigryw +bbb.polling.validation.atLeast2Answers = Darparwch o leiaf 2 Ateb +bbb.polling.validation.duplicateTitle = Mae'r arolwg barn eisoes yn bodoli + +bbb.polling.pollView.vote = Cyflwyno +bbb.polling.toolbar.toolTip = Pleidleisio + +bbb.polling.stats.repost = Ailgyhoeddi +bbb.polling.stats.close = Cau +bbb.polling.stats.didNotVote = Ni Phleidleisiodd +bbb.polling.stats.refresh = Adnewyddu +bbb.polling.stats.stopPoll = Terfynu Pleidleisio +bbb.polling.stats.webPollURL = Mae'r arolwg barn ar gael yma\: +bbb.polling.stats.answer = Atebion +bbb.polling.stats.votes = Pleidleisiau +bbb.polling.stats.percentage = % O Bleidleisiau + +bbb.polling.webPollClosed = Caewyd pleidleisio ar y we. +bbb.polling.pollClosed = Caewyd pleidleisio\! Mae'r canlyniadau yn + +bbb.polling.vote.error.radio = Dewiswch un opsiwn, neu gau'r ffenestr hon i ymatal pleidleisio. +bbb.polling.vote.error.check = Dewiswch un neu fwy o opsiynau, neu gau'r ffenestr hon i ymatal pleidleisio. + +bbb.publishVideo.startPublishBtn.labelText = Dechrau Rhannu +bbb.publishVideo.changeCameraBtn.labelText = Newid Gwegamera + +bbb.accessibility.alerts.madePresenter = Chi bellach yw'r Cyflwynwr. +bbb.accessibility.alerts.madeViewer = Rydych bellach yn Wyliwr. + +bbb.shortcutkey.polling.buttonClick = 80 +bbb.shortcutkey.polling.buttonClick.function = Agor y Ddewislen Pleidleisio +bbb.shortcutkey.polling.focusTitle = 67 +bbb.shortcutkey.polling.focusTitle.function = Ffocysu'r blwch mewnbwn Teitl. +bbb.shortcutkey.polling.focusQuestion = 81 +bbb.shortcutkey.polling.focusQuestion.function = Ffocysu'r blwch mewnbwn Cwestiwn. +bbb.shortcutkey.polling.focusAnswers = 65 +bbb.shortcutkey.polling.focusAnswers.function = Ffocysu'r blwch mewnbwn Atebion. +bbb.shortcutkey.polling.focusMultipleCB = 77 +bbb.shortcutkey.polling.focusMultipleCB.function = Ffocysu'r blwch ticio "Caniatáu sawl dewisiad". +bbb.shortcutkey.polling.focusWebPollCB = 66 +bbb.shortcutkey.polling.focusWebPollCB.function = Ffocysu'r blwch ticio "Galluogi pleidleisio ar y we". +bbb.shortcutkey.polling.previewClick = 80 +bbb.shortcutkey.polling.previewClick.function = Rhagolygu eich etholiad a symud ymlaen. +bbb.shortcutkey.polling.cancelClick = 88 +bbb.shortcutkey.polling.cancelClick.function = Diddymu a gadael creu Arolwg Barn. +bbb.shortcutkey.polling.modify = 69 +bbb.shortcutkey.polling.modify.function = Mynd yn ôl i addasu'r arolwg barn. +bbb.shortcutkey.polling.publish = 85 +bbb.shortcutkey.polling.publish.function = Cyhoeddi'r arolwg barn a chaniatáu pleidleisio. +bbb.shortcutkey.polling.save = 83 +bbb.shortcutkey.polling.save.function = Arbed yr arolwg barn i'w ddefnyddio nes ymlaen. + +bbb.shortcutkey.pollStats.explanation = ---- +bbb.shortcutkey.pollStats.explanation.function = Mae canlyniadau arolwg barn dim ond ar gael ar ôl cyhoeddi. +bbb.shortcutkey.polling.focusData = 68 +bbb.shortcutkey.polling.focusData.function = Ffocysu'r canlyniadau arolwg barn. +bbb.shortcutkey.polling.refresh = 82 +bbb.shortcutkey.polling.refresh.function = Adnewyddu canlyniad arolwg barn. +bbb.shortcutkey.polling.focusWebPoll = 73 +bbb.shortcutkey.polling.focusWebPoll.function = Ffocysu'r blwch URL arolwg barn ar y we. +bbb.shortcutkey.polling.stopPoll = 79 +bbb.shortcutkey.polling.stopPoll.function = Atal yr arolwg barn a therfynu pleidleisio. +bbb.shortcutkey.polling.repostPoll = 80 +bbb.shortcutkey.polling.repostPoll.function = Ailgyhoeddi'r arolwg barn. +bbb.shortcutkey.polling.closeStatsWindow = 88 +bbb.shortcutkey.polling.closeStatsWindow.function = Cau'r ffenestr Canlyniadau Pleidleisio. + +bbb.shortcutkey.polling.vote = 86 +bbb.shortcutkey.polling.vote.function = Bwrw eich pleidlais ar gyfer yr opsiynau a ddewiswyd. +bbb.shortcutkey.polling.focusVoteQuestion = 81 +bbb.shortcutkey.polling.focusVoteQuestion.function = Ffocysu'r cwestiwn. + +bbb.shortcutkey.specialKeys.space = Bylchwyr +bbb.shortcutkey.specialKeys.left = Saeth i'r Chwith +bbb.shortcutkey.specialKeys.right = Saeth i'r Dde +bbb.shortcutkey.specialKeys.up = Saeth i Fyny +bbb.shortcutkey.specialKeys.down = Saeth i Lawr +bbb.shortcutkey.specialKeys.plus = Mwy +bbb.shortcutkey.specialKeys.minus = Llai diff --git a/bigbluebutton-client/locale/da_DK/bbbResources.properties b/bigbluebutton-client/locale/da_DK/bbbResources.properties index a229b86038..cdd0cf600f 100644 --- a/bigbluebutton-client/locale/da_DK/bbbResources.properties +++ b/bigbluebutton-client/locale/da_DK/bbbResources.properties @@ -181,7 +181,10 @@ bbb.desktopPublish.closeBtn.toolTip = Stop deling og luk dette vindue. bbb.desktopPublish.minimizeBtn.toolTip = Minimer dette vindue # bbb.desktopPublish.minimizeBtn.accessibilityName = Minimize the Desktop Sharing Publish Window # bbb.desktopPublish.maximizeRestoreBtn.accessibilityName = Maximize the Desktop Sharing Publish Window -# bbb.desktopPublish.closeBtn.accessibilityName = Stop Sharing and Close the Desktop Sharing Publish Window +# bbb.desktopPublish.javaRequiredLabel = Requires Java 7u45 (or later) to run. +# bbb.desktopPublish.javaTestLinkLabel = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip.accessibility = Test Java bbb.desktopView.title = Del skrivebord bbb.desktopView.fitToWindow = Tilpas til vindue bbb.desktopView.actualSize = Vis faktiske størrelse diff --git a/bigbluebutton-client/locale/de_DE/bbbResources.properties b/bigbluebutton-client/locale/de_DE/bbbResources.properties index a932b0d814..d545bdd4f5 100644 --- a/bigbluebutton-client/locale/de_DE/bbbResources.properties +++ b/bigbluebutton-client/locale/de_DE/bbbResources.properties @@ -181,7 +181,10 @@ bbb.desktopPublish.closeBtn.toolTip = Teilen beenden und Fenster schließen. bbb.desktopPublish.minimizeBtn.toolTip = Fenster minimieren. bbb.desktopPublish.minimizeBtn.accessibilityName = Desktop Freigabe minimieren bbb.desktopPublish.maximizeRestoreBtn.accessibilityName = Desktop Freigabe maximieren -bbb.desktopPublish.closeBtn.accessibilityName = Desktop Freigabe beenden und schließen +# bbb.desktopPublish.javaRequiredLabel = Requires Java 7u45 (or later) to run. +# bbb.desktopPublish.javaTestLinkLabel = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip.accessibility = Test Java bbb.desktopView.title = Desktop Sharing bbb.desktopView.fitToWindow = An Fenstergröße anpassen bbb.desktopView.actualSize = Tatsächliche Größe anzeigen diff --git a/bigbluebutton-client/locale/el_GR/bbbResources.properties b/bigbluebutton-client/locale/el_GR/bbbResources.properties index b8cecc1db4..f0a432e355 100644 --- a/bigbluebutton-client/locale/el_GR/bbbResources.properties +++ b/bigbluebutton-client/locale/el_GR/bbbResources.properties @@ -181,7 +181,10 @@ bbb.desktopPublish.closeBtn.toolTip = Διακοπή διαμοιρασμού κ bbb.desktopPublish.minimizeBtn.toolTip = Ελαχιστοποίηση bbb.desktopPublish.minimizeBtn.accessibilityName = Ελαχιστοποίηση του παραθύρου διαμοιρασμού επιφάνειας εργασίας bbb.desktopPublish.maximizeRestoreBtn.accessibilityName = Μεγιστοποίηση του παραθύρου διαμοιρασμού επιφάνειας εργασίας -bbb.desktopPublish.closeBtn.accessibilityName = Κλείσιμο διαμοιρασμού και παραθύρου διαμοιρασμού επιφάνειας εργασίας +# bbb.desktopPublish.javaRequiredLabel = Requires Java 7u45 (or later) to run. +# bbb.desktopPublish.javaTestLinkLabel = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip.accessibility = Test Java bbb.desktopView.title = Διαμοιρασμός επιφάνειας εργασίας bbb.desktopView.fitToWindow = Προσαρμογή στο παράθυρο bbb.desktopView.actualSize = Προβολή πραγματικού μεγέθους diff --git a/bigbluebutton-client/locale/en_US/bbbResources.properties b/bigbluebutton-client/locale/en_US/bbbResources.properties index 7a68b7d56f..93f79d98fa 100755 --- a/bigbluebutton-client/locale/en_US/bbbResources.properties +++ b/bigbluebutton-client/locale/en_US/bbbResources.properties @@ -29,6 +29,13 @@ bbb.mainToolbar.settingsBtn = Settings bbb.mainToolbar.settingsBtn.toolTip = Open Settings bbb.mainToolbar.shortcutBtn = Shortcut Help bbb.mainToolbar.shortcutBtn.toolTip = Open Shortcut Help window +bbb.mainToolbar.recordBtn.toolTip.start = Start recording +bbb.mainToolbar.recordBtn.toolTip.stop = Stop recording +bbb.mainToolbar.recordBtn.toolTip.recording = The session is being recorded +bbb.mainToolbar.recordBtn.toolTip.notRecording = The session isn't being recorded +bbb.mainToolbar.recordBtn.confirm.title = Confirm recording +bbb.mainToolbar.recordBtn.confirm.message.start = Are you sure you want to start recording the session? +bbb.mainToolbar.recordBtn.confirm.message.stop = Are you sure you want to stop recording the session? bbb.window.minimizeBtn.toolTip = Minimize bbb.window.maximizeRestoreBtn.toolTip = Maximize bbb.window.closeBtn.toolTip = Close @@ -70,8 +77,8 @@ bbb.users.usersGrid.mediaItemRenderer.webcam = Sharing Webcam bbb.users.usersGrid.mediaItemRenderer.webcamBtn = View webcam bbb.users.usersGrid.mediaItemRenderer.pushToTalk = Unmute {0} bbb.users.usersGrid.mediaItemRenderer.pushToMute = Mute {0} -bbb.users.usersGrid.mediaItemRenderer.pushToLock = Lock {0}'s mic -bbb.users.usersGrid.mediaItemRenderer.pushToUnlock = Unlock {0}'s mic +bbb.users.usersGrid.mediaItemRenderer.pushToLock = Lock {0} +bbb.users.usersGrid.mediaItemRenderer.pushToUnlock = Unlock {0} bbb.users.usersGrid.mediaItemRenderer.kickUser = Kick {0} bbb.users.usersGrid.mediaItemRenderer.webcam = Webcam shared bbb.users.usersGrid.mediaItemRenderer.micOff = Microphone off @@ -132,6 +139,7 @@ bbb.chat.input.accessibilityName = Chat Message Editing Field bbb.chat.sendBtn = Send bbb.chat.sendBtn.toolTip = Send Message bbb.chat.sendBtn.accessibilityName = Send chat message +bbb.chat.contextmenu.copyalltext = Copy All Text bbb.chat.publicChatUsername = Public bbb.chat.optionsTabName = Options bbb.chat.privateChatSelect = Select a person to chat with privately @@ -181,7 +189,10 @@ bbb.desktopPublish.closeBtn.toolTip = Stop Sharing and Close bbb.desktopPublish.minimizeBtn.toolTip = Minimize bbb.desktopPublish.minimizeBtn.accessibilityName = Minimize the Desktop Sharing Publish Window bbb.desktopPublish.maximizeRestoreBtn.accessibilityName = Maximize the Desktop Sharing Publish Window -bbb.desktopPublish.closeBtn.accessibilityName = Stop Sharing and Close the Desktop Sharing Publish Window +bbb.desktopPublish.javaRequiredLabel = Requires Java 7u45 (or later) to run. +bbb.desktopPublish.javaTestLinkLabel = Test Java +bbb.desktopPublish.javaTestLinkLabel.tooltip = Test Java +bbb.desktopPublish.javaTestLinkLabel.tooltip.accessibility = Test Java bbb.desktopView.title = Desktop Sharing bbb.desktopView.fitToWindow = Fit to Window bbb.desktopView.actualSize = Display actual size @@ -472,3 +483,25 @@ bbb.shortcutkey.specialKeys.up = Up Arrow bbb.shortcutkey.specialKeys.down = Down Arrow bbb.shortcutkey.specialKeys.plus = Plus bbb.shortcutkey.specialKeys.minus = Minus + +bbb.toolbar.videodock.toolTip.closeAllVideos = Close all videos +bbb.users.settings.lockAll=Lock All Users +bbb.users.settings.lockAllExcept=Lock Users Except Presenter +bbb.users.settings.lockSettings=Lock Settings... +bbb.users.settings.unlockAll=Unlock All Users +bbb.users.settings.roomIsLocked=Locked by default +bbb.users.settings.roomIsMuted=Muted by default + +bbb.lockSettings.save = Save +bbb.lockSettings.save.tooltip = Save and apply these configurations +bbb.lockSettings.cancel = Cancel +bbb.lockSettings.cancel.toolTip = Close this window without saving + +bbb.lockSettings.moderatorLocking = Moderator locking +bbb.lockSettings.privateChat = Private Chat +bbb.lockSettings.publicChat = Public Chat +bbb.lockSettings.webcam = Webcam +bbb.lockSettings.microphone = Microphone +bbb.lockSettings.title=Lock Settings +bbb.lockSettings.feature=Feature +bbb.lockSettings.enabled=Enabled diff --git a/bigbluebutton-client/locale/es_ES/bbbResources.properties b/bigbluebutton-client/locale/es_ES/bbbResources.properties index b318098e2c..0bc090f58c 100644 --- a/bigbluebutton-client/locale/es_ES/bbbResources.properties +++ b/bigbluebutton-client/locale/es_ES/bbbResources.properties @@ -181,7 +181,10 @@ bbb.desktopPublish.closeBtn.toolTip = Detener la compartición y cerrar esta ven bbb.desktopPublish.minimizeBtn.toolTip = Minimizar esta ventana. bbb.desktopPublish.minimizeBtn.accessibilityName = Minimizar la ventana de iniciar el compartir escritorio bbb.desktopPublish.maximizeRestoreBtn.accessibilityName = Maximizar la ventana de iniciar el compartir escritorio -bbb.desktopPublish.closeBtn.accessibilityName = Cancelar y Cerrar la Ventana de Compartir Escritorio +# bbb.desktopPublish.javaRequiredLabel = Requires Java 7u45 (or later) to run. +# bbb.desktopPublish.javaTestLinkLabel = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip.accessibility = Test Java bbb.desktopView.title = Compartición de pantalla bbb.desktopView.fitToWindow = Ajustar a la ventana bbb.desktopView.actualSize = Mostrar tamaño actual diff --git a/bigbluebutton-client/locale/et_EE/bbbResources.properties b/bigbluebutton-client/locale/et_EE/bbbResources.properties index c6bef35cc0..fbf93adbb3 100644 --- a/bigbluebutton-client/locale/et_EE/bbbResources.properties +++ b/bigbluebutton-client/locale/et_EE/bbbResources.properties @@ -181,7 +181,10 @@ bbb.desktopPublish.closeBtn.toolTip = Lõpeta jagamine ja sulge bbb.desktopPublish.minimizeBtn.toolTip = Minimeeri bbb.desktopPublish.minimizeBtn.accessibilityName = Minimeeri töölaua jagamise aken bbb.desktopPublish.maximizeRestoreBtn.accessibilityName = Maksimeeri töölaua jagamise aken -bbb.desktopPublish.closeBtn.accessibilityName = Lõpeta jagamine ja sulge töölaua jagamise aken +# bbb.desktopPublish.javaRequiredLabel = Requires Java 7u45 (or later) to run. +# bbb.desktopPublish.javaTestLinkLabel = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip.accessibility = Test Java bbb.desktopView.title = Töölaua jagamine bbb.desktopView.fitToWindow = Sobita aknasse bbb.desktopView.actualSize = Näita tegelikus suuruses diff --git a/bigbluebutton-client/locale/eu_ES/bbbResources.properties b/bigbluebutton-client/locale/eu_ES/bbbResources.properties index 4f2295ad2e..aa93ff54c5 100644 --- a/bigbluebutton-client/locale/eu_ES/bbbResources.properties +++ b/bigbluebutton-client/locale/eu_ES/bbbResources.properties @@ -181,7 +181,10 @@ bbb.desktopPublish.closeBtn.toolTip = Eten partekatzea eta itxi bbb.desktopPublish.minimizeBtn.toolTip = Txikitu bbb.desktopPublish.minimizeBtn.accessibilityName = Txikitu mahaigaina partekatzeko leihoa bbb.desktopPublish.maximizeRestoreBtn.accessibilityName = Handitu mahaigaina partekatzeko leihoa -bbb.desktopPublish.closeBtn.accessibilityName = Eten partekatzea eta itxi mahaigaina partekatzeko leihoa +# bbb.desktopPublish.javaRequiredLabel = Requires Java 7u45 (or later) to run. +# bbb.desktopPublish.javaTestLinkLabel = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip.accessibility = Test Java bbb.desktopView.title = Mahaigaina partekatzen bbb.desktopView.fitToWindow = Doitu leihoan bbb.desktopView.actualSize = Erakutsi oraingo tamaina diff --git a/bigbluebutton-client/locale/fa_IR/bbbResources.properties b/bigbluebutton-client/locale/fa_IR/bbbResources.properties index c0029d6a95..72c294cc17 100644 --- a/bigbluebutton-client/locale/fa_IR/bbbResources.properties +++ b/bigbluebutton-client/locale/fa_IR/bbbResources.properties @@ -2,7 +2,7 @@ bbb.mainshell.locale.version = 0.8 bbb.mainshell.statusProgress.connecting = در حال اتصال به سرور bbb.mainshell.statusProgress.loading = در حال بارگزاری {0} ماژول bbb.mainshell.statusProgress.cannotConnectServer = متاسفانه، امکان اتصال به سرور وجود ندارد. -# bbb.mainshell.copyrightLabel2 = (c) 2013 BigBlueButton Inc. [build {0}] - For more information visit http\://www.bigbluebutton.org +bbb.mainshell.copyrightLabel2 = (c) 2013 BigBlueButton Inc. [build {0}] - برای اطلاعات بیشتر به آدرس http\://www.bigbluebutton.org مراجعه کنید. bbb.mainshell.logBtn.toolTip = مشاهده ی پنجره ی ثبت وقایع bbb.mainshell.resetLayoutBtn.toolTip = بازگشت به طرح بندی پیش فرض bbb.oldlocalewindow.reminder1 = ممکن است ترجمه ی مربوط به زبان بیگ بلو باتن شما قدیمی باشد. @@ -100,8 +100,8 @@ bbb.presentation.error.convert.maxnbpagereach = خطا\: تعداد صفحات bbb.presentation.converted = تبدیل {0} از {1} اسلاید bbb.presentation.ok = تایید bbb.presentation.slider = سطح بزرگنمایی ارائه -# bbb.presentation.slideloader.starttext = Slide text start -# bbb.presentation.slideloader.endtext = Slide text end +bbb.presentation.slideloader.starttext = شروع متن اسلاید +bbb.presentation.slideloader.endtext = اتمام متن اسلاید bbb.presentation.uploadwindow.presentationfile = فایل ارائه bbb.presentation.uploadwindow.pdf = پی.دی.اف bbb.presentation.uploadwindow.word = ورد @@ -181,7 +181,10 @@ bbb.desktopPublish.closeBtn.toolTip = توقف اشتراک گذاری و خرو bbb.desktopPublish.minimizeBtn.toolTip = کمینه کردن bbb.desktopPublish.minimizeBtn.accessibilityName = کمینه کردن پنجره نمایش اشتراک صفحه bbb.desktopPublish.maximizeRestoreBtn.accessibilityName = بیشینه کردن پنجره نمایش اشتراک صفحه -bbb.desktopPublish.closeBtn.accessibilityName = توقف اشتراک گذاری و بستن پنجره نمایش اشتراک صفحه +bbb.desktopPublish.javaRequiredLabel = برای اجرا نیاز به نسخه 7u45 (یا بالاتر) می باشد +bbb.desktopPublish.javaTestLinkLabel = آزمایش جاوا +bbb.desktopPublish.javaTestLinkLabel.tooltip = آزمایش جاوا +bbb.desktopPublish.javaTestLinkLabel.tooltip.accessibility = آزمایش جاوا bbb.desktopView.title = اشتراک میز کار bbb.desktopView.fitToWindow = بسط به اندازه ي تمام پنجره bbb.desktopView.actualSize = نمایش اندازه واقعی @@ -222,7 +225,7 @@ bbb.highlighter.toolbar.color = انتخاب رنگ bbb.highlighter.toolbar.color.accessibilityName = رنگ اشاره گر ترسیم در تخته سفید bbb.highlighter.toolbar.thickness = تغییر ضخامت bbb.highlighter.toolbar.thickness.accessibilityName = ضخامت اشاره گر ترسیم در تخته سفید -# bbb.logout.title = Logged Out +bbb.logout.title = خارج شدید bbb.logout.button.label = تایید bbb.logout.appshutdown = برنامه ی سرور خاموش شده است bbb.logout.asyncerror = رخداد یک خطای Async @@ -365,7 +368,7 @@ bbb.shortcutkey.chat.focusTabs.function = فعال سازی زبانه های چ bbb.shortcutkey.chat.focusBox = 66 bbb.shortcutkey.chat.focusBox.function = فعال سازی جعبه گفتگوی متنی bbb.shortcutkey.chat.changeColour = 67 -# bbb.shortcutkey.chat.changeColour.function = Focus to font color picker. +bbb.shortcutkey.chat.changeColour.function = فعال کردن فونت انتخاب کننده رنگ bbb.shortcutkey.chat.sendMessage = 83 bbb.shortcutkey.chat.sendMessage.function = ارسال پیام متنی bbb.shortcutkey.chat.explanation = ---- @@ -451,7 +454,7 @@ bbb.shortcutkey.polling.focusQuestion.function = فعال سازی جعبه ور bbb.shortcutkey.polling.focusAnswers = 65 bbb.shortcutkey.polling.focusAnswers.function = فعال سازی جعبه ورودی پاسخ ها bbb.shortcutkey.polling.focusMultipleCB = 77 -# bbb.shortcutkey.polling.focusMultipleCB.function = Focus to "Allow multiple selections" checkbox. +bbb.shortcutkey.polling.focusMultipleCB.function = فعال کردن جعبه انتخاب "امکان انتخاب چندین گزینه" bbb.shortcutkey.polling.focusWebPollCB = 66 bbb.shortcutkey.polling.focusWebPollCB.function = فعال سازی چک باکس "قعال سازی نظرسنجی انلاین" bbb.shortcutkey.polling.previewClick = 80 diff --git a/bigbluebutton-client/locale/fi_FI/bbbResources.properties b/bigbluebutton-client/locale/fi_FI/bbbResources.properties index c388de0b09..0ecae9950b 100644 --- a/bigbluebutton-client/locale/fi_FI/bbbResources.properties +++ b/bigbluebutton-client/locale/fi_FI/bbbResources.properties @@ -181,7 +181,10 @@ bbb.desktopPublish.closeBtn.toolTip = Lopeta jakaminen ja sulje bbb.desktopPublish.minimizeBtn.toolTip = Pienennä bbb.desktopPublish.minimizeBtn.accessibilityName = Pienennä työpöydän jako ikkuna bbb.desktopPublish.maximizeRestoreBtn.accessibilityName = Suurenna työpöydän jako ikkuna -bbb.desktopPublish.closeBtn.accessibilityName = Lopeta jakaminen ja sulje työpöydän jako ikkuna +# bbb.desktopPublish.javaRequiredLabel = Requires Java 7u45 (or later) to run. +# bbb.desktopPublish.javaTestLinkLabel = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip.accessibility = Test Java bbb.desktopView.title = Työpöydän jako bbb.desktopView.fitToWindow = Sovita ikkunaan bbb.desktopView.actualSize = Näytä oikea koko diff --git a/bigbluebutton-client/locale/fr_CA/bbbResources.properties b/bigbluebutton-client/locale/fr_CA/bbbResources.properties index 824f467a90..75385d28aa 100644 --- a/bigbluebutton-client/locale/fr_CA/bbbResources.properties +++ b/bigbluebutton-client/locale/fr_CA/bbbResources.properties @@ -181,7 +181,10 @@ bbb.desktopPublish.closeBtn.toolTip = Arrêter de partager et fermer bbb.desktopPublish.minimizeBtn.toolTip = Réduire bbb.desktopPublish.minimizeBtn.accessibilityName = Réduire le module de partage d'écran bbb.desktopPublish.maximizeRestoreBtn.accessibilityName = Agrandir le module de partage d'écran -bbb.desktopPublish.closeBtn.accessibilityName = Arrêter de partager et fermer le module de partage d'écran +bbb.desktopPublish.javaRequiredLabel = Nécessite Java 7u45 (ou version ultérieure) pour fonctionner. +bbb.desktopPublish.javaTestLinkLabel = Testez Java +bbb.desktopPublish.javaTestLinkLabel.tooltip = Testez Java +bbb.desktopPublish.javaTestLinkLabel.tooltip.accessibility = Testez Java bbb.desktopView.title = Partage d'écran bbb.desktopView.fitToWindow = Adapter la taille à la fenêtre bbb.desktopView.actualSize = Afficher à la taille normale @@ -222,7 +225,7 @@ bbb.highlighter.toolbar.color = Selectionner une couleur bbb.highlighter.toolbar.color.accessibilityName = Couleur de la marque bbb.highlighter.toolbar.thickness = Changer l'épaisseur bbb.highlighter.toolbar.thickness.accessibilityName = Épaisseur du trait -# bbb.logout.title = Logged Out +bbb.logout.title = Déconnecté bbb.logout.button.label = OK bbb.logout.appshutdown = L'application serveur a été arrêté bbb.logout.asyncerror = Un erreur de synchronisation est survenu diff --git a/bigbluebutton-client/locale/fr_FR/bbbResources.properties b/bigbluebutton-client/locale/fr_FR/bbbResources.properties index 2608f60ed7..15c9731188 100644 --- a/bigbluebutton-client/locale/fr_FR/bbbResources.properties +++ b/bigbluebutton-client/locale/fr_FR/bbbResources.properties @@ -7,13 +7,13 @@ bbb.mainshell.logBtn.toolTip = Ouvrir la fenêtre de log bbb.mainshell.resetLayoutBtn.toolTip = Disposition par défaut bbb.oldlocalewindow.reminder1 = Vous avez probablement de vieux fichiers de traduction pour BigBlueButton. bbb.oldlocalewindow.reminder2 = Veuillez effacer le cache de votre navigateur web et essayer de nouveau. -bbb.oldlocalewindow.windowTitle = Avertissement\: Les traductions ne sont pas à jour +bbb.oldlocalewindow.windowTitle = Avertissement \: Les traductions ne sont pas à jour bbb.micSettings.speakers.header = Tester les haut-parleurs bbb.micSettings.microphone.header = Tester le microphone bbb.micSettings.playSound = Tester les haut-parleurs bbb.micSettings.playSound.toolTip = Faites jouer de la musique pour tester vos haut-parleurs bbb.micSettings.hearFromHeadset = Vous devriez entendre le son dans vos écouteurs et non dans les haut-parleurs. -bbb.micSettings.speakIntoMic = Tester ou changer votre microphone ( des écouteurs sont recommandé ). +bbb.micSettings.speakIntoMic = Tester ou changer votre microphone (des écouteurs sont recommandés). bbb.micSettings.changeMic = Tester ou changer votre microphone bbb.micSettings.changeMic.toolTip = Ouvrir la fenêtre de paramètres de micro pour Flash Player bbb.micSettings.join = Rejoindre l'audio @@ -38,8 +38,8 @@ bbb.chat.titleBar = Barre de titre de la fenêtre discussion bbb.users.title = Utilisateurs{0} {1} bbb.users.titleBar = Barre de titre de la fenêtre utilisateurs bbb.users.quickLink.label = Fenêtre utilisateurs -bbb.users.minimizeBtn.accessibilityName = Réduire la fenêtre d'utilisateurs -bbb.users.maximizeRestoreBtn.accessibilityName = Agrandir la fenêtre d'utilisateurs +bbb.users.minimizeBtn.accessibilityName = Réduire la fenêtre utilisateurs +bbb.users.maximizeRestoreBtn.accessibilityName = Agrandir la fenêtre utilisateurs bbb.users.settings.buttonTooltip = Paramètres bbb.users.settings.audioSettings = Paramètres audio bbb.users.settings.webcamSettings = Paramètres de la webcam @@ -54,7 +54,7 @@ bbb.users.muteMeBtnTxt.talk = Activer bbb.users.muteMeBtnTxt.mute = Assourdir bbb.users.muteMeBtnTxt.muted = Assourdir bbb.users.muteMeBtnTxt.unmuted = Sourdine désactivée -bbb.users.usersGrid.accessibilityName = Listes d'utilisateurs. Utilisez les flèches pour naviguer. +bbb.users.usersGrid.accessibilityName = Liste d'utilisateurs. Utilisez les flèches pour naviguer. bbb.users.usersGrid.nameItemRenderer = Nom bbb.users.usersGrid.nameItemRenderer.youIdentifier = vous bbb.users.usersGrid.statusItemRenderer = Statut @@ -72,13 +72,13 @@ bbb.users.usersGrid.mediaItemRenderer.pushToTalk = Désactiver la sourdine pour bbb.users.usersGrid.mediaItemRenderer.pushToMute = Activer la sourdine pour {0} bbb.users.usersGrid.mediaItemRenderer.pushToLock = Verrouiller le microphone de {0} bbb.users.usersGrid.mediaItemRenderer.pushToUnlock = Déverrouiller le microphone de {0} -bbb.users.usersGrid.mediaItemRenderer.kickUser = Bannir {0} +bbb.users.usersGrid.mediaItemRenderer.kickUser = Éjecter {0} bbb.users.usersGrid.mediaItemRenderer.webcam = Partager la webcam -bbb.users.usersGrid.mediaItemRenderer.micOff = Microphone fermé -bbb.users.usersGrid.mediaItemRenderer.micOn = Microphone ouvert +bbb.users.usersGrid.mediaItemRenderer.micOff = Microphone actif +bbb.users.usersGrid.mediaItemRenderer.micOn = Microphone inactif bbb.users.usersGrid.mediaItemRenderer.noAudio = Vous n'êtes pas en conférence audio bbb.presentation.title = Présentation -bbb.presentation.titleWithPres = Présentation\: {0} +bbb.presentation.titleWithPres = Présentation \: {0} bbb.presentation.quickLink.label = Fenêtre présentation bbb.presentation.fitToWidth.toolTip = Ajuster la présentation à la largeur bbb.presentation.fitToPage.toolTip = Ajuster la présentation à la page @@ -86,17 +86,17 @@ bbb.presentation.uploadPresBtn.toolTip = Ouvrir la fenêtre d'envoi de fichier d bbb.presentation.backBtn.toolTip = Diapositive précédente bbb.presentation.btnSlideNum.toolTip = Sélectionner une diapositive bbb.presentation.forwardBtn.toolTip = Diapositive suivante -bbb.presentation.maxUploadFileExceededAlert = Erreur\: Le fichier est plus gros que ce qu'il est permit. +bbb.presentation.maxUploadFileExceededAlert = Erreur \: Le fichier dépasse la taille autorisée. bbb.presentation.uploadcomplete = Envoi terminé. Merci de patienter pendant la conversion du fichier. bbb.presentation.uploaded = envoyé. bbb.presentation.document.supported = Le document envoyé est compatible. Conversion en cours... bbb.presentation.document.converted = Conversion du fichier office réussie. -bbb.presentation.error.document.convert.failed = Erreur\: Échec lors de la conversion du fichier. -bbb.presentation.error.io = Erreur E/S\: Veuillez contacter l'administrateur. +bbb.presentation.error.document.convert.failed = Erreur \: Échec lors de la conversion du fichier. +bbb.presentation.error.io = Erreur E/S \: Veuillez contacter l'administrateur. bbb.presentation.error.security = Erreur de sécurité\: Veuillez contacter l'administrateur. bbb.presentation.error.convert.notsupported = Erreur\: Le format de fichier envoyé n'est pas supporté. Merci d'envoyer un fichier compatible. -bbb.presentation.error.convert.nbpage = Erreur\: Échec lors du calcul du nombre de pages du fichier envoyé. -bbb.presentation.error.convert.maxnbpagereach = Erreur\: Le fichier envoyé contient trop de pages. +bbb.presentation.error.convert.nbpage = Erreur \: Échec lors du calcul du nombre de pages du fichier déposé. +bbb.presentation.error.convert.maxnbpagereach = Erreur \: Le fichier envoyé contient trop de pages. bbb.presentation.converted = {0} page(s) sur {1} convertie(s). bbb.presentation.ok = OK bbb.presentation.slider = Niveau de zoom de la présentation @@ -112,19 +112,19 @@ bbb.presentation.minimizeBtn.accessibilityName = Réduire la fenêtre de présen bbb.presentation.maximizeRestoreBtn.accessibilityName = Agrandir la fenêtre de présentation bbb.presentation.closeBtn.accessibilityName = Fermer la fenêtre de présentation bbb.fileupload.title = Envoyer un fichier à présenter -bbb.fileupload.fileLbl = Choisissez le fichier à envoyer\: +bbb.fileupload.fileLbl = Choisissez le fichier à envoyer \: bbb.fileupload.selectBtn.label = Sélectionner le fichier bbb.fileupload.selectBtn.toolTip = Ouvrir une boîte de dialogue pour sélectionner un fichier bbb.fileupload.uploadBtn = Envoyer bbb.fileupload.uploadBtn.toolTip = Envoyer le fichier sélectionné -bbb.fileupload.presentationNamesLbl = Présentation déjà envoyées\: +bbb.fileupload.presentationNamesLbl = Présentations déjà envoyées \: bbb.fileupload.deleteBtn.toolTip = Supprimer cette présentation bbb.fileupload.showBtn = Afficher bbb.fileupload.showBtn.toolTip = Afficher cette présentation bbb.fileupload.okCancelBtn = Fermer bbb.fileupload.okCancelBtn.toolTip = Fermer la boîte de dialogue d'envoi de fichier -bbb.fileupload.genThumbText = Génération des aperçus.. -bbb.fileupload.progBarLbl = Progression\: +bbb.fileupload.genThumbText = Génération des aperçus... +bbb.fileupload.progBarLbl = Progression \: bbb.chat.title = Discussion bbb.chat.quickLink.label = Fenêtre discussion bbb.chat.cmpColorPicker.toolTip = Couleur du texte @@ -135,7 +135,7 @@ bbb.chat.sendBtn.accessibilityName = Envoyer ce message bbb.chat.publicChatUsername = Public bbb.chat.optionsTabName = Options bbb.chat.privateChatSelect = Choisissez une personne avec qui discuter en privé -bbb.chat.private.userLeft = Cet utilisateur à quitté. +bbb.chat.private.userLeft = L'utilisateur a quitté. bbb.chat.usersList.toolTip = Sélectionnez un participant pour ouvrir une discussion privée bbb.chat.chatOptions = Options de discussions bbb.chat.fontSize = Taille de la police @@ -156,21 +156,21 @@ bbb.video.minimizeBtn.accessibilityName = Réduire la fenêtre des webcams bbb.video.maximizeRestoreBtn.accessibilityName = Agrandir la fenêtre des webcams bbb.video.controls.muteButton.toolTip = Activer ou désactiver la sourdine pour {0} bbb.video.controls.switchPresenter.toolTip = Faire de {0} le présentateur -bbb.video.controls.ejectUserBtn.toolTip = Éjecter {0} de la rencontre +bbb.video.controls.ejectUserBtn.toolTip = Éjecter {0} de la conférence bbb.video.controls.privateChatBtn.toolTip = Discuter avec {0} bbb.video.publish.hint.noCamera = Pas de webcam disponible bbb.video.publish.hint.cantOpenCamera = Impossible d'ouvrir votre webcam bbb.video.publish.hint.waitingApproval = Attend l'approbation -bbb.video.publish.hint.videoPreview = Aperçu de la webcam +bbb.video.publish.hint.videoPreview = Prévisualisation vidéo bbb.video.publish.hint.openingCamera = Ouverture de la webcam... bbb.video.publish.hint.cameraDenied = Accès à la webcam refusé -bbb.video.publish.hint.cameraIsBeingUsed = Votre webcam est actuellement utilisée par un autre application +bbb.video.publish.hint.cameraIsBeingUsed = Votre caméra est utilisée par une autre application bbb.video.publish.hint.publishing = Publication... bbb.video.publish.closeBtn.accessName = Fermer la fenêtre de paramètres pour la webcam bbb.video.publish.closeBtn.label = Annuler bbb.video.publish.titleBar = Publier la webcam -bbb.desktopPublish.title = Partage de bureau\: Aperçu du présentateur -bbb.desktopPublish.fullscreen.tooltip = Partager votre écran au complet +bbb.desktopPublish.title = Partage de bureau \: Aperçu du présentateur +bbb.desktopPublish.fullscreen.tooltip = Partager l'intégralité de l'écran bbb.desktopPublish.fullscreen.label = Plein écran bbb.desktopPublish.region.tooltip = Partager une partie de votre écran bbb.desktopPublish.region.label = Région @@ -181,7 +181,10 @@ bbb.desktopPublish.closeBtn.toolTip = Arrêter de partager et fermer bbb.desktopPublish.minimizeBtn.toolTip = Réduire bbb.desktopPublish.minimizeBtn.accessibilityName = Réduire la fenêtre de partage d'écran bbb.desktopPublish.maximizeRestoreBtn.accessibilityName = Agrandir la fenêtre de partage d'écran -bbb.desktopPublish.closeBtn.accessibilityName = Arrêter le partage et fermer la fenêtre de partage d'écran +bbb.desktopPublish.javaRequiredLabel = Nécessite Java 7u45 (ou version ultérieure) pour fonctionner. +bbb.desktopPublish.javaTestLinkLabel = Testez Java +bbb.desktopPublish.javaTestLinkLabel.tooltip = Testez Java +bbb.desktopPublish.javaTestLinkLabel.tooltip.accessibility = Testez Java bbb.desktopView.title = Partage d'écran bbb.desktopView.fitToWindow = Adapter la taille à la fenêtre bbb.desktopView.actualSize = Afficher à la taille normale @@ -191,9 +194,9 @@ bbb.desktopView.closeBtn.accessibilityName = Fermer la fenêtre de partage d'éc bbb.toolbar.phone.toolTip.start = Joindre l'audio bbb.toolbar.phone.toolTip.stop = Quitter l'audio bbb.toolbar.deskshare.toolTip.start = Partager mon écran -bbb.toolbar.deskshare.toolTip.stop = Arrêter le partage de mon écran +bbb.toolbar.deskshare.toolTip.stop = Arrêter de partager mon écran bbb.toolbar.video.toolTip.start = Partager ma webcam -bbb.toolbar.video.toolTip.stop = Arrêter le partage de ma webcam +bbb.toolbar.video.toolTip.stop = Arrêter de partager ma webcam bbb.layout.addButton.toolTip = Ajouter la mise en page personnalisée à la liste bbb.layout.combo.toolTip = Changer la mise en page courante bbb.layout.loadButton.toolTip = Charger des mises en page depuis un fichier @@ -212,20 +215,20 @@ bbb.highlighter.toolbar.ellipse = Cercle bbb.highlighter.toolbar.ellipse.accessibilityName = Changer le curseur du tableau pour un cercle bbb.highlighter.toolbar.rectangle = Rectangle bbb.highlighter.toolbar.rectangle.accessibilityName = Changer le curseur du tableau pour un rectangle -bbb.highlighter.toolbar.panzoom = Faire un panoramique et zoomer +bbb.highlighter.toolbar.panzoom = Déplacer et zoomer bbb.highlighter.toolbar.panzoom.accessibilityName = Changer le curseur du tableau pour le recadrage et zoom -bbb.highlighter.toolbar.clear = Effacer la page +bbb.highlighter.toolbar.clear = Effacer les annotations bbb.highlighter.toolbar.clear.accessibilityName = Effacer le tableau -bbb.highlighter.toolbar.undo = Annuler la forme -bbb.highlighter.toolbar.undo.accessibilityName = Effacer la dernière forme du tableau +bbb.highlighter.toolbar.undo = Annuler la marque +bbb.highlighter.toolbar.undo.accessibilityName = Effacer la dernière marque sur le tableau bbb.highlighter.toolbar.color = Selectionner une couleur bbb.highlighter.toolbar.color.accessibilityName = Couleur de la marque bbb.highlighter.toolbar.thickness = Changer l'épaisseur bbb.highlighter.toolbar.thickness.accessibilityName = Épaisseur du trait bbb.logout.title = Déconnecté bbb.logout.button.label = OK -bbb.logout.appshutdown = L'application serveur a été arrêté -bbb.logout.asyncerror = Un erreur de synchronisation est survenue +bbb.logout.appshutdown = L'application serveur a été arrêtée +bbb.logout.asyncerror = Une erreur de synchronisation est survenue bbb.logout.connectionclosed = La connexion au serveur a été fermée bbb.logout.connectionfailed = La connexion au serveur a échoué bbb.logout.rejected = La connexion au serveur a été refusée @@ -233,29 +236,29 @@ bbb.logout.invalidapp = L'application red5 n'existe pas bbb.logout.unknown = Votre client a perdu la connexion au serveur bbb.logout.usercommand = Vous êtes maintenant déconnecté de la conférence bbb.logout.confirm.title = Confirmer la déconnexion -bbb.logout.confirm.message = Êtes-vous sur de vouloir vous déconnecter? +bbb.logout.confirm.message = Êtes-vous sur de vouloir vous déconnecter ? bbb.logout.confirm.yes = Oui bbb.logout.confirm.no = Non bbb.notes.title = Notes bbb.notes.cmpColorPicker.toolTip = Couleur du texte bbb.notes.saveBtn = Sauvegarder bbb.notes.saveBtn.toolTip = Sauvegarder la note -bbb.settings.deskshare.instructions = Choisissez Permettre sur la boîte de dialogue qui apparaîtra pour voir si le partage d'écran fonctionne convenablement pour vous -bbb.settings.deskshare.start = Regarder le partage d'écran +bbb.settings.deskshare.instructions = Cliquez sur Autoriser sur l'invite qui s'affiche pour vérifier que le partage d'écran fonctionne correctement pour vous +bbb.settings.deskshare.start = Vérifier le partage d'écran bbb.settings.voice.volume = Activité du microphone -bbb.settings.java.label = Erreur de la version de Java -bbb.settings.java.text = Vous avez Java {0} installé, mais vous devez avoir au moins la version {1} pour utiliser le partage d'écran de BigBlueButton. Pour installer la version la plus récente de Java JRE, cliquez sur le bouton ci-dessous. -bbb.settings.java.command = Installer la nouvelle version de Java -bbb.settings.flash.label = Erreur de la version de Flash -bbb.settings.flash.text = Vous avez Flash {0} installé, mais vous devez avoir au moins la version {1} pour utiliser BigBlueButton convenablement. Pour installer la version la plus récente de Adobe Flash, cliquez sur le bouton ci-dessous. -bbb.settings.flash.command = Installer la nouvelle version de Flash +bbb.settings.java.label = Erreur de version Java +bbb.settings.java.text = Vous avez Java {0} installé, mais la version {1} minimum est requise pour utiliser le partage d'écran de BigBlueButton. Pour installer la version la plus récente de Java JRE, cliquez sur le bouton ci-dessous. +bbb.settings.java.command = Installer la dernière version de Java +bbb.settings.flash.label = Erreur de version Flash +bbb.settings.flash.text = Vous avez Flash {0} installé, mais la version {1} minimum est requise pour BigBlueButton. Cliquez sur le bouton ci-dessous pour installer la dernière version d'Adobe Flash. +bbb.settings.flash.command = Installer la dernière version de Flash bbb.settings.isight.label = Erreur de webcam iSight -bbb.settings.isight.text = Si vous avez des problèmes avec votre webcam iSight, c'est peut-être parce que vous êtes sur OS X 10.6.5, qui est connu pour avoir un problème avec Flash. Pour corriger ce problème, vous pouvez cliquer sur le lien ci-dessous pour installer la version de Flash la plus récente ou bien mettez à jour votre Mac. +bbb.settings.isight.text = Si vous avez des problèmes avec votre webcam iSight, c'est peut-être parce que vous utilisez OS X 10.6.5, qui est connu pour avoir un problème avec Flash. Pour corriger ce problème, cliquez sur le lien ci-dessous pour installer la dernière version de Flash ou bien mettez à jour votre Mac. bbb.settings.isight.command = Installer Flash 10.2 RC2 bbb.settings.warning.label = Attention bbb.settings.warning.close = Fermer cette alerte -bbb.settings.noissues = Pas de problèmes détectés. -bbb.settings.instructions = Accepter la demande de Flash pour accéder à votre webcam. Si la sortie correspond à ce que vous attendiez, votre navigateur est configuré correctement. Les problèmes potentiels sont décrit ci-dessous, vous pouvez y jeter un coup d’œil pour trouvez une solution. +bbb.settings.noissues = Aucun problème sérieux n'a été détecté. +bbb.settings.instructions = Acceptez l'application Flash qui vous demande l'autorisation pour accéder à votre webcam et votre micro. Si vous pouvez vous voir et vous entendre, votre navigateur a été correctement configuré. D'autres questions éventuelles sont présentées ci-dessous. Cliquez sur l'une d'entre elle pour trouver une solution. ltbcustom.bbb.highlighter.toolbar.triangle = Triangle ltbcustom.bbb.highlighter.toolbar.triangle.accessibilityName = Changer le curseur du tableau pour un triangle ltbcustom.bbb.highlighter.toolbar.line = Ligne @@ -263,14 +266,14 @@ ltbcustom.bbb.highlighter.toolbar.line.accessibilityName = Changer le curseur du ltbcustom.bbb.highlighter.toolbar.text = Texte ltbcustom.bbb.highlighter.toolbar.text.accessibilityName = Changer le curseur du tableau pour du texte ltbcustom.bbb.highlighter.texttoolbar.textColorPicker = Couleur du texte -ltbcustom.bbb.highlighter.texttoolbar.textSizeMenu = Taille de la police +ltbcustom.bbb.highlighter.texttoolbar.textSizeMenu = Taille de caractère bbb.accessibility.chat.chatBox.reachedFirst = Vous avez atteint le premier message. bbb.accessibility.chat.chatBox.reachedLatest = Vous avez atteint le dernier message. bbb.accessibility.chat.chatBox.navigatedFirst = Vous avez navigué jusqu'au premier message. bbb.accessibility.chat.chatBox.navigatedLatest = Vous avez navigué jusqu'au dernier message. bbb.accessibility.chat.chatBox.navigatedLatestRead = Vous avez navigué jusqu'au message le plus récent que vous avez lu. -bbb.accessibility.chat.chatwindow.input = Saisie discussion +bbb.accessibility.chat.chatwindow.input = Saisie de texte bbb.accessibility.chat.initialDescription = Veuillez utiliser les flèches pour naviguer entre les messages. @@ -295,7 +298,7 @@ bbb.shortcutkey.general.maximize = 187 bbb.shortcutkey.general.maximize.function = Agrandir la fenêtre courante bbb.shortcutkey.flash.exit = 81 -bbb.shortcutkey.flash.exit.function = Enlever le focus de sur la fenêtre de Flash +bbb.shortcutkey.flash.exit.function = Enlever le focus de la fenêtre de Flash bbb.shortcutkey.users.muteme = 77 bbb.shortcutkey.users.muteme.function = Activer et désactiver votre microphone bbb.shortcutkey.chat.chatinput = 73 @@ -306,7 +309,7 @@ bbb.shortcutkey.whiteboard.undo = 90 bbb.shortcutkey.whiteboard.undo.function = Effacer la dernière marque sur le tableau bbb.shortcutkey.focus.users = 49 -bbb.shortcutkey.focus.users.function = Mettre le focus sur le module utilisateurs +bbb.shortcutkey.focus.users.function = Mettre le focus sur la fenêtre des utilisateurs bbb.shortcutkey.focus.video = 50 bbb.shortcutkey.focus.video.function = Mettre le focus sur la fenêtre webcam bbb.shortcutkey.focus.presentation = 51 @@ -330,18 +333,18 @@ bbb.shortcutkey.share.webcam.function = Ouvrir la fenêtre de partage de la webc bbb.shortcutkey.shortcutWindow = 72 bbb.shortcutkey.shortcutWindow.function = Ouvrir/mettre le focus sur la fenêtre d'aide sur les raccourcis bbb.shortcutkey.logout = 76 -bbb.shortcutkey.logout.function = Se déconnecter de cette réunion +bbb.shortcutkey.logout.function = Se déconnecter de cette conférence bbb.shortcutkey.raiseHand = 82 -bbb.shortcutkey.raiseHand.function = Lever votre main +bbb.shortcutkey.raiseHand.function = Lever la main bbb.shortcutkey.present.upload = 85 bbb.shortcutkey.present.upload.function = Envoyer un document à présenter bbb.shortcutkey.present.previous = 65 -bbb.shortcutkey.present.previous.function = Diapositive précédente +bbb.shortcutkey.present.previous.function = Aller à la diapositive précédente bbb.shortcutkey.present.select = 83 bbb.shortcutkey.present.select.function = Voir toutes les diapositives bbb.shortcutkey.present.next = 69 -bbb.shortcutkey.present.next.function = Diapositive suivante +bbb.shortcutkey.present.next.function = Aller à la diapositive suivante bbb.shortcutkey.present.fitWidth = 70 bbb.shortcutkey.present.fitWidth.function = Ajuster les diapositives à la largeur bbb.shortcutkey.present.fitPage = 80 @@ -350,7 +353,7 @@ bbb.shortcutkey.present.fitPage.function = Ajuster les diapositives à la page bbb.shortcutkey.users.makePresenter = 80 bbb.shortcutkey.users.makePresenter.function = Faire de la personne sélectionnée le présentateur bbb.shortcutkey.users.kick = 75 -bbb.shortcutkey.users.kick.function = Éjecter la personne sélectionnée de la rencontre +bbb.shortcutkey.users.kick.function = Éjecter la personne sélectionnée de la conférence bbb.shortcutkey.users.mute = 83 bbb.shortcutkey.users.mute.function = Activer ou désactiver la sourdine pour la personne sélectionnée bbb.shortcutkey.users.muteall = 65 @@ -372,49 +375,49 @@ bbb.shortcutkey.chat.explanation = ---- bbb.shortcutkey.chat.explanation.function = Pour la navigation entre les messages, vous devez mettre le focus sur la zone de discussion. bbb.shortcutkey.chat.chatbox.advance = 40 -bbb.shortcutkey.chat.chatbox.advance.function = Message suivant +bbb.shortcutkey.chat.chatbox.advance.function = Naviguer vers le message suivant bbb.shortcutkey.chat.chatbox.goback = 38 -bbb.shortcutkey.chat.chatbox.goback.function = Message précédent +bbb.shortcutkey.chat.chatbox.goback.function = Naviguer vers le message précédent bbb.shortcutkey.chat.chatbox.repeat = 32 -bbb.shortcutkey.chat.chatbox.repeat.function = Répéter le message courant +bbb.shortcutkey.chat.chatbox.repeat.function = Répéter le message actuel bbb.shortcutkey.chat.chatbox.golatest = 39 -bbb.shortcutkey.chat.chatbox.golatest.function = Aller jusqu'au dernier message +bbb.shortcutkey.chat.chatbox.golatest.function = Naviguer jusqu'au dernier message bbb.shortcutkey.chat.chatbox.gofirst = 37 -bbb.shortcutkey.chat.chatbox.gofirst.function = Aller jusqu'au premier message +bbb.shortcutkey.chat.chatbox.gofirst.function = Naviguer jusqu'au premier message bbb.shortcutkey.chat.chatbox.goread = 75 -bbb.shortcutkey.chat.chatbox.goread.function = Aller jusqu'au dernier message lu +bbb.shortcutkey.chat.chatbox.goread.function = Naviguer jusqu'au dernier message que vous avez lu bbb.shortcutkey.chat.chatbox.debug = 71 bbb.shortcutkey.chat.chatbox.debug.function = Raccourci temporaire de débogage bbb.polling.createPoll = Créer un nouveau sondage -bbb.polling.createPoll.moreThanOneResponse = Permettre les utilisateurs de choisir plus d'une réponse -bbb.polling.createPoll.hint = Conseil\: Démarrer chaque réponse sur une nouvelle ligne -bbb.polling.createPoll.answers = Réponses\: -bbb.polling.createPoll.question = Question\: -bbb.polling.createPoll.title = Titre\: +bbb.polling.createPoll.moreThanOneResponse = Autoriser les utilisateurs à choisir plus d'une réponse +bbb.polling.createPoll.hint = Astuce \: commencez chaque réponse sur une nouvelle ligne +bbb.polling.createPoll.answers = Réponses \: +bbb.polling.createPoll.question = Question \: +bbb.polling.createPoll.title = Titre \: bbb.polling.createPoll.publishToWeb = Activer le sondage web -bbb.polling.pollPreview = Aperçu du sondage +bbb.polling.pollPreview = Prévisualiser le sondage bbb.polling.pollPreview.modify = Modifier bbb.polling.pollPreview.publish = Publier -bbb.polling.pollPreview.preview = Aperçu +bbb.polling.pollPreview.preview = Prévisualiser bbb.polling.pollPreview.save = Sauvegarder bbb.polling.pollPreview.cancel = Annuler bbb.polling.pollPreview.modify = Modifier -bbb.polling.pollPreview.hereIsYourPoll = Voici votre sondage\: -bbb.polling.pollPreview.ifYouWantChanges = si vous voulez faire des modifications, utilisez le bouton 'Modifier' -bbb.polling.pollPreview.checkAll = (vérifier tous ce qui peut s'appliquer) +bbb.polling.pollPreview.hereIsYourPoll = Voici votre sondage \: +bbb.polling.pollPreview.ifYouWantChanges = Si vous souhaitez faire des modifications, utilisez le bouton 'Modifier' +bbb.polling.pollPreview.checkAll = (vérifier tout ce qui peut s'appliquer) bbb.polling.pollPreview.pollWillPublishOnline = Ce sondage sera disponible pour le vote web. bbb.polling.validation.toolongAnswer = Vos réponses sont trop longues. La longueur maximale est -bbb.polling.validation.toolongQuestion = La question est trop longue. Nombre de caractères maximum\: -bbb.polling.validation.toolongTitle = Le titre est trop long, Max\: -bbb.polling.validation.noQuestion = Merci de fournir une question -bbb.polling.validation.noTitle = Merci de fournir un titre -bbb.polling.validation.toomuchAnswers = Vous avez trop de réponses. Nombre de réponses maximum autorisées\: -bbb.polling.validation.eachNewLine = Merci de fournir au moins 2 réponses. Démarrer chaque réponses sur une nouvelle ligne. -bbb.polling.validation.answerUnique = Chaque réponse doit être unique -bbb.polling.validation.atLeast2Answers = Merci de fournir au moins 2 réponses +bbb.polling.validation.toolongQuestion = La question est trop longue. Nombre de caractères maximum \: +bbb.polling.validation.toolongTitle = Le titre est trop long. Max \: +bbb.polling.validation.noQuestion = Merci d'indiquer une question +bbb.polling.validation.noTitle = Merci d'indiquer un titre +bbb.polling.validation.toomuchAnswers = Vous avez trop de réponses. Nombre de réponses maximal \: +bbb.polling.validation.eachNewLine = Merci d'indiquer au moins 2 réponses, chacune démarrant sur une nouvelle ligne +bbb.polling.validation.answerUnique = Chaque réponse devrait être unique +bbb.polling.validation.atLeast2Answers = Merci d'indiquer au moins 2 réponses bbb.polling.validation.duplicateTitle = Ce sondage existe déjà bbb.polling.pollView.vote = Soumettre @@ -425,16 +428,16 @@ bbb.polling.stats.close = Fermer bbb.polling.stats.didNotVote = N'a pas voté bbb.polling.stats.refresh = Rafraîchir bbb.polling.stats.stopPoll = Arrêter les votes -bbb.polling.stats.webPollURL = Ce sondage est disponible au\: +bbb.polling.stats.webPollURL = Ce sondage est disponible au \: bbb.polling.stats.answer = Réponses bbb.polling.stats.votes = Votes bbb.polling.stats.percentage = % Des Votes bbb.polling.webPollClosed = Le sondage web est terminé. -bbb.polling.pollClosed = Le sondage est terminé\! Les résultats sont +bbb.polling.pollClosed = Le sondage est fermé. Les résultats sont \: -bbb.polling.vote.error.radio = Sélectionner une option ou fermer cette fenêtre pour ne pas voter. -bbb.polling.vote.error.check = Sélectionner une ou plusieurs options ou fermer cette fenêtre pour ne pas voter. +bbb.polling.vote.error.radio = Veuillez sélectionner une option, ou fermer cette fenêtre pour ne pas voter. +bbb.polling.vote.error.check = Veuillez sélectionner une ou plusieurs options, ou fermer cette fenêtre pour ne pas voter. bbb.publishVideo.startPublishBtn.labelText = Démarrer le partage bbb.publishVideo.changeCameraBtn.labelText = Changer la webcam @@ -449,7 +452,7 @@ bbb.shortcutkey.polling.focusTitle.function = Mettre le focus sur le champ de sa bbb.shortcutkey.polling.focusQuestion = 81 bbb.shortcutkey.polling.focusQuestion.function = Mettre le focus sur le champ de saisie de la question. bbb.shortcutkey.polling.focusAnswers = 65 -bbb.shortcutkey.polling.focusAnswers.function = Mettre le focus sur le champ de saisie de la réponse. +bbb.shortcutkey.polling.focusAnswers.function = Mettre le focus sur le champ de saisie des réponses. bbb.shortcutkey.polling.focusMultipleCB = 77 bbb.shortcutkey.polling.focusMultipleCB.function = Mettre le focus sur la case à cocher "Permettre les sélections multiples". bbb.shortcutkey.polling.focusWebPollCB = 66 @@ -466,7 +469,7 @@ bbb.shortcutkey.polling.save = 83 bbb.shortcutkey.polling.save.function = Sauvegarder votre sondage pour plus tard. bbb.shortcutkey.pollStats.explanation = ---- -bbb.shortcutkey.pollStats.explanation.function = Les résultats du sondage seront disponibles une fois le sondage publié. +bbb.shortcutkey.pollStats.explanation.function = Les résultats du sondage sont seulement disponibles une fois le sondage publié. bbb.shortcutkey.polling.focusData = 68 bbb.shortcutkey.polling.focusData.function = Mettre le focus sur les résultats du sondage. bbb.shortcutkey.polling.refresh = 82 diff --git a/bigbluebutton-client/locale/he_IL/bbbResources.properties b/bigbluebutton-client/locale/he_IL/bbbResources.properties index a51817aaa2..737842f0d1 100644 --- a/bigbluebutton-client/locale/he_IL/bbbResources.properties +++ b/bigbluebutton-client/locale/he_IL/bbbResources.properties @@ -181,7 +181,10 @@ bbb.desktopPublish.closeBtn.toolTip = הפסק שיתוף וסגור חלון ז bbb.desktopPublish.minimizeBtn.toolTip = מזער חלון זה # bbb.desktopPublish.minimizeBtn.accessibilityName = Minimize the Desktop Sharing Publish Window # bbb.desktopPublish.maximizeRestoreBtn.accessibilityName = Maximize the Desktop Sharing Publish Window -# bbb.desktopPublish.closeBtn.accessibilityName = Stop Sharing and Close the Desktop Sharing Publish Window +# bbb.desktopPublish.javaRequiredLabel = Requires Java 7u45 (or later) to run. +# bbb.desktopPublish.javaTestLinkLabel = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip.accessibility = Test Java bbb.desktopView.title = שיתוף שולחן עבודה bbb.desktopView.fitToWindow = התאם גודל לחלון bbb.desktopView.actualSize = הצג גודל אמיתי diff --git a/bigbluebutton-client/locale/hr_HR/bbbResources.properties b/bigbluebutton-client/locale/hr_HR/bbbResources.properties index 53d3768765..a2546c481b 100644 --- a/bigbluebutton-client/locale/hr_HR/bbbResources.properties +++ b/bigbluebutton-client/locale/hr_HR/bbbResources.properties @@ -181,7 +181,10 @@ bbb.desktopPublish.closeBtn.toolTip = Prekini podelu radne ploče i zatvori proz bbb.desktopPublish.minimizeBtn.toolTip = Minimiraj ovaj prozor. # bbb.desktopPublish.minimizeBtn.accessibilityName = Minimize the Desktop Sharing Publish Window # bbb.desktopPublish.maximizeRestoreBtn.accessibilityName = Maximize the Desktop Sharing Publish Window -# bbb.desktopPublish.closeBtn.accessibilityName = Stop Sharing and Close the Desktop Sharing Publish Window +# bbb.desktopPublish.javaRequiredLabel = Requires Java 7u45 (or later) to run. +# bbb.desktopPublish.javaTestLinkLabel = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip.accessibility = Test Java bbb.desktopView.title = Podela radne ploče bbb.desktopView.fitToWindow = Podesi prozoru bbb.desktopView.actualSize = Prikaži trenutnu veličinu diff --git a/bigbluebutton-client/locale/hu_HU/bbbResources.properties b/bigbluebutton-client/locale/hu_HU/bbbResources.properties index bdfcf16edb..e8cadc51b5 100644 --- a/bigbluebutton-client/locale/hu_HU/bbbResources.properties +++ b/bigbluebutton-client/locale/hu_HU/bbbResources.properties @@ -181,7 +181,10 @@ bbb.desktopPublish.closeBtn.toolTip = Megosztás leállítása és bezárás bbb.desktopPublish.minimizeBtn.toolTip = Kis méret bbb.desktopPublish.minimizeBtn.accessibilityName = Képernyő-megosztása ablak kis méretűre bbb.desktopPublish.maximizeRestoreBtn.accessibilityName = Képernyő-megosztása ablak teljes méretűre -bbb.desktopPublish.closeBtn.accessibilityName = Megosztás bezárása és a Megosztás ablak bezárása +# bbb.desktopPublish.javaRequiredLabel = Requires Java 7u45 (or later) to run. +# bbb.desktopPublish.javaTestLinkLabel = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip.accessibility = Test Java bbb.desktopView.title = Képernyőm megosztása bbb.desktopView.fitToWindow = Ablakhoz igazítása bbb.desktopView.actualSize = Eredeti méret @@ -222,7 +225,7 @@ bbb.highlighter.toolbar.color = Szín választása bbb.highlighter.toolbar.color.accessibilityName = Rajztáblához kijelölőszín bbb.highlighter.toolbar.thickness = Vastagság változtatása bbb.highlighter.toolbar.thickness.accessibilityName = Rajztáblához kurzorvastagság -# bbb.logout.title = Logged Out +bbb.logout.title = Kijelentkeztél bbb.logout.button.label = OK bbb.logout.appshutdown = A szerveralkalmazást leállították bbb.logout.asyncerror = Async hiba diff --git a/bigbluebutton-client/locale/hy_AM/bbbResources.properties b/bigbluebutton-client/locale/hy_AM/bbbResources.properties index b24eb98cfe..04c39a17dc 100644 --- a/bigbluebutton-client/locale/hy_AM/bbbResources.properties +++ b/bigbluebutton-client/locale/hy_AM/bbbResources.properties @@ -1,83 +1,83 @@ -# bbb.mainshell.locale.version = 0.8 -# bbb.mainshell.statusProgress.connecting = Connecting to the server -# bbb.mainshell.statusProgress.loading = Loading {0} modules -# bbb.mainshell.statusProgress.cannotConnectServer = Sorry, we cannot connect to the server. +bbb.mainshell.locale.version = Միացրեք երաժշտություն Ձեր ձայնարկիչները ստուգելու համար +bbb.mainshell.statusProgress.connecting = Միացում սերվերին +bbb.mainshell.statusProgress.loading = Մոդուլների {0} բեռնում +bbb.mainshell.statusProgress.cannotConnectServer = Կներեք, հնարավոր չէ միանալ սերվերին # bbb.mainshell.copyrightLabel2 = (c) 2013 BigBlueButton Inc. [build {0}] - For more information visit http\://www.bigbluebutton.org -# bbb.mainshell.logBtn.toolTip = Open Log Window -# bbb.mainshell.resetLayoutBtn.toolTip = Reset Layout -# bbb.oldlocalewindow.reminder1 = You may have an old language translations of BigBlueButton. -# bbb.oldlocalewindow.reminder2 = Please clear your browser's cache and try again. -# bbb.oldlocalewindow.windowTitle = Warning\: Old Language Translations -# bbb.micSettings.speakers.header = Test Speakers +bbb.mainshell.logBtn.toolTip = Բացել տեղեկամատյանի պատուհանը +bbb.mainshell.resetLayoutBtn.toolTip = Վերադառնալ նախնական դասավորվածությանը +bbb.oldlocalewindow.reminder1 = Հնարավոր է Ձեր BigBlueButton-ի լեզվի թարգմանությունը հին է։ +bbb.oldlocalewindow.reminder2 = Մաքրեք Ձեր բրաուզերի հիշողությունը և փորձեք կրկին +bbb.oldlocalewindow.windowTitle = Սխալ։ Լեզվի հին թարգմանություն +bbb.micSettings.speakers.header = Փորձարկեք Ձեր բարձրախոսները # bbb.micSettings.microphone.header = Test Microphone -# bbb.micSettings.playSound = Test Speakers -# bbb.micSettings.playSound.toolTip = Play music to test your speakers -# bbb.micSettings.hearFromHeadset = You should hear audio in your headset, not your computer speakers. -# bbb.micSettings.speakIntoMic = Test or change your microphone (headset recommended). -# bbb.micSettings.changeMic = Test or Change Microphone -# bbb.micSettings.changeMic.toolTip = Open the Flash Player microphone settings dialog box -# bbb.micSettings.join = Join Audio +bbb.micSettings.playSound = Փորձարկեք Ձեր բարձրախոսները +bbb.micSettings.playSound.toolTip = Միացրեք երաժշտություն Ձեր բարձրախոսը ստուգելու համար +bbb.micSettings.hearFromHeadset = Դուք պետք է լսեք ձայնը Ձեր ականջակալներում, ոչ թէ բարձրախոսից +bbb.micSettings.speakIntoMic = Փորձարկեք կամ փոխեք Ձեր միկրոֆոնը (խորհուրդ է տրվում ականջակալներ) +bbb.micSettings.changeMic = Փորձարկեք կամ փոխեք Ձեր ականջակալները +bbb.micSettings.changeMic.toolTip = Բացեք Flash Player-ի միկրոֆոնի պարամետրների պատուհանը +bbb.micSettings.join = Միացնել ձայնը # bbb.micSettings.cancel = Cancel # bbb.micSettings.cancel.toolTip = Cancel joining the audio conference -# bbb.micSettings.access.helpButton = Open tutorial videos in a new page. +bbb.micSettings.access.helpButton = Բացեք սովորացնող դասնթացը նոր էջում # bbb.micSettings.access.title = Audio Settings. Focus will remain in this audio settings window until the window is closed. -# bbb.mainToolbar.helpBtn = Help -# bbb.mainToolbar.logoutBtn = Logout -# bbb.mainToolbar.logoutBtn.toolTip = Log out -# bbb.mainToolbar.langSelector = Select language -# bbb.mainToolbar.settingsBtn = Settings -# bbb.mainToolbar.settingsBtn.toolTip = Open Settings +bbb.mainToolbar.helpBtn = Օգնություն +bbb.mainToolbar.logoutBtn = Ելք +bbb.mainToolbar.logoutBtn.toolTip = Ելք +bbb.mainToolbar.langSelector = Ընտրեք լեզուն +bbb.mainToolbar.settingsBtn = Պարամետրներ +bbb.mainToolbar.settingsBtn.toolTip = Բացել պարամետրների պատուհանը # bbb.mainToolbar.shortcutBtn = Shortcut Help # bbb.mainToolbar.shortcutBtn.toolTip = Open Shortcut Help window -# bbb.window.minimizeBtn.toolTip = Minimize -# bbb.window.maximizeRestoreBtn.toolTip = Maximize -# bbb.window.closeBtn.toolTip = Close -# bbb.videoDock.titleBar = Webcam Window Title Bar +bbb.window.minimizeBtn.toolTip = Փոքրացնել +bbb.window.maximizeRestoreBtn.toolTip = Մեծացնել +bbb.window.closeBtn.toolTip = Փագել +bbb.videoDock.titleBar = Տեսախցիկի պատուհանի վերնագիրը # bbb.presentation.titleBar = Presentation Window Title Bar # bbb.chat.titleBar = Chat Window Title Bar -# bbb.users.title = Users{0} {1} +bbb.users.title = Օգտվողներ{0} {1} # bbb.users.titleBar = Users Window title bar # bbb.users.quickLink.label = Users Window -# bbb.users.minimizeBtn.accessibilityName = Minimize the Users Window +bbb.users.minimizeBtn.accessibilityName = Փոքրացնել օգտվողների պատուհանը # bbb.users.maximizeRestoreBtn.accessibilityName = Maximize the Users Window -# bbb.users.settings.buttonTooltip = Settings +bbb.users.settings.buttonTooltip = Պարամետրներ # bbb.users.settings.audioSettings = Audio Settings # bbb.users.settings.webcamSettings = Webcam Settings # bbb.users.settings.muteAll = Mute All Users -# bbb.users.settings.muteAllExcept = Mute All Users Except Presenter +bbb.users.settings.muteAllExcept = Խլացնել բոլոր օգտվողներին, բացի ցուցադրողից # bbb.users.settings.unmuteAll = Unmute All Users # bbb.users.settings.lowerAllHands = Lower All Hands -# bbb.users.raiseHandBtn.toolTip = Raise Hand -# bbb.users.pushToTalk.toolTip = Talk -# bbb.users.pushToMute.toolTip = Mute yourself -# bbb.users.muteMeBtnTxt.talk = Unmute -# bbb.users.muteMeBtnTxt.mute = Mute -# bbb.users.muteMeBtnTxt.muted = Muted +bbb.users.raiseHandBtn.toolTip = Ձերք բարցրացնել +bbb.users.pushToTalk.toolTip = Խոսել +bbb.users.pushToMute.toolTip = Անջատել խոսափողը +bbb.users.muteMeBtnTxt.talk = Միացնել խոսափողը +bbb.users.muteMeBtnTxt.mute = Անջատել +bbb.users.muteMeBtnTxt.muted = Անջատած է # bbb.users.muteMeBtnTxt.unmuted = Unmuted -# bbb.users.usersGrid.accessibilityName = Users List. Use the arrow keys to navigate. -# bbb.users.usersGrid.nameItemRenderer = Name -# bbb.users.usersGrid.nameItemRenderer.youIdentifier = you +bbb.users.usersGrid.accessibilityName = Օգտվողների ցանկ։ Օգտագործել սլաքները փոխելու համար։ +bbb.users.usersGrid.nameItemRenderer = Անուն +bbb.users.usersGrid.nameItemRenderer.youIdentifier = Դուք # bbb.users.usersGrid.statusItemRenderer = Status -# bbb.users.usersGrid.statusItemRenderer.changePresenter = Change Presenter +bbb.users.usersGrid.statusItemRenderer.changePresenter = Փոխել ներկայացնողին # bbb.users.usersGrid.statusItemRenderer.presenter = Presenter -# bbb.users.usersGrid.statusItemRenderer.moderator = Moderator +bbb.users.usersGrid.statusItemRenderer.moderator = Մոդերատոր # bbb.users.usersGrid.statusItemRenderer.lowerHand = Lower Hand # bbb.users.usersGrid.statusItemRenderer.handRaised = Hand Raised -# bbb.users.usersGrid.statusItemRenderer.viewer = Viewer +bbb.users.usersGrid.statusItemRenderer.viewer = Նայող # bbb.users.usersGrid.mediaItemRenderer = Media -# bbb.users.usersGrid.mediaItemRenderer.talking = Talking +bbb.users.usersGrid.mediaItemRenderer.talking = Խոսել # bbb.users.usersGrid.mediaItemRenderer.webcam = Sharing Webcam -# bbb.users.usersGrid.mediaItemRenderer.webcamBtn = View webcam +bbb.users.usersGrid.mediaItemRenderer.webcamBtn = Նայել տեսախցիկը # bbb.users.usersGrid.mediaItemRenderer.pushToTalk = Unmute {0} # bbb.users.usersGrid.mediaItemRenderer.pushToMute = Mute {0} # bbb.users.usersGrid.mediaItemRenderer.pushToLock = Lock {0}'s mic # bbb.users.usersGrid.mediaItemRenderer.pushToUnlock = Unlock {0}'s mic # bbb.users.usersGrid.mediaItemRenderer.kickUser = Kick {0} # bbb.users.usersGrid.mediaItemRenderer.webcam = Sharing Webcam -# bbb.users.usersGrid.mediaItemRenderer.micOff = Microphone off -# bbb.users.usersGrid.mediaItemRenderer.micOn = Microphone on +bbb.users.usersGrid.mediaItemRenderer.micOff = Խոսափողը անջատել +bbb.users.usersGrid.mediaItemRenderer.micOn = Խոսափողը միացնել # bbb.users.usersGrid.mediaItemRenderer.noAudio = Not in audio conference -# bbb.presentation.title = Presentation +bbb.presentation.title = Ցուցադրում # bbb.presentation.titleWithPres = Presentation\: {0} # bbb.presentation.quickLink.label = Presentation Window # bbb.presentation.fitToWidth.toolTip = Fit presentation to width @@ -121,7 +121,7 @@ # bbb.fileupload.deleteBtn.toolTip = Delete Presentation # bbb.fileupload.showBtn = Show # bbb.fileupload.showBtn.toolTip = Show Presentation -# bbb.fileupload.okCancelBtn = Close +bbb.fileupload.okCancelBtn = Փագել # bbb.fileupload.okCancelBtn.toolTip = Close the File Upload dialog box # bbb.fileupload.genThumbText = Generating thumbnails.. # bbb.fileupload.progBarLbl = Progress\: @@ -175,20 +175,23 @@ # bbb.desktopPublish.region.tooltip = Share a part of your screen # bbb.desktopPublish.region.label = Region # bbb.desktopPublish.stop.tooltip = Close screen share -# bbb.desktopPublish.stop.label = Close +bbb.desktopPublish.stop.label = Փագել # bbb.desktopPublish.maximizeRestoreBtn.toolTip = You cannot maximize this window. # bbb.desktopPublish.closeBtn.toolTip = Stop Sharing and Close -# bbb.desktopPublish.minimizeBtn.toolTip = Minimize +bbb.desktopPublish.minimizeBtn.toolTip = Փոքրացնել # bbb.desktopPublish.minimizeBtn.accessibilityName = Minimize the Desktop Sharing Publish Window # bbb.desktopPublish.maximizeRestoreBtn.accessibilityName = Maximize the Desktop Sharing Publish Window -# bbb.desktopPublish.closeBtn.accessibilityName = Stop Sharing and Close the Desktop Sharing Publish Window +# bbb.desktopPublish.javaRequiredLabel = Requires Java 7u45 (or later) to run. +# bbb.desktopPublish.javaTestLinkLabel = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip.accessibility = Test Java # bbb.desktopView.title = Desktop Sharing # bbb.desktopView.fitToWindow = Fit to Window # bbb.desktopView.actualSize = Display actual size # bbb.desktopView.minimizeBtn.accessibilityName = Minimize the Desktop Sharing View Window # bbb.desktopView.maximizeRestoreBtn.accessibilityName = Maximize the Desktop Sharing View Window # bbb.desktopView.closeBtn.accessibilityName = Close the Desktop Sharing View Window -# bbb.toolbar.phone.toolTip.start = Join Audio +bbb.toolbar.phone.toolTip.start = Միացնել ձայնը # bbb.toolbar.phone.toolTip.stop = Leave Audio # bbb.toolbar.deskshare.toolTip.start = Share My Desktop # bbb.toolbar.deskshare.toolTip.stop = Stop Sharing My Desktop @@ -421,7 +424,7 @@ # bbb.polling.toolbar.toolTip = Polling # bbb.polling.stats.repost = Repost -# bbb.polling.stats.close = Close +bbb.polling.stats.close = Փագել # bbb.polling.stats.didNotVote = Did Not Vote # bbb.polling.stats.refresh = Refresh # bbb.polling.stats.stopPoll = Stop Poll diff --git a/bigbluebutton-client/locale/id_ID/bbbResources.properties b/bigbluebutton-client/locale/id_ID/bbbResources.properties index 2ae1f1a0bc..f273213218 100644 --- a/bigbluebutton-client/locale/id_ID/bbbResources.properties +++ b/bigbluebutton-client/locale/id_ID/bbbResources.properties @@ -181,7 +181,10 @@ bbb.desktopPublish.closeBtn.toolTip = Berhenti berbagi dan tutup jendela ini. bbb.desktopPublish.minimizeBtn.toolTip = Minimalkan jendela ini. # bbb.desktopPublish.minimizeBtn.accessibilityName = Minimize the Desktop Sharing Publish Window # bbb.desktopPublish.maximizeRestoreBtn.accessibilityName = Maximize the Desktop Sharing Publish Window -# bbb.desktopPublish.closeBtn.accessibilityName = Stop Sharing and Close the Desktop Sharing Publish Window +# bbb.desktopPublish.javaRequiredLabel = Requires Java 7u45 (or later) to run. +# bbb.desktopPublish.javaTestLinkLabel = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip.accessibility = Test Java bbb.desktopView.title = Berbagi Desktop bbb.desktopView.fitToWindow = Sesuaikan ke jendela bbb.desktopView.actualSize = Tampilkan ukuran sebenarnya diff --git a/bigbluebutton-client/locale/it_IT/bbbResources.properties b/bigbluebutton-client/locale/it_IT/bbbResources.properties index 7ab3de496f..680a52375f 100644 --- a/bigbluebutton-client/locale/it_IT/bbbResources.properties +++ b/bigbluebutton-client/locale/it_IT/bbbResources.properties @@ -1,4 +1,4 @@ -bbb.mainshell.locale.version = 0.81 +bbb.mainshell.locale.version = 0.8 bbb.mainshell.statusProgress.connecting = Connessione alla conferenza in corso... bbb.mainshell.statusProgress.loading = Caricamento {0} bbb.mainshell.statusProgress.cannotConnectServer = Errore di connessione. @@ -181,7 +181,10 @@ bbb.desktopPublish.closeBtn.toolTip = Interrompi la condivisione e chiudi questa bbb.desktopPublish.minimizeBtn.toolTip = Riduci questa finestra bbb.desktopPublish.minimizeBtn.accessibilityName = Minimizza la finestra di Condivisione del desktop bbb.desktopPublish.maximizeRestoreBtn.accessibilityName = Massimizza la finestra di Condivisione del desktop -bbb.desktopPublish.closeBtn.accessibilityName = Interrompi e Chiudi la finestra di Condivisione del desktop +bbb.desktopPublish.javaRequiredLabel = E' richiesto Java 7 update 45 o versione successiva +bbb.desktopPublish.javaTestLinkLabel = Test della versione Java +bbb.desktopPublish.javaTestLinkLabel.tooltip = Verifica versione Java +bbb.desktopPublish.javaTestLinkLabel.tooltip.accessibility = Verifica versione Java bbb.desktopView.title = Condivisione del desktop bbb.desktopView.fitToWindow = Adatta alla finestra bbb.desktopView.actualSize = Visualizza dimensione reale diff --git a/bigbluebutton-client/locale/ja_JP/bbbResources.properties b/bigbluebutton-client/locale/ja_JP/bbbResources.properties index d19150c0d1..f07027d548 100644 --- a/bigbluebutton-client/locale/ja_JP/bbbResources.properties +++ b/bigbluebutton-client/locale/ja_JP/bbbResources.properties @@ -181,7 +181,10 @@ bbb.desktopPublish.closeBtn.toolTip = 共有を停止し、閉じる bbb.desktopPublish.minimizeBtn.toolTip = 最小化 bbb.desktopPublish.minimizeBtn.accessibilityName = デスクトップ共有の公開ウィン​​ドウを最小化 bbb.desktopPublish.maximizeRestoreBtn.accessibilityName = デスクトップ共有の公開ウィン​​ドウを最大化 -bbb.desktopPublish.closeBtn.accessibilityName = 共有を停止し、デスクトップ共有の公開ウィンドウを閉じます +# bbb.desktopPublish.javaRequiredLabel = Requires Java 7u45 (or later) to run. +# bbb.desktopPublish.javaTestLinkLabel = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip.accessibility = Test Java bbb.desktopView.title = デスクトップ共有 bbb.desktopView.fitToWindow = ウィンドウに合わせる bbb.desktopView.actualSize = 実際のサイズを表示します diff --git a/bigbluebutton-client/locale/kk_KZ/bbbResources.properties b/bigbluebutton-client/locale/kk_KZ/bbbResources.properties index f717d17d17..1f44a8ff6f 100644 --- a/bigbluebutton-client/locale/kk_KZ/bbbResources.properties +++ b/bigbluebutton-client/locale/kk_KZ/bbbResources.properties @@ -181,7 +181,10 @@ bbb.chat.sendBtn = Жөнелту # bbb.desktopPublish.minimizeBtn.toolTip = Minimize # bbb.desktopPublish.minimizeBtn.accessibilityName = Minimize the Desktop Sharing Publish Window # bbb.desktopPublish.maximizeRestoreBtn.accessibilityName = Maximize the Desktop Sharing Publish Window -# bbb.desktopPublish.closeBtn.accessibilityName = Stop Sharing and Close the Desktop Sharing Publish Window +# bbb.desktopPublish.javaRequiredLabel = Requires Java 7u45 (or later) to run. +# bbb.desktopPublish.javaTestLinkLabel = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip.accessibility = Test Java # bbb.desktopView.title = Desktop Sharing # bbb.desktopView.fitToWindow = Fit to Window # bbb.desktopView.actualSize = Display actual size diff --git a/bigbluebutton-client/locale/km_KH/bbbResources.properties b/bigbluebutton-client/locale/km_KH/bbbResources.properties index b24eb98cfe..5a2c6f9655 100644 --- a/bigbluebutton-client/locale/km_KH/bbbResources.properties +++ b/bigbluebutton-client/locale/km_KH/bbbResources.properties @@ -181,7 +181,10 @@ # bbb.desktopPublish.minimizeBtn.toolTip = Minimize # bbb.desktopPublish.minimizeBtn.accessibilityName = Minimize the Desktop Sharing Publish Window # bbb.desktopPublish.maximizeRestoreBtn.accessibilityName = Maximize the Desktop Sharing Publish Window -# bbb.desktopPublish.closeBtn.accessibilityName = Stop Sharing and Close the Desktop Sharing Publish Window +# bbb.desktopPublish.javaRequiredLabel = Requires Java 7u45 (or later) to run. +# bbb.desktopPublish.javaTestLinkLabel = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip.accessibility = Test Java # bbb.desktopView.title = Desktop Sharing # bbb.desktopView.fitToWindow = Fit to Window # bbb.desktopView.actualSize = Display actual size diff --git a/bigbluebutton-client/locale/ko_KR/bbbResources.properties b/bigbluebutton-client/locale/ko_KR/bbbResources.properties index ad9fc327c2..4fe69e2726 100644 --- a/bigbluebutton-client/locale/ko_KR/bbbResources.properties +++ b/bigbluebutton-client/locale/ko_KR/bbbResources.properties @@ -181,7 +181,10 @@ bbb.desktopPublish.closeBtn.toolTip = 화면 공유를 중지하고 윈도우를 bbb.desktopPublish.minimizeBtn.toolTip = 윈도우를 최소화합니다. \# Minimize this window. bbb.desktopPublish.minimizeBtn.accessibilityName = 바탕화면 공유 게시 창 최소화 bbb.desktopPublish.maximizeRestoreBtn.accessibilityName = 바탕화면 공유 게시 창 최대화 -bbb.desktopPublish.closeBtn.accessibilityName = 공유를 멈추고 바탕화면 공유 게시 창 닫기 +# bbb.desktopPublish.javaRequiredLabel = Requires Java 7u45 (or later) to run. +# bbb.desktopPublish.javaTestLinkLabel = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip.accessibility = Test Java bbb.desktopView.title = 화면 공유 bbb.desktopView.fitToWindow = 윈도우에 맞게 정렬하기 \# Fit to Window bbb.desktopView.actualSize = 실제 화면사이즈로 \# Display actual size diff --git a/bigbluebutton-client/locale/lt_LT/bbbResources.properties b/bigbluebutton-client/locale/lt_LT/bbbResources.properties index 6baa3eff88..4cc3758a2a 100644 --- a/bigbluebutton-client/locale/lt_LT/bbbResources.properties +++ b/bigbluebutton-client/locale/lt_LT/bbbResources.properties @@ -1,66 +1,66 @@ bbb.mainshell.locale.version = 0.8 -# bbb.mainshell.statusProgress.connecting = Connecting to the server -bbb.mainshell.statusProgress.loading = ?k?limas\: -bbb.mainshell.statusProgress.cannotConnectServer = Atsiprašome, n?ra galimyb?s prisijungti prie serverio. +bbb.mainshell.statusProgress.connecting = Jungiamasi prie serverio +bbb.mainshell.statusProgress.loading = Kraunasi {0} moduliai +bbb.mainshell.statusProgress.cannotConnectServer = Atsiprašome, nėra galimybės prisijungti prie serverio. # bbb.mainshell.copyrightLabel2 = (c) 2013 BigBlueButton Inc. [build {0}] - For more information visit http\://www.bigbluebutton.org -bbb.mainshell.logBtn.toolTip = Atverti ?vyki? lang? -bbb.mainshell.resetLayoutBtn.toolTip = Atstatyti langus ? pradin? pad?t? -bbb.oldlocalewindow.reminder1 = You may have an old language translations of BigBlueButton. -bbb.oldlocalewindow.reminder2 = Please clear your browser's cache and try again. -bbb.oldlocalewindow.windowTitle = Warning\: Old Language Translations -# bbb.micSettings.speakers.header = Test Speakers +bbb.mainshell.logBtn.toolTip = Atidaryti prisijungimo langą +bbb.mainshell.resetLayoutBtn.toolTip = Atstatyti išdėstymą +bbb.oldlocalewindow.reminder1 = Jūs, tikriausiai turite senus BigBlueButton kalbos vertimus. +bbb.oldlocalewindow.reminder2 = Prašome išvalyti naršyklės talpyklą ir bandyti dar kartą. +bbb.oldlocalewindow.windowTitle = Įspėjimas\: Seni kalbų vertimai +bbb.micSettings.speakers.header = Testuoti garsiakalbius # bbb.micSettings.microphone.header = Test Microphone -# bbb.micSettings.playSound = Test Speakers -# bbb.micSettings.playSound.toolTip = Play music to test your speakers -# bbb.micSettings.hearFromHeadset = You should hear audio in your headset, not your computer speakers. -# bbb.micSettings.speakIntoMic = Test or change your microphone (headset recommended). -# bbb.micSettings.changeMic = Test or Change Microphone +bbb.micSettings.playSound = Testuoti garsiakalbius +bbb.micSettings.playSound.toolTip = Groti muziką, kad testuoti Jūsų garsiakalbius +bbb.micSettings.hearFromHeadset = Jūs turėtumėte išgirsti garsą per ausines, o ne per kompiuterio garsiakalbius. +bbb.micSettings.speakIntoMic = Patikrinti ar pakeisti mikrofoną (rekomenduojamos ausinės). +bbb.micSettings.changeMic = Tikrinti arba pakeisti mikrofoną # bbb.micSettings.changeMic.toolTip = Open the Flash Player microphone settings dialog box # bbb.micSettings.join = Join Audio -# bbb.micSettings.cancel = Cancel +bbb.micSettings.cancel = Atšaukti # bbb.micSettings.cancel.toolTip = Cancel joining the audio conference # bbb.micSettings.access.helpButton = Open tutorial videos in a new page. # bbb.micSettings.access.title = Audio Settings. Focus will remain in this audio settings window until the window is closed. bbb.mainToolbar.helpBtn = Pagalba bbb.mainToolbar.logoutBtn = Atsijungti bbb.mainToolbar.logoutBtn.toolTip = Atsijungti -# bbb.mainToolbar.langSelector = Select language -# bbb.mainToolbar.settingsBtn = Settings -# bbb.mainToolbar.settingsBtn.toolTip = Open Settings +bbb.mainToolbar.langSelector = Pasirinkti kalbą +bbb.mainToolbar.settingsBtn = Nustatymai +bbb.mainToolbar.settingsBtn.toolTip = Atidaryti nustatymus # bbb.mainToolbar.shortcutBtn = Shortcut Help # bbb.mainToolbar.shortcutBtn.toolTip = Open Shortcut Help window # bbb.window.minimizeBtn.toolTip = Minimize # bbb.window.maximizeRestoreBtn.toolTip = Maximize -# bbb.window.closeBtn.toolTip = Close +bbb.window.closeBtn.toolTip = Uždaryti # bbb.videoDock.titleBar = Webcam Window Title Bar # bbb.presentation.titleBar = Presentation Window Title Bar # bbb.chat.titleBar = Chat Window Title Bar -# bbb.users.title = Users{0} {1} +bbb.users.title = Vartotojai{0} {1} # bbb.users.titleBar = Users Window title bar # bbb.users.quickLink.label = Users Window # bbb.users.minimizeBtn.accessibilityName = Minimize the Users Window # bbb.users.maximizeRestoreBtn.accessibilityName = Maximize the Users Window -# bbb.users.settings.buttonTooltip = Settings -# bbb.users.settings.audioSettings = Audio Settings -# bbb.users.settings.webcamSettings = Webcam Settings -# bbb.users.settings.muteAll = Mute All Users +bbb.users.settings.buttonTooltip = Nustatymai +bbb.users.settings.audioSettings = Garso nustatymai +bbb.users.settings.webcamSettings = Vaizdo kameros nustatymai +bbb.users.settings.muteAll = Nutildyti visus dalyvius # bbb.users.settings.muteAllExcept = Mute All Users Except Presenter -# bbb.users.settings.unmuteAll = Unmute All Users -# bbb.users.settings.lowerAllHands = Lower All Hands -# bbb.users.raiseHandBtn.toolTip = Raise Hand +bbb.users.settings.unmuteAll = Įjungti garsą visiems vartotojams +bbb.users.settings.lowerAllHands = Nuleisti visas rankas +bbb.users.raiseHandBtn.toolTip = Pakelti ranką # bbb.users.pushToTalk.toolTip = Talk -# bbb.users.pushToMute.toolTip = Mute yourself +bbb.users.pushToMute.toolTip = Nutildyti save # bbb.users.muteMeBtnTxt.talk = Unmute -# bbb.users.muteMeBtnTxt.mute = Mute -# bbb.users.muteMeBtnTxt.muted = Muted +bbb.users.muteMeBtnTxt.mute = Nutildyti +bbb.users.muteMeBtnTxt.muted = Nutildytas # bbb.users.muteMeBtnTxt.unmuted = Unmuted -# bbb.users.usersGrid.accessibilityName = Users List. Use the arrow keys to navigate. +bbb.users.usersGrid.accessibilityName = Dalyvių sąrašas. Naudokite rodyklių klavišus, kad naviguoti. # bbb.users.usersGrid.nameItemRenderer = Name # bbb.users.usersGrid.nameItemRenderer.youIdentifier = you # bbb.users.usersGrid.statusItemRenderer = Status # bbb.users.usersGrid.statusItemRenderer.changePresenter = Change Presenter # bbb.users.usersGrid.statusItemRenderer.presenter = Presenter -# bbb.users.usersGrid.statusItemRenderer.moderator = Moderator +bbb.users.usersGrid.statusItemRenderer.moderator = Moderatorius # bbb.users.usersGrid.statusItemRenderer.lowerHand = Lower Hand # bbb.users.usersGrid.statusItemRenderer.handRaised = Hand Raised # bbb.users.usersGrid.statusItemRenderer.viewer = Viewer @@ -78,26 +78,26 @@ bbb.mainToolbar.logoutBtn.toolTip = Atsijungti # bbb.users.usersGrid.mediaItemRenderer.micOn = Microphone on # bbb.users.usersGrid.mediaItemRenderer.noAudio = Not in audio conference bbb.presentation.title = Prezentacija -# bbb.presentation.titleWithPres = Presentation\: {0} +bbb.presentation.titleWithPres = Prezentacija\: {0} # bbb.presentation.quickLink.label = Presentation Window # bbb.presentation.fitToWidth.toolTip = Fit presentation to width # bbb.presentation.fitToPage.toolTip = Fit presentation to page -bbb.presentation.uploadPresBtn.toolTip = ?kelti dokument? prezentacijai. -bbb.presentation.backBtn.toolTip = Buv?s puslapis. -# bbb.presentation.btnSlideNum.toolTip = Select a slide +bbb.presentation.uploadPresBtn.toolTip = Įkelti dokumentą prezentacijai. +bbb.presentation.backBtn.toolTip = Buvęs puslapis. +bbb.presentation.btnSlideNum.toolTip = Pažymėti skaidrę bbb.presentation.forwardBtn.toolTip = Sekantis puslapis bbb.presentation.maxUploadFileExceededAlert = Error\: The file is bigger than what's allowed. -bbb.presentation.uploadcomplete = ?k?limas baigtas. Prašome palaukti, vyksta konvertavimas. -bbb.presentation.uploaded = ?keltas. -bbb.presentation.document.supported = ?keltas dokumentas yra tinkamas. -bbb.presentation.document.converted = S?kmingai konvertuotas Office dokumentas. -bbb.presentation.error.document.convert.failed = Klaida konvertuojant Office dokument?. +bbb.presentation.uploadcomplete = Įkėlimas baigtas. Prašome palaukti, vyksta konvertavimas. +bbb.presentation.uploaded = įkeltas. +bbb.presentation.document.supported = Įkeltas dokumentas yra tinkamas. +bbb.presentation.document.converted = Sėkmingai konvertuotas Office dokumentas. +bbb.presentation.error.document.convert.failed = Klaida konvertuojant Office dokumentą. bbb.presentation.error.io = IO Klaida\: Susisiekite su administratoriumi. bbb.presentation.error.security = Apsaugos klaida\: Susisiekite su administratoriumi. -bbb.presentation.error.convert.notsupported = Klaida\: ?kelto dokumento tipas yra nepalaikomas. -bbb.presentation.error.convert.nbpage = Klaida nustatant puslapi? skai?i?. -bbb.presentation.error.convert.maxnbpagereach = Klaida\: ?keliamas dokumentas turi per daug lap?. -bbb.presentation.converted = Konvertuojamas {0} iš {1} puslapis. +bbb.presentation.error.convert.notsupported = Klaida\: įkelto dokumento tipas yra nepalaikomas. +bbb.presentation.error.convert.nbpage = Klaida\: Nepavyko nustati įkelto dokumento puslapių skaičiaus. +bbb.presentation.error.convert.maxnbpagereach = Klaida\: įkeltas dokumentas turi per daug puslapių. +bbb.presentation.converted = Konvertuojamas {0} iš {1} puslapių. bbb.presentation.ok = Gerai # bbb.presentation.slider = Presentation zoom level # bbb.presentation.slideloader.starttext = Slide text start @@ -107,20 +107,20 @@ bbb.presentation.uploadwindow.pdf = PDF bbb.presentation.uploadwindow.word = WORD bbb.presentation.uploadwindow.excel = EXCEL bbb.presentation.uploadwindow.powerpoint = POWERPOINT -bbb.presentation.uploadwindow.image = Paveiksl?lis +bbb.presentation.uploadwindow.image = Paveikslėlis # bbb.presentation.minimizeBtn.accessibilityName = Minimize the Presentation Window # bbb.presentation.maximizeRestoreBtn.accessibilityName = Maximize the Presentation Window # bbb.presentation.closeBtn.accessibilityName = Close the Presentation Window -bbb.fileupload.title = ?kelti prezentacij? +bbb.fileupload.title = Pridėti failus į Jūsų pristatymą bbb.fileupload.fileLbl = Failas\: -# bbb.fileupload.selectBtn.label = Select File -bbb.fileupload.selectBtn.toolTip = Surasti fail? -bbb.fileupload.uploadBtn = ?kelti -bbb.fileupload.uploadBtn.toolTip = ?kelti fail? -bbb.fileupload.presentationNamesLbl = ?keltos prezentacijos\: -bbb.fileupload.deleteBtn.toolTip = Ištrinti prezentacij? +bbb.fileupload.selectBtn.label = Pažymėti failą +bbb.fileupload.selectBtn.toolTip = Surasti failą +bbb.fileupload.uploadBtn = Įkelti +bbb.fileupload.uploadBtn.toolTip = Įkelti failą +bbb.fileupload.presentationNamesLbl = Įkeltos prezentacijos\: +bbb.fileupload.deleteBtn.toolTip = Ištrinti prezentaciją bbb.fileupload.showBtn = Parodyti -bbb.fileupload.showBtn.toolTip = Parodyti prezentacij? +bbb.fileupload.showBtn.toolTip = Parodyti prezentaciją bbb.fileupload.okCancelBtn = Atšaukti # bbb.fileupload.okCancelBtn.toolTip = Close the File Upload dialog box bbb.fileupload.genThumbText = Kuriama.. @@ -129,12 +129,12 @@ bbb.chat.title = Pokalbiai # bbb.chat.quickLink.label = Chat Window bbb.chat.cmpColorPicker.toolTip = Teksto spalva # bbb.chat.input.accessibilityName = Chat Message Editing Field -bbb.chat.sendBtn = Si?sti -bbb.chat.sendBtn.toolTip = Si?sti žinut? +bbb.chat.sendBtn = Siųsti +bbb.chat.sendBtn.toolTip = Siųsti žinutę # bbb.chat.sendBtn.accessibilityName = Send chat message bbb.chat.publicChatUsername = Visiems -# bbb.chat.optionsTabName = Options -# bbb.chat.privateChatSelect = Select a person to chat with privately +bbb.chat.optionsTabName = Parinktys +bbb.chat.privateChatSelect = Pasirinkite asmenį kalbėtis privačiai # bbb.chat.private.userLeft = The user has left. # bbb.chat.usersList.toolTip = Select a participant to open a private chat # bbb.chat.chatOptions = Chat Options @@ -145,11 +145,11 @@ bbb.chat.publicChatUsername = Visiems # bbb.chat.maximizeRestoreBtn.accessibilityName = Maximize the Chat Window # bbb.chat.closeBtn.accessibilityName = Close the Chat Window # bbb.chat.chatTabs.accessibleNotice = New messages in this tab. -# bbb.publishVideo.changeCameraBtn.labelText = Change Webcam +bbb.publishVideo.changeCameraBtn.labelText = Pakeisti vaizdo kamerą # bbb.publishVideo.changeCameraBtn.toolTip = Open the change webcam dialog box # bbb.publishVideo.cmbResolution.tooltip = Select a webcam resolution -# bbb.publishVideo.startPublishBtn.labelText = Start Sharing -bbb.publishVideo.startPublishBtn.toolTip = Prad?ti transliacij? +bbb.publishVideo.startPublishBtn.labelText = Pradėti bendrinti +bbb.publishVideo.startPublishBtn.toolTip = Pradėti vaizdo transliaciją # bbb.videodock.title = Webcams # bbb.videodock.quickLink.label = Webcams Window # bbb.video.minimizeBtn.accessibilityName = Minimize the Webcams Window @@ -167,21 +167,24 @@ bbb.publishVideo.startPublishBtn.toolTip = Prad?ti transliacij? # bbb.video.publish.hint.cameraIsBeingUsed = Your webcam is being used by another application # bbb.video.publish.hint.publishing = Publishing... # bbb.video.publish.closeBtn.accessName = Close the webcam settings dialog box -# bbb.video.publish.closeBtn.label = Cancel +bbb.video.publish.closeBtn.label = Atšaukti # bbb.video.publish.titleBar = Publish Webcam Window bbb.desktopPublish.title = Ekrano rodymas kitiems # bbb.desktopPublish.fullscreen.tooltip = Share your whole screen -# bbb.desktopPublish.fullscreen.label = Full Screen +bbb.desktopPublish.fullscreen.label = Per visą ekraną # bbb.desktopPublish.region.tooltip = Share a part of your screen # bbb.desktopPublish.region.label = Region # bbb.desktopPublish.stop.tooltip = Close screen share -# bbb.desktopPublish.stop.label = Close +bbb.desktopPublish.stop.label = Uždaryti # bbb.desktopPublish.maximizeRestoreBtn.toolTip = You cannot maximize this window. # bbb.desktopPublish.closeBtn.toolTip = Stop Sharing and Close # bbb.desktopPublish.minimizeBtn.toolTip = Minimize # bbb.desktopPublish.minimizeBtn.accessibilityName = Minimize the Desktop Sharing Publish Window # bbb.desktopPublish.maximizeRestoreBtn.accessibilityName = Maximize the Desktop Sharing Publish Window -# bbb.desktopPublish.closeBtn.accessibilityName = Stop Sharing and Close the Desktop Sharing Publish Window +# bbb.desktopPublish.javaRequiredLabel = Requires Java 7u45 (or later) to run. +# bbb.desktopPublish.javaTestLinkLabel = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip.accessibility = Test Java # bbb.desktopView.title = Desktop Sharing # bbb.desktopView.fitToWindow = Fit to Window # bbb.desktopView.actualSize = Display actual size @@ -206,19 +209,19 @@ bbb.desktopPublish.title = Ekrano rodymas kitiems # bbb.layout.save.complete = Layouts were successfully saved # bbb.layout.load.complete = Layouts were successfully loaded # bbb.layout.load.failed = Failed to load the layouts -# bbb.highlighter.toolbar.pencil = Pencil +bbb.highlighter.toolbar.pencil = Pieštukas # bbb.highlighter.toolbar.pencil.accessibilityName = Switch whiteboard cursor to pencil -# bbb.highlighter.toolbar.ellipse = Circle +bbb.highlighter.toolbar.ellipse = Apskritimas # bbb.highlighter.toolbar.ellipse.accessibilityName = Switch whiteboard cursor to circle -# bbb.highlighter.toolbar.rectangle = Rectangle +bbb.highlighter.toolbar.rectangle = Stačiakampis # bbb.highlighter.toolbar.rectangle.accessibilityName = Switch whiteboard cursor to rectangle # bbb.highlighter.toolbar.panzoom = Pan and Zoom # bbb.highlighter.toolbar.panzoom.accessibilityName = Switch whiteboard cursor to pan and zoom -# bbb.highlighter.toolbar.clear = Clear Page +bbb.highlighter.toolbar.clear = Išvalyti puslapį # bbb.highlighter.toolbar.clear.accessibilityName = Clear the whiteboard page # bbb.highlighter.toolbar.undo = Undo Shape # bbb.highlighter.toolbar.undo.accessibilityName = Undo the last whiteboard shape -# bbb.highlighter.toolbar.color = Select Color +bbb.highlighter.toolbar.color = Pasirinkti spalvą # bbb.highlighter.toolbar.color.accessibilityName = Whiteboard mark draw color # bbb.highlighter.toolbar.thickness = Change Thickness # bbb.highlighter.toolbar.thickness.accessibilityName = Whiteboard draw thickness @@ -237,33 +240,33 @@ bbb.logout.button.label = Gerai # bbb.logout.confirm.yes = Yes # bbb.logout.confirm.no = No # bbb.notes.title = Notes -# bbb.notes.cmpColorPicker.toolTip = Text Color -# bbb.notes.saveBtn = Save +bbb.notes.cmpColorPicker.toolTip = Teksto spalva +bbb.notes.saveBtn = Išsaugoti # bbb.notes.saveBtn.toolTip = Save Note # bbb.settings.deskshare.instructions = Choose Allow on the prompt that pops up to check that desktop sharing is working properly for you # bbb.settings.deskshare.start = Check Desktop Sharing # bbb.settings.voice.volume = Microphone Activity -# bbb.settings.java.label = Java version error +bbb.settings.java.label = Java versijos klaida # bbb.settings.java.text = You have Java {0} installed, but you need at least version {1} to use the BigBlueButton desktop sharing feature. The button below will install the newest Java JRE version. -# bbb.settings.java.command = Install newest Java -# bbb.settings.flash.label = Flash version error +bbb.settings.java.command = Įdiegti naujesnę Java +bbb.settings.flash.label = Flash versijos klaida # bbb.settings.flash.text = You have Flash {0} installed, but you need at least version {1} to run BigBlueButton properly. The button below will install the newest Adobe Flash version. # bbb.settings.flash.command = Install newest Flash # bbb.settings.isight.label = iSight webcam error # bbb.settings.isight.text = If you have problems with your iSight webcam, it may be because you are running OS X 10.6.5, which is known to have a problem with Flash capturing video from the iSight webcam. \n To correct this, the link below will install a newer version of Flash player, or update your Mac to the newest version # bbb.settings.isight.command = Install Flash 10.2 RC2 -# bbb.settings.warning.label = Warning +bbb.settings.warning.label = Įspėjimas # bbb.settings.warning.close = Close this Warning # bbb.settings.noissues = No outstanding issues have been detected. # bbb.settings.instructions = Accept the Flash prompt that asks you for webcam permissions. If the output matches what is expected, your browser has been set up correctly. Other potentials issues are below. Examine them to find a possible solution. -# ltbcustom.bbb.highlighter.toolbar.triangle = Triangle +ltbcustom.bbb.highlighter.toolbar.triangle = Trikampis # ltbcustom.bbb.highlighter.toolbar.triangle.accessibilityName = Switch whiteboard cursor to triangle -# ltbcustom.bbb.highlighter.toolbar.line = Line +ltbcustom.bbb.highlighter.toolbar.line = Linija # ltbcustom.bbb.highlighter.toolbar.line.accessibilityName = Switch whiteboard cursor to line -# ltbcustom.bbb.highlighter.toolbar.text = Text +ltbcustom.bbb.highlighter.toolbar.text = Tekstas # ltbcustom.bbb.highlighter.toolbar.text.accessibilityName = Switch whiteboard cursor to text -# ltbcustom.bbb.highlighter.texttoolbar.textColorPicker = Text color -# ltbcustom.bbb.highlighter.texttoolbar.textSizeMenu = Font size +ltbcustom.bbb.highlighter.texttoolbar.textColorPicker = Teksto spalva +ltbcustom.bbb.highlighter.texttoolbar.textSizeMenu = Šrifto dydis # bbb.accessibility.chat.chatBox.reachedFirst = You have reached the first message. # bbb.accessibility.chat.chatBox.reachedLatest = You have reached the latest message. @@ -289,99 +292,99 @@ bbb.logout.button.label = Gerai # bbb.shortcuthelp.headers.shortcut = Shortcut # bbb.shortcuthelp.headers.function = Function -# bbb.shortcutkey.general.minimize = 189 +bbb.shortcutkey.general.minimize = 189 # bbb.shortcutkey.general.minimize.function = Minimize current window -# bbb.shortcutkey.general.maximize = 187 +bbb.shortcutkey.general.maximize = 187 # bbb.shortcutkey.general.maximize.function = Maximize current window -# bbb.shortcutkey.flash.exit = 81 +bbb.shortcutkey.flash.exit = 81 # bbb.shortcutkey.flash.exit.function = Focus out of the Flash window -# bbb.shortcutkey.users.muteme = 77 +bbb.shortcutkey.users.muteme = 77 # bbb.shortcutkey.users.muteme.function = Mute and Unmute your microphone -# bbb.shortcutkey.chat.chatinput = 73 +bbb.shortcutkey.chat.chatinput = 73 # bbb.shortcutkey.chat.chatinput.function = Focus the chat input field -# bbb.shortcutkey.present.focusslide = 67 +bbb.shortcutkey.present.focusslide = 67 # bbb.shortcutkey.present.focusslide.function = Focus the presentation slide -# bbb.shortcutkey.whiteboard.undo = 90 +bbb.shortcutkey.whiteboard.undo = 90 # bbb.shortcutkey.whiteboard.undo.function = Undo last whiteboard mark -# bbb.shortcutkey.focus.users = 49 +bbb.shortcutkey.focus.users = 49 # bbb.shortcutkey.focus.users.function = Move focus to the Users window -# bbb.shortcutkey.focus.video = 50 +bbb.shortcutkey.focus.video = 50 # bbb.shortcutkey.focus.video.function = Move focus to the Webcam window -# bbb.shortcutkey.focus.presentation = 51 +bbb.shortcutkey.focus.presentation = 51 # bbb.shortcutkey.focus.presentation.function = Move focus to the Presentation window -# bbb.shortcutkey.focus.chat = 52 +bbb.shortcutkey.focus.chat = 52 # bbb.shortcutkey.focus.chat.function = Move focus to the Chat window -# bbb.shortcutkey.focus.pollingCreate = 67 +bbb.shortcutkey.focus.pollingCreate = 67 # bbb.shortcutkey.focus.pollingCreate.function = Move focus to the Poll Creation window, if it is open. -# bbb.shortcutkey.focus.pollingStats = 83 +bbb.shortcutkey.focus.pollingStats = 83 # bbb.shortcutkey.focus.pollingStats.function = Move focus to the Poll Statistics window, if it is open. -# bbb.shortcutkey.focus.voting = 89 +bbb.shortcutkey.focus.voting = 89 # bbb.shortcutkey.focus.voting.function = Move focus to the Voting window, if it is open. -# bbb.shortcutkey.share.desktop = 68 +bbb.shortcutkey.share.desktop = 68 # bbb.shortcutkey.share.desktop.function = Open desktop sharing window -# bbb.shortcutkey.share.microphone = 79 +bbb.shortcutkey.share.microphone = 79 # bbb.shortcutkey.share.microphone.function = Open audio settings window -# bbb.shortcutkey.share.webcam = 66 +bbb.shortcutkey.share.webcam = 66 # bbb.shortcutkey.share.webcam.function = Open webcam sharing window -# bbb.shortcutkey.shortcutWindow = 72 +bbb.shortcutkey.shortcutWindow = 72 # bbb.shortcutkey.shortcutWindow.function = Open/focus to shortcut help window -# bbb.shortcutkey.logout = 76 +bbb.shortcutkey.logout = 76 # bbb.shortcutkey.logout.function = Log out of this meeting -# bbb.shortcutkey.raiseHand = 82 +bbb.shortcutkey.raiseHand = 82 # bbb.shortcutkey.raiseHand.function = Raise your hand -# bbb.shortcutkey.present.upload = 85 +bbb.shortcutkey.present.upload = 85 # bbb.shortcutkey.present.upload.function = Upload presentation -# bbb.shortcutkey.present.previous = 65 +bbb.shortcutkey.present.previous = 65 # bbb.shortcutkey.present.previous.function = Go to previous slide -# bbb.shortcutkey.present.select = 83 +bbb.shortcutkey.present.select = 83 # bbb.shortcutkey.present.select.function = View all slides -# bbb.shortcutkey.present.next = 69 +bbb.shortcutkey.present.next = 69 # bbb.shortcutkey.present.next.function = Go to next slide -# bbb.shortcutkey.present.fitWidth = 70 +bbb.shortcutkey.present.fitWidth = 70 # bbb.shortcutkey.present.fitWidth.function = Fit slides to width -# bbb.shortcutkey.present.fitPage = 80 +bbb.shortcutkey.present.fitPage = 80 # bbb.shortcutkey.present.fitPage.function = Fit slides to page -# bbb.shortcutkey.users.makePresenter = 80 +bbb.shortcutkey.users.makePresenter = 80 # bbb.shortcutkey.users.makePresenter.function = Make selected person presenter -# bbb.shortcutkey.users.kick = 75 +bbb.shortcutkey.users.kick = 75 # bbb.shortcutkey.users.kick.function = Kick selected person from the meeting -# bbb.shortcutkey.users.mute = 83 +bbb.shortcutkey.users.mute = 83 # bbb.shortcutkey.users.mute.function = Mute or unmute selected person -# bbb.shortcutkey.users.muteall = 65 +bbb.shortcutkey.users.muteall = 65 # bbb.shortcutkey.users.muteall.function = Mute or unmute all users -# bbb.shortcutkey.users.focusUsers = 85 +bbb.shortcutkey.users.focusUsers = 85 # bbb.shortcutkey.users.focusUsers.function = Focus to users list -# bbb.shortcutkey.users.muteAllButPres = 65 +bbb.shortcutkey.users.muteAllButPres = 65 # bbb.shortcutkey.users.muteAllButPres.function = Mute everyone but the Presenter -# bbb.shortcutkey.chat.focusTabs = 89 +bbb.shortcutkey.chat.focusTabs = 89 # bbb.shortcutkey.chat.focusTabs.function = Focus to chat tabs -# bbb.shortcutkey.chat.focusBox = 66 +bbb.shortcutkey.chat.focusBox = 66 # bbb.shortcutkey.chat.focusBox.function = Focus to chat box -# bbb.shortcutkey.chat.changeColour = 67 +bbb.shortcutkey.chat.changeColour = 67 # bbb.shortcutkey.chat.changeColour.function = Focus to font color picker. -# bbb.shortcutkey.chat.sendMessage = 83 +bbb.shortcutkey.chat.sendMessage = 83 # bbb.shortcutkey.chat.sendMessage.function = Send chat message # bbb.shortcutkey.chat.explanation = ---- # bbb.shortcutkey.chat.explanation.function = For message navigation, you must focus the chat box. -# bbb.shortcutkey.chat.chatbox.advance = 40 +bbb.shortcutkey.chat.chatbox.advance = 40 # bbb.shortcutkey.chat.chatbox.advance.function = Navigate to the next message -# bbb.shortcutkey.chat.chatbox.goback = 38 +bbb.shortcutkey.chat.chatbox.goback = 38 # bbb.shortcutkey.chat.chatbox.goback.function = Navigate to the previous message -# bbb.shortcutkey.chat.chatbox.repeat = 32 +bbb.shortcutkey.chat.chatbox.repeat = 32 # bbb.shortcutkey.chat.chatbox.repeat.function = Repeat current message -# bbb.shortcutkey.chat.chatbox.golatest = 39 +bbb.shortcutkey.chat.chatbox.golatest = 39 # bbb.shortcutkey.chat.chatbox.golatest.function = Navigate to the latest message -# bbb.shortcutkey.chat.chatbox.gofirst = 37 +bbb.shortcutkey.chat.chatbox.gofirst = 37 # bbb.shortcutkey.chat.chatbox.gofirst.function = Navigate to the first message -# bbb.shortcutkey.chat.chatbox.goread = 75 +bbb.shortcutkey.chat.chatbox.goread = 75 # bbb.shortcutkey.chat.chatbox.goread.function = Navigate to the most recent message you've read # bbb.shortcutkey.chat.chatbox.debug = 71 # bbb.shortcutkey.chat.chatbox.debug.function = Temporary debug hotkey @@ -390,7 +393,7 @@ bbb.logout.button.label = Gerai # bbb.polling.createPoll.moreThanOneResponse = Allow users to choose more than one response # bbb.polling.createPoll.hint = Hint\: Start every answer with a new line # bbb.polling.createPoll.answers = Answers\: -# bbb.polling.createPoll.question = Question\: +bbb.polling.createPoll.question = Klausimas\: # bbb.polling.createPoll.title = Title\: # bbb.polling.createPoll.publishToWeb = Enable web polling @@ -398,8 +401,8 @@ bbb.logout.button.label = Gerai # bbb.polling.pollPreview.modify = Modify # bbb.polling.pollPreview.publish = Publish # bbb.polling.pollPreview.preview = Preview -# bbb.polling.pollPreview.save = Save -# bbb.polling.pollPreview.cancel = Cancel +bbb.polling.pollPreview.save = Išsaugoti +bbb.polling.pollPreview.cancel = Atšaukti # bbb.polling.pollPreview.modify = Modify # bbb.polling.pollPreview.hereIsYourPoll = Here is your poll\: # bbb.polling.pollPreview.ifYouWantChanges = if you want to make any changes use the 'Modify' button @@ -421,7 +424,7 @@ bbb.logout.button.label = Gerai # bbb.polling.toolbar.toolTip = Polling # bbb.polling.stats.repost = Repost -# bbb.polling.stats.close = Close +bbb.polling.stats.close = Uždaryti # bbb.polling.stats.didNotVote = Did Not Vote # bbb.polling.stats.refresh = Refresh # bbb.polling.stats.stopPoll = Stop Poll @@ -436,53 +439,53 @@ bbb.logout.button.label = Gerai # bbb.polling.vote.error.radio = Please select an option, or close this window to not vote. # bbb.polling.vote.error.check = Please select one or more options, or close this window to not vote. -# bbb.publishVideo.startPublishBtn.labelText = Start Sharing -# bbb.publishVideo.changeCameraBtn.labelText = Change Webcam +bbb.publishVideo.startPublishBtn.labelText = Pradėti bendrinti +bbb.publishVideo.changeCameraBtn.labelText = Pakeisti vaizdo kamerą # bbb.accessibility.alerts.madePresenter = You are now the Presenter. # bbb.accessibility.alerts.madeViewer = You are now a Viewer. -# bbb.shortcutkey.polling.buttonClick = 80 +bbb.shortcutkey.polling.buttonClick = 80 # bbb.shortcutkey.polling.buttonClick.function = Open the Polling Menu. -# bbb.shortcutkey.polling.focusTitle = 67 +bbb.shortcutkey.polling.focusTitle = 67 # bbb.shortcutkey.polling.focusTitle.function = Focus to Title input box. -# bbb.shortcutkey.polling.focusQuestion = 81 +bbb.shortcutkey.polling.focusQuestion = 81 # bbb.shortcutkey.polling.focusQuestion.function = Focus to Question input box. -# bbb.shortcutkey.polling.focusAnswers = 65 +bbb.shortcutkey.polling.focusAnswers = 65 # bbb.shortcutkey.polling.focusAnswers.function = Focus to Answers input box. -# bbb.shortcutkey.polling.focusMultipleCB = 77 +bbb.shortcutkey.polling.focusMultipleCB = 77 # bbb.shortcutkey.polling.focusMultipleCB.function = Focus to "Allow multiple selections" checkbox. -# bbb.shortcutkey.polling.focusWebPollCB = 66 +bbb.shortcutkey.polling.focusWebPollCB = 66 # bbb.shortcutkey.polling.focusWebPollCB.function = Focus to "Enable web polling" checkbox. -# bbb.shortcutkey.polling.previewClick = 80 +bbb.shortcutkey.polling.previewClick = 80 # bbb.shortcutkey.polling.previewClick.function = Preview your poll and proceed. # bbb.shortcutkey.polling.cancelClick = 88 # bbb.shortcutkey.polling.cancelClick.function = Cancel and exit Poll creation. -# bbb.shortcutkey.polling.modify = 69 +bbb.shortcutkey.polling.modify = 69 # bbb.shortcutkey.polling.modify.function = Go back and modify your poll. -# bbb.shortcutkey.polling.publish = 85 +bbb.shortcutkey.polling.publish = 85 # bbb.shortcutkey.polling.publish.function = Publish your poll and open voting. -# bbb.shortcutkey.polling.save = 83 +bbb.shortcutkey.polling.save = 83 # bbb.shortcutkey.polling.save.function = Save your poll to use later. # bbb.shortcutkey.pollStats.explanation = ---- # bbb.shortcutkey.pollStats.explanation.function = Poll results are only available once the poll has been published. -# bbb.shortcutkey.polling.focusData = 68 +bbb.shortcutkey.polling.focusData = 68 # bbb.shortcutkey.polling.focusData.function = Focus to poll results. -# bbb.shortcutkey.polling.refresh = 82 +bbb.shortcutkey.polling.refresh = 82 # bbb.shortcutkey.polling.refresh.function = Refresh poll results. -# bbb.shortcutkey.polling.focusWebPoll = 73 +bbb.shortcutkey.polling.focusWebPoll = 73 # bbb.shortcutkey.polling.focusWebPoll.function = Focus to web polling URL box. -# bbb.shortcutkey.polling.stopPoll = 79 +bbb.shortcutkey.polling.stopPoll = 79 # bbb.shortcutkey.polling.stopPoll.function = Stop the poll and end voting. -# bbb.shortcutkey.polling.repostPoll = 80 +bbb.shortcutkey.polling.repostPoll = 80 # bbb.shortcutkey.polling.repostPoll.function = Re-publish the poll. # bbb.shortcutkey.polling.closeStatsWindow = 88 # bbb.shortcutkey.polling.closeStatsWindow.function = Close Polling Results window. # bbb.shortcutkey.polling.vote = 86 # bbb.shortcutkey.polling.vote.function = Cast your vote for the options selected. -# bbb.shortcutkey.polling.focusVoteQuestion = 81 +bbb.shortcutkey.polling.focusVoteQuestion = 81 # bbb.shortcutkey.polling.focusVoteQuestion.function = Focus to question. # bbb.shortcutkey.specialKeys.space = Spacebar diff --git a/bigbluebutton-client/locale/lv_LV/bbbResources.properties b/bigbluebutton-client/locale/lv_LV/bbbResources.properties index 493a5c12be..172a932da6 100644 --- a/bigbluebutton-client/locale/lv_LV/bbbResources.properties +++ b/bigbluebutton-client/locale/lv_LV/bbbResources.properties @@ -181,7 +181,10 @@ bbb.desktopPublish.closeBtn.toolTip = Aptur?t raid?šanu un aizv?rt šo logu. bbb.desktopPublish.minimizeBtn.toolTip = Minimiz?t šo logu. # bbb.desktopPublish.minimizeBtn.accessibilityName = Minimize the Desktop Sharing Publish Window # bbb.desktopPublish.maximizeRestoreBtn.accessibilityName = Maximize the Desktop Sharing Publish Window -# bbb.desktopPublish.closeBtn.accessibilityName = Stop Sharing and Close the Desktop Sharing Publish Window +# bbb.desktopPublish.javaRequiredLabel = Requires Java 7u45 (or later) to run. +# bbb.desktopPublish.javaTestLinkLabel = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip.accessibility = Test Java bbb.desktopView.title = Darbavirsmas raid?šana bbb.desktopView.fitToWindow = Ietilpin?t log? bbb.desktopView.actualSize = R?d?t re?laj? izm?r? diff --git a/bigbluebutton-client/locale/ml_IN/bbbResources.properties b/bigbluebutton-client/locale/ml_IN/bbbResources.properties index 110905e1b5..6358b78ecb 100644 --- a/bigbluebutton-client/locale/ml_IN/bbbResources.properties +++ b/bigbluebutton-client/locale/ml_IN/bbbResources.properties @@ -181,7 +181,10 @@ bbb.presentation.title = അവതരണം # bbb.desktopPublish.minimizeBtn.toolTip = Minimize # bbb.desktopPublish.minimizeBtn.accessibilityName = Minimize the Desktop Sharing Publish Window # bbb.desktopPublish.maximizeRestoreBtn.accessibilityName = Maximize the Desktop Sharing Publish Window -# bbb.desktopPublish.closeBtn.accessibilityName = Stop Sharing and Close the Desktop Sharing Publish Window +# bbb.desktopPublish.javaRequiredLabel = Requires Java 7u45 (or later) to run. +# bbb.desktopPublish.javaTestLinkLabel = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip.accessibility = Test Java # bbb.desktopView.title = Desktop Sharing # bbb.desktopView.fitToWindow = Fit to Window # bbb.desktopView.actualSize = Display actual size diff --git a/bigbluebutton-client/locale/mn_MN/bbbResources.properties b/bigbluebutton-client/locale/mn_MN/bbbResources.properties index d8203ea257..b445698525 100644 --- a/bigbluebutton-client/locale/mn_MN/bbbResources.properties +++ b/bigbluebutton-client/locale/mn_MN/bbbResources.properties @@ -181,7 +181,10 @@ bbb.desktopPublish.closeBtn.toolTip = Хуваалтуудыг зогсоож э bbb.desktopPublish.minimizeBtn.toolTip = Цонхыг нуух # bbb.desktopPublish.minimizeBtn.accessibilityName = Minimize the Desktop Sharing Publish Window # bbb.desktopPublish.maximizeRestoreBtn.accessibilityName = Maximize the Desktop Sharing Publish Window -# bbb.desktopPublish.closeBtn.accessibilityName = Stop Sharing and Close the Desktop Sharing Publish Window +# bbb.desktopPublish.javaRequiredLabel = Requires Java 7u45 (or later) to run. +# bbb.desktopPublish.javaTestLinkLabel = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip.accessibility = Test Java bbb.desktopView.title = Дэлгэцээ хуваах bbb.desktopView.fitToWindow = Цонхонд тохируулах bbb.desktopView.actualSize = Оригнал хэмжээг харуулах diff --git a/bigbluebutton-client/locale/ms_MY/bbbResources.properties b/bigbluebutton-client/locale/ms_MY/bbbResources.properties index 184cdc5362..75634d2258 100644 --- a/bigbluebutton-client/locale/ms_MY/bbbResources.properties +++ b/bigbluebutton-client/locale/ms_MY/bbbResources.properties @@ -9,7 +9,7 @@ bbb.oldlocalewindow.reminder1 = Anda mungkin menggunakan terjemahan bahasa yang bbb.oldlocalewindow.reminder2 = Sila kosongkan cache browser dan cuba sekali lagi. bbb.oldlocalewindow.windowTitle = Perhatian\: Bahasa Terjemahan yang lama. bbb.micSettings.speakers.header = Cubaan Pembesar Suara -# bbb.micSettings.microphone.header = Test Microphone +bbb.micSettings.microphone.header = Uji Mikrofon bbb.micSettings.playSound = Cubaan Pembesar Suara bbb.micSettings.playSound.toolTip = Mainkan muzik untuk mencuba pembesar suara anda bbb.micSettings.hearFromHeadset = Anda sepatutnya mendengar audio di headset, bukannya di speker komputer anda. @@ -17,8 +17,8 @@ bbb.micSettings.speakIntoMic = Cuba atau tukar mikrofon anda (headset disyorkan) bbb.micSettings.changeMic = Cuba atau Tukar Mikrofon bbb.micSettings.changeMic.toolTip = Buka tetapan mikrofon Flash Player dialog box bbb.micSettings.join = Sertai Audio -# bbb.micSettings.cancel = Cancel -# bbb.micSettings.cancel.toolTip = Cancel joining the audio conference +bbb.micSettings.cancel = Batal +bbb.micSettings.cancel.toolTip = Batal menyertai persidangan audio bbb.micSettings.access.helpButton = Buka tutorial video di dalam halaman yang baru. bbb.micSettings.access.title = Tetapan Audio. Fokus akan kekal di dalam tetapan audio window sehinggalah window ditutup. bbb.mainToolbar.helpBtn = Bantuan @@ -37,7 +37,7 @@ bbb.presentation.titleBar = Presentation Window Title Bar bbb.chat.titleBar = Chat Window Title Bar bbb.users.title = Pengguna{0} {1} bbb.users.titleBar = Users Window title bar -# bbb.users.quickLink.label = Users Window +bbb.users.quickLink.label = Window pengguna bbb.users.minimizeBtn.accessibilityName = Kecilkan Users Window bbb.users.maximizeRestoreBtn.accessibilityName = Besarkan Users Window bbb.users.settings.buttonTooltip = Tetapan @@ -79,7 +79,7 @@ bbb.users.usersGrid.mediaItemRenderer.micOn = Mikrofon buka bbb.users.usersGrid.mediaItemRenderer.noAudio = Tidak di dalam sidang audio bbb.presentation.title = Presentation bbb.presentation.titleWithPres = Presentation\: {0} -# bbb.presentation.quickLink.label = Presentation Window +bbb.presentation.quickLink.label = Window pembentangan bbb.presentation.fitToWidth.toolTip = Muatkan presentation ke lebar bbb.presentation.fitToPage.toolTip = Muatkan presentation ke halaman bbb.presentation.uploadPresBtn.toolTip = Buka Upload Presentation dialog box @@ -126,7 +126,7 @@ bbb.fileupload.okCancelBtn.toolTip = Tutup Muatnaik Fail dialog box bbb.fileupload.genThumbText = Menjana image.. bbb.fileupload.progBarLbl = Progres\: bbb.chat.title = Chat -# bbb.chat.quickLink.label = Chat Window +bbb.chat.quickLink.label = Window chat bbb.chat.cmpColorPicker.toolTip = Warna teks bbb.chat.input.accessibilityName = Mesej Chat Editing Field bbb.chat.sendBtn = Hantar @@ -151,58 +151,61 @@ bbb.publishVideo.cmbResolution.tooltip = Pilih resolusi webcam bbb.publishVideo.startPublishBtn.labelText = Mulakan Perkongsian bbb.publishVideo.startPublishBtn.toolTip = Mulakan berkongsi webcam anda bbb.videodock.title = Webcam -# bbb.videodock.quickLink.label = Webcams Window +bbb.videodock.quickLink.label = Window webcams bbb.video.minimizeBtn.accessibilityName = Kecilkan Webcam Window bbb.video.maximizeRestoreBtn.accessibilityName = Besarkan Webcam Window # bbb.video.controls.muteButton.toolTip = Mute or unmute {0} # bbb.video.controls.switchPresenter.toolTip = Make {0} presenter # bbb.video.controls.ejectUserBtn.toolTip = Eject {0} from meeting bbb.video.controls.privateChatBtn.toolTip = Chat bersama {0} -# bbb.video.publish.hint.noCamera = No webcam available +bbb.video.publish.hint.noCamera = Tiada webcam tersedia bbb.video.publish.hint.cantOpenCamera = Tidak boleh memulakan webcam anda -# bbb.video.publish.hint.waitingApproval = Waiting for approval -# bbb.video.publish.hint.videoPreview = Webcam preview +bbb.video.publish.hint.waitingApproval = Menunggu kelulusan +bbb.video.publish.hint.videoPreview = Webcam preview bbb.video.publish.hint.openingCamera = Memulakan webcam... -# bbb.video.publish.hint.cameraDenied = Webcam access denied -# bbb.video.publish.hint.cameraIsBeingUsed = Your webcam is being used by another application +bbb.video.publish.hint.cameraDenied = Webcam dinafikan akses +bbb.video.publish.hint.cameraIsBeingUsed = Webcam anda sedang digunakan oleh aplikasi lain # bbb.video.publish.hint.publishing = Publishing... # bbb.video.publish.closeBtn.accessName = Close the webcam settings dialog box -# bbb.video.publish.closeBtn.label = Cancel +bbb.video.publish.closeBtn.label = Batal # bbb.video.publish.titleBar = Publish Webcam Window # bbb.desktopPublish.title = Desktop Sharing\: Presenter's Preview -# bbb.desktopPublish.fullscreen.tooltip = Share your whole screen -# bbb.desktopPublish.fullscreen.label = Full Screen -# bbb.desktopPublish.region.tooltip = Share a part of your screen -# bbb.desktopPublish.region.label = Region -# bbb.desktopPublish.stop.tooltip = Close screen share +bbb.desktopPublish.fullscreen.tooltip = Kongsi seluruh skrin anda +bbb.desktopPublish.fullscreen.label = Skrin penuh +bbb.desktopPublish.region.tooltip = Kongsi sebahagian skrin anda +bbb.desktopPublish.region.label = Wilayah +bbb.desktopPublish.stop.tooltip = Tutup perkongsian skrin bbb.desktopPublish.stop.label = Tutup # bbb.desktopPublish.maximizeRestoreBtn.toolTip = You cannot maximize this window. -# bbb.desktopPublish.closeBtn.toolTip = Stop Sharing and Close +bbb.desktopPublish.closeBtn.toolTip = Henti Perkongsian dan Tutup bbb.desktopPublish.minimizeBtn.toolTip = Kecilkan # bbb.desktopPublish.minimizeBtn.accessibilityName = Minimize the Desktop Sharing Publish Window # bbb.desktopPublish.maximizeRestoreBtn.accessibilityName = Maximize the Desktop Sharing Publish Window -# bbb.desktopPublish.closeBtn.accessibilityName = Stop Sharing and Close the Desktop Sharing Publish Window +# bbb.desktopPublish.javaRequiredLabel = Requires Java 7u45 (or later) to run. +bbb.desktopPublish.javaTestLinkLabel = Uji Java +bbb.desktopPublish.javaTestLinkLabel.tooltip = Uji Java +bbb.desktopPublish.javaTestLinkLabel.tooltip.accessibility = Uji Java bbb.desktopView.title = Perkongsian Desktop # bbb.desktopView.fitToWindow = Fit to Window -# bbb.desktopView.actualSize = Display actual size +bbb.desktopView.actualSize = Paparkan saiz sebenar # bbb.desktopView.minimizeBtn.accessibilityName = Minimize the Desktop Sharing View Window # bbb.desktopView.maximizeRestoreBtn.accessibilityName = Maximize the Desktop Sharing View Window # bbb.desktopView.closeBtn.accessibilityName = Close the Desktop Sharing View Window bbb.toolbar.phone.toolTip.start = Sertai Audio # bbb.toolbar.phone.toolTip.stop = Leave Audio bbb.toolbar.deskshare.toolTip.start = Kongsi My Desktop -# bbb.toolbar.deskshare.toolTip.stop = Stop Sharing My Desktop +bbb.toolbar.deskshare.toolTip.stop = Henti Kongsi My Desktop bbb.toolbar.video.toolTip.start = Kongsi My Webcam -# bbb.toolbar.video.toolTip.stop = Stop Sharing My Webcam +bbb.toolbar.video.toolTip.stop = Henti Kongsi My Webcam # bbb.layout.addButton.toolTip = Add the custom layout to the list -# bbb.layout.combo.toolTip = Change the current layout +bbb.layout.combo.toolTip = Tukar layout semasa # bbb.layout.loadButton.toolTip = Load layouts from a file # bbb.layout.saveButton.toolTip = Save layouts to a file -# bbb.layout.lockButton.toolTip = Lock layout +bbb.layout.lockButton.toolTip = Kunci layout # bbb.layout.combo.prompt = Apply a layout # bbb.layout.combo.custom = * Custom layout # bbb.layout.combo.customName = Custom layout -# bbb.layout.combo.remote = Remote +bbb.layout.combo.remote = Kawal # bbb.layout.save.complete = Layouts were successfully saved # bbb.layout.load.complete = Layouts were successfully loaded # bbb.layout.load.failed = Failed to load the layouts @@ -226,16 +229,16 @@ bbb.highlighter.toolbar.color = Pilih Warna bbb.logout.button.label = OK # bbb.logout.appshutdown = The server app has been shut down # bbb.logout.asyncerror = An Async Error occured -# bbb.logout.connectionclosed = The connection to the server has been closed -# bbb.logout.connectionfailed = The connection to the server has failed -# bbb.logout.rejected = The connection to the server has been rejected +bbb.logout.connectionclosed = Penyambungan ke server telah ditutup +bbb.logout.connectionfailed = Penyambungan ke server telah gagal +bbb.logout.rejected = Penyambungan ke server telah ditolak # bbb.logout.invalidapp = The red5 app does not exist # bbb.logout.unknown = Your client has lost connection with the server # bbb.logout.usercommand = You have logged out of the conference # bbb.logout.confirm.title = Confirm Logout # bbb.logout.confirm.message = Are you sure you want to log out? -# bbb.logout.confirm.yes = Yes -# bbb.logout.confirm.no = No +bbb.logout.confirm.yes = Ya +bbb.logout.confirm.no = Tidak bbb.notes.title = Nota bbb.notes.cmpColorPicker.toolTip = Warna teks bbb.notes.saveBtn = Simpan @@ -263,10 +266,10 @@ ltbcustom.bbb.highlighter.toolbar.triangle = Segitiga ltbcustom.bbb.highlighter.toolbar.text = Teks # ltbcustom.bbb.highlighter.toolbar.text.accessibilityName = Switch whiteboard cursor to text ltbcustom.bbb.highlighter.texttoolbar.textColorPicker = Warna Teks -# ltbcustom.bbb.highlighter.texttoolbar.textSizeMenu = Font size +ltbcustom.bbb.highlighter.texttoolbar.textSizeMenu = Saiz font -# bbb.accessibility.chat.chatBox.reachedFirst = You have reached the first message. -# bbb.accessibility.chat.chatBox.reachedLatest = You have reached the latest message. +bbb.accessibility.chat.chatBox.reachedFirst = Anda telah mencapai mesej yang pertama. +bbb.accessibility.chat.chatBox.reachedLatest = Anda telah mencapai mesej yang terkini. # bbb.accessibility.chat.chatBox.navigatedFirst = You have navigated to the first message. # bbb.accessibility.chat.chatBox.navigatedLatest = You have navigated to the latest message. # bbb.accessibility.chat.chatBox.navigatedLatestRead = You have navigated to the most recent message you have read. @@ -280,118 +283,118 @@ bbb.shortcuthelp.title = Shortcut Bantuan # bbb.shortcuthelp.minimizeBtn.accessibilityName = Minimize the Shortcut Help Window # bbb.shortcuthelp.maximizeRestoreBtn.accessibilityName = Maximize the Shortcut Help Window # bbb.shortcuthelp.closeBtn.accessibilityName = Close the Shortcut Help Window -# bbb.shortcuthelp.dropdown.general = Global shortcuts -# bbb.shortcuthelp.dropdown.presentation = Presentation shortcuts -# bbb.shortcuthelp.dropdown.chat = Chat shortcuts -# bbb.shortcuthelp.dropdown.users = Users shortcuts +bbb.shortcuthelp.dropdown.general = Shortcut global +bbb.shortcuthelp.dropdown.presentation = Shortcut pembentangan +bbb.shortcuthelp.dropdown.chat = Shortcut chat +bbb.shortcuthelp.dropdown.users = Shortcut pengguna # bbb.shortcuthelp.dropdown.polling = Presenter Polling shortcuts # bbb.shortcuthelp.dropdown.polling2 = Viewer Polling shortcuts -# bbb.shortcuthelp.headers.shortcut = Shortcut +bbb.shortcuthelp.headers.shortcut = Shortcut # bbb.shortcuthelp.headers.function = Function bbb.shortcutkey.general.minimize = 189 # bbb.shortcutkey.general.minimize.function = Minimize current window -# bbb.shortcutkey.general.maximize = 187 +bbb.shortcutkey.general.maximize = 187 # bbb.shortcutkey.general.maximize.function = Maximize current window -# bbb.shortcutkey.flash.exit = 81 +bbb.shortcutkey.flash.exit = 81 # bbb.shortcutkey.flash.exit.function = Focus out of the Flash window -# bbb.shortcutkey.users.muteme = 77 +bbb.shortcutkey.users.muteme = 77 # bbb.shortcutkey.users.muteme.function = Mute and Unmute your microphone -# bbb.shortcutkey.chat.chatinput = 73 +bbb.shortcutkey.chat.chatinput = 73 # bbb.shortcutkey.chat.chatinput.function = Focus the chat input field -# bbb.shortcutkey.present.focusslide = 67 +bbb.shortcutkey.present.focusslide = 67 # bbb.shortcutkey.present.focusslide.function = Focus the presentation slide -# bbb.shortcutkey.whiteboard.undo = 90 +bbb.shortcutkey.whiteboard.undo = 90 # bbb.shortcutkey.whiteboard.undo.function = Undo last whiteboard mark -# bbb.shortcutkey.focus.users = 49 +bbb.shortcutkey.focus.users = 49 # bbb.shortcutkey.focus.users.function = Move focus to the Users window -# bbb.shortcutkey.focus.video = 50 +bbb.shortcutkey.focus.video = 50 # bbb.shortcutkey.focus.video.function = Move focus to the Webcam window -# bbb.shortcutkey.focus.presentation = 51 +bbb.shortcutkey.focus.presentation = 51 # bbb.shortcutkey.focus.presentation.function = Move focus to the Presentation window -# bbb.shortcutkey.focus.chat = 52 +bbb.shortcutkey.focus.chat = 52 # bbb.shortcutkey.focus.chat.function = Move focus to the Chat window -# bbb.shortcutkey.focus.pollingCreate = 67 +bbb.shortcutkey.focus.pollingCreate = 67 # bbb.shortcutkey.focus.pollingCreate.function = Move focus to the Poll Creation window, if it is open. -# bbb.shortcutkey.focus.pollingStats = 83 +bbb.shortcutkey.focus.pollingStats = 83 # bbb.shortcutkey.focus.pollingStats.function = Move focus to the Poll Statistics window, if it is open. -# bbb.shortcutkey.focus.voting = 89 +bbb.shortcutkey.focus.voting = 89 # bbb.shortcutkey.focus.voting.function = Move focus to the Voting window, if it is open. -# bbb.shortcutkey.share.desktop = 68 +bbb.shortcutkey.share.desktop = 68 # bbb.shortcutkey.share.desktop.function = Open desktop sharing window -# bbb.shortcutkey.share.microphone = 79 +bbb.shortcutkey.share.microphone = 79 # bbb.shortcutkey.share.microphone.function = Open audio settings window -# bbb.shortcutkey.share.webcam = 66 +bbb.shortcutkey.share.webcam = 66 # bbb.shortcutkey.share.webcam.function = Open webcam sharing window -# bbb.shortcutkey.shortcutWindow = 72 +bbb.shortcutkey.shortcutWindow = 72 # bbb.shortcutkey.shortcutWindow.function = Open/focus to shortcut help window -# bbb.shortcutkey.logout = 76 +bbb.shortcutkey.logout = 76 # bbb.shortcutkey.logout.function = Log out of this meeting -# bbb.shortcutkey.raiseHand = 82 +bbb.shortcutkey.raiseHand = 82 # bbb.shortcutkey.raiseHand.function = Raise your hand -# bbb.shortcutkey.present.upload = 85 +bbb.shortcutkey.present.upload = 85 # bbb.shortcutkey.present.upload.function = Upload presentation -# bbb.shortcutkey.present.previous = 65 +bbb.shortcutkey.present.previous = 65 # bbb.shortcutkey.present.previous.function = Go to previous slide -# bbb.shortcutkey.present.select = 83 +bbb.shortcutkey.present.select = 83 # bbb.shortcutkey.present.select.function = View all slides -# bbb.shortcutkey.present.next = 69 +bbb.shortcutkey.present.next = 69 # bbb.shortcutkey.present.next.function = Go to next slide -# bbb.shortcutkey.present.fitWidth = 70 +bbb.shortcutkey.present.fitWidth = 70 # bbb.shortcutkey.present.fitWidth.function = Fit slides to width -# bbb.shortcutkey.present.fitPage = 80 +bbb.shortcutkey.present.fitPage = 80 # bbb.shortcutkey.present.fitPage.function = Fit slides to page -# bbb.shortcutkey.users.makePresenter = 80 +bbb.shortcutkey.users.makePresenter = 80 # bbb.shortcutkey.users.makePresenter.function = Make selected person presenter -# bbb.shortcutkey.users.kick = 75 +bbb.shortcutkey.users.kick = 75 # bbb.shortcutkey.users.kick.function = Kick selected person from the meeting -# bbb.shortcutkey.users.mute = 83 +bbb.shortcutkey.users.mute = 83 # bbb.shortcutkey.users.mute.function = Mute or unmute selected person -# bbb.shortcutkey.users.muteall = 65 +bbb.shortcutkey.users.muteall = 65 # bbb.shortcutkey.users.muteall.function = Mute or unmute all users -# bbb.shortcutkey.users.focusUsers = 85 +bbb.shortcutkey.users.focusUsers = 85 # bbb.shortcutkey.users.focusUsers.function = Focus to users list -# bbb.shortcutkey.users.muteAllButPres = 65 +bbb.shortcutkey.users.muteAllButPres = 65 # bbb.shortcutkey.users.muteAllButPres.function = Mute everyone but the Presenter -# bbb.shortcutkey.chat.focusTabs = 89 +bbb.shortcutkey.chat.focusTabs = 89 # bbb.shortcutkey.chat.focusTabs.function = Focus to chat tabs -# bbb.shortcutkey.chat.focusBox = 66 +bbb.shortcutkey.chat.focusBox = 66 # bbb.shortcutkey.chat.focusBox.function = Focus to chat box -# bbb.shortcutkey.chat.changeColour = 67 +bbb.shortcutkey.chat.changeColour = 67 # bbb.shortcutkey.chat.changeColour.function = Focus to font color picker. -# bbb.shortcutkey.chat.sendMessage = 83 +bbb.shortcutkey.chat.sendMessage = 83 bbb.shortcutkey.chat.sendMessage.function = Hantar mesej chat -# bbb.shortcutkey.chat.explanation = ---- +bbb.shortcutkey.chat.explanation = ---- # bbb.shortcutkey.chat.explanation.function = For message navigation, you must focus the chat box. -# bbb.shortcutkey.chat.chatbox.advance = 40 +bbb.shortcutkey.chat.chatbox.advance = 40 # bbb.shortcutkey.chat.chatbox.advance.function = Navigate to the next message -# bbb.shortcutkey.chat.chatbox.goback = 38 +bbb.shortcutkey.chat.chatbox.goback = 38 # bbb.shortcutkey.chat.chatbox.goback.function = Navigate to the previous message -# bbb.shortcutkey.chat.chatbox.repeat = 32 +bbb.shortcutkey.chat.chatbox.repeat = 32 # bbb.shortcutkey.chat.chatbox.repeat.function = Repeat current message -# bbb.shortcutkey.chat.chatbox.golatest = 39 +bbb.shortcutkey.chat.chatbox.golatest = 39 # bbb.shortcutkey.chat.chatbox.golatest.function = Navigate to the latest message -# bbb.shortcutkey.chat.chatbox.gofirst = 37 +bbb.shortcutkey.chat.chatbox.gofirst = 37 # bbb.shortcutkey.chat.chatbox.gofirst.function = Navigate to the first message -# bbb.shortcutkey.chat.chatbox.goread = 75 +bbb.shortcutkey.chat.chatbox.goread = 75 # bbb.shortcutkey.chat.chatbox.goread.function = Navigate to the most recent message you've read -# bbb.shortcutkey.chat.chatbox.debug = 71 +bbb.shortcutkey.chat.chatbox.debug = 71 # bbb.shortcutkey.chat.chatbox.debug.function = Temporary debug hotkey # bbb.polling.createPoll = Create New Poll # bbb.polling.createPoll.moreThanOneResponse = Allow users to choose more than one response # bbb.polling.createPoll.hint = Hint\: Start every answer with a new line -# bbb.polling.createPoll.answers = Answers\: -# bbb.polling.createPoll.question = Question\: -# bbb.polling.createPoll.title = Title\: +bbb.polling.createPoll.answers = Jawapan\: +bbb.polling.createPoll.question = Soalan\: +bbb.polling.createPoll.title = Tajuk\: # bbb.polling.createPoll.publishToWeb = Enable web polling # bbb.polling.pollPreview = Poll Preview @@ -399,7 +402,7 @@ bbb.shortcutkey.chat.sendMessage.function = Hantar mesej chat # bbb.polling.pollPreview.publish = Publish # bbb.polling.pollPreview.preview = Preview bbb.polling.pollPreview.save = Simpan -# bbb.polling.pollPreview.cancel = Cancel +bbb.polling.pollPreview.cancel = Batal # bbb.polling.pollPreview.modify = Modify # bbb.polling.pollPreview.hereIsYourPoll = Here is your poll\: # bbb.polling.pollPreview.ifYouWantChanges = if you want to make any changes use the 'Modify' button @@ -417,7 +420,7 @@ bbb.polling.pollPreview.save = Simpan # bbb.polling.validation.atLeast2Answers = Please provide at least 2 Answers # bbb.polling.validation.duplicateTitle = This poll already exists -# bbb.polling.pollView.vote = Submit +bbb.polling.pollView.vote = Hantar # bbb.polling.toolbar.toolTip = Polling # bbb.polling.stats.repost = Repost @@ -426,9 +429,9 @@ bbb.polling.stats.close = Tutup # bbb.polling.stats.refresh = Refresh # bbb.polling.stats.stopPoll = Stop Poll # bbb.polling.stats.webPollURL = This poll is available at\: -# bbb.polling.stats.answer = Answers -# bbb.polling.stats.votes = Votes -# bbb.polling.stats.percentage = % Of Votes +bbb.polling.stats.answer = Jawapan +bbb.polling.stats.votes = Undian +bbb.polling.stats.percentage = % Undian # bbb.polling.webPollClosed = Web polling has been closed. # bbb.polling.pollClosed = Polling has been closed\! The results are @@ -442,53 +445,53 @@ bbb.publishVideo.changeCameraBtn.labelText = Tukar Webcam # bbb.accessibility.alerts.madePresenter = You are now the Presenter. # bbb.accessibility.alerts.madeViewer = You are now a Viewer. -# bbb.shortcutkey.polling.buttonClick = 80 +bbb.shortcutkey.polling.buttonClick = 80 # bbb.shortcutkey.polling.buttonClick.function = Open the Polling Menu. -# bbb.shortcutkey.polling.focusTitle = 67 +bbb.shortcutkey.polling.focusTitle = 67 # bbb.shortcutkey.polling.focusTitle.function = Focus to Title input box. -# bbb.shortcutkey.polling.focusQuestion = 81 +bbb.shortcutkey.polling.focusQuestion = 81 # bbb.shortcutkey.polling.focusQuestion.function = Focus to Question input box. -# bbb.shortcutkey.polling.focusAnswers = 65 +bbb.shortcutkey.polling.focusAnswers = 65 # bbb.shortcutkey.polling.focusAnswers.function = Focus to Answers input box. -# bbb.shortcutkey.polling.focusMultipleCB = 77 +bbb.shortcutkey.polling.focusMultipleCB = 77 # bbb.shortcutkey.polling.focusMultipleCB.function = Focus to "Allow multiple selections" checkbox. -# bbb.shortcutkey.polling.focusWebPollCB = 66 +bbb.shortcutkey.polling.focusWebPollCB = 66 # bbb.shortcutkey.polling.focusWebPollCB.function = Focus to "Enable web polling" checkbox. -# bbb.shortcutkey.polling.previewClick = 80 +bbb.shortcutkey.polling.previewClick = 80 # bbb.shortcutkey.polling.previewClick.function = Preview your poll and proceed. -# bbb.shortcutkey.polling.cancelClick = 88 +bbb.shortcutkey.polling.cancelClick = 88 # bbb.shortcutkey.polling.cancelClick.function = Cancel and exit Poll creation. -# bbb.shortcutkey.polling.modify = 69 +bbb.shortcutkey.polling.modify = 69 # bbb.shortcutkey.polling.modify.function = Go back and modify your poll. -# bbb.shortcutkey.polling.publish = 85 +bbb.shortcutkey.polling.publish = 85 # bbb.shortcutkey.polling.publish.function = Publish your poll and open voting. -# bbb.shortcutkey.polling.save = 83 +bbb.shortcutkey.polling.save = 83 # bbb.shortcutkey.polling.save.function = Save your poll to use later. -# bbb.shortcutkey.pollStats.explanation = ---- +bbb.shortcutkey.pollStats.explanation = ---- # bbb.shortcutkey.pollStats.explanation.function = Poll results are only available once the poll has been published. -# bbb.shortcutkey.polling.focusData = 68 +bbb.shortcutkey.polling.focusData = 68 # bbb.shortcutkey.polling.focusData.function = Focus to poll results. -# bbb.shortcutkey.polling.refresh = 82 +bbb.shortcutkey.polling.refresh = 82 # bbb.shortcutkey.polling.refresh.function = Refresh poll results. -# bbb.shortcutkey.polling.focusWebPoll = 73 +bbb.shortcutkey.polling.focusWebPoll = 73 # bbb.shortcutkey.polling.focusWebPoll.function = Focus to web polling URL box. -# bbb.shortcutkey.polling.stopPoll = 79 +bbb.shortcutkey.polling.stopPoll = 79 # bbb.shortcutkey.polling.stopPoll.function = Stop the poll and end voting. -# bbb.shortcutkey.polling.repostPoll = 80 +bbb.shortcutkey.polling.repostPoll = 80 # bbb.shortcutkey.polling.repostPoll.function = Re-publish the poll. -# bbb.shortcutkey.polling.closeStatsWindow = 88 +bbb.shortcutkey.polling.closeStatsWindow = 88 # bbb.shortcutkey.polling.closeStatsWindow.function = Close Polling Results window. -# bbb.shortcutkey.polling.vote = 86 +bbb.shortcutkey.polling.vote = 86 # bbb.shortcutkey.polling.vote.function = Cast your vote for the options selected. -# bbb.shortcutkey.polling.focusVoteQuestion = 81 +bbb.shortcutkey.polling.focusVoteQuestion = 81 # bbb.shortcutkey.polling.focusVoteQuestion.function = Focus to question. -# bbb.shortcutkey.specialKeys.space = Spacebar -# bbb.shortcutkey.specialKeys.left = Left Arrow -# bbb.shortcutkey.specialKeys.right = Right Arrow -# bbb.shortcutkey.specialKeys.up = Up Arrow -# bbb.shortcutkey.specialKeys.down = Down Arrow +bbb.shortcutkey.specialKeys.space = Spacebar +bbb.shortcutkey.specialKeys.left = Arrow Kiri +bbb.shortcutkey.specialKeys.right = Arrow Kanan +bbb.shortcutkey.specialKeys.up = Arrow Atas +bbb.shortcutkey.specialKeys.down = Arrow Bawah # bbb.shortcutkey.specialKeys.plus = Plus # bbb.shortcutkey.specialKeys.minus = Minus diff --git a/bigbluebutton-client/locale/ne_NP/bbbResources.properties b/bigbluebutton-client/locale/ne_NP/bbbResources.properties index 72598b1522..c5432c3622 100644 --- a/bigbluebutton-client/locale/ne_NP/bbbResources.properties +++ b/bigbluebutton-client/locale/ne_NP/bbbResources.properties @@ -181,7 +181,10 @@ bbb.desktopPublish.closeBtn.toolTip = Stop het delen en sluit dit scherm. bbb.desktopPublish.minimizeBtn.toolTip = Minimaliseer dit scherm. bbb.desktopPublish.minimizeBtn.accessibilityName = Minimaliseer het desktop delen venster bbb.desktopPublish.maximizeRestoreBtn.accessibilityName = Maximaliseer het desktop delen venster -bbb.desktopPublish.closeBtn.accessibilityName = Stop delen en sluit het desktop delen venster +# bbb.desktopPublish.javaRequiredLabel = Requires Java 7u45 (or later) to run. +# bbb.desktopPublish.javaTestLinkLabel = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip.accessibility = Test Java bbb.desktopView.title = Bureaublad delen bbb.desktopView.fitToWindow = Schaal naar venster bbb.desktopView.actualSize = Geef actuele grootte weer diff --git a/bigbluebutton-client/locale/nl_NL/bbbResources.properties b/bigbluebutton-client/locale/nl_NL/bbbResources.properties index 666ec882c6..d9ac69be41 100644 --- a/bigbluebutton-client/locale/nl_NL/bbbResources.properties +++ b/bigbluebutton-client/locale/nl_NL/bbbResources.properties @@ -181,7 +181,10 @@ bbb.desktopPublish.closeBtn.toolTip = Stop het delen en sluit dit scherm. bbb.desktopPublish.minimizeBtn.toolTip = Minimaliseer dit scherm. bbb.desktopPublish.minimizeBtn.accessibilityName = Minimaliseer het desktop delen venster bbb.desktopPublish.maximizeRestoreBtn.accessibilityName = Maximaliseer het desktop delen venster -bbb.desktopPublish.closeBtn.accessibilityName = Stop delen en sluit het desktop delen venster +# bbb.desktopPublish.javaRequiredLabel = Requires Java 7u45 (or later) to run. +# bbb.desktopPublish.javaTestLinkLabel = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip.accessibility = Test Java bbb.desktopView.title = Bureaublad delen bbb.desktopView.fitToWindow = Schaal naar venster bbb.desktopView.actualSize = Geef actuele grootte weer diff --git a/bigbluebutton-client/locale/no_NO/bbbResources.properties b/bigbluebutton-client/locale/no_NO/bbbResources.properties index 776a40a293..b257101b8f 100644 --- a/bigbluebutton-client/locale/no_NO/bbbResources.properties +++ b/bigbluebutton-client/locale/no_NO/bbbResources.properties @@ -181,7 +181,10 @@ bbb.desktopPublish.closeBtn.toolTip = Stopp deling og lukk vinduet. bbb.desktopPublish.minimizeBtn.toolTip = Minimer bbb.desktopPublish.minimizeBtn.accessibilityName = Minimer vinduet for skrivebordsdeling bbb.desktopPublish.maximizeRestoreBtn.accessibilityName = Maksimer vinduet for skrivebordsdeling -bbb.desktopPublish.closeBtn.accessibilityName = Stopp deling og lukk vinduet for skrivebordsdeling +# bbb.desktopPublish.javaRequiredLabel = Requires Java 7u45 (or later) to run. +# bbb.desktopPublish.javaTestLinkLabel = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip.accessibility = Test Java bbb.desktopView.title = Skrivebordsdeling bbb.desktopView.fitToWindow = Tilpass vindu bbb.desktopView.actualSize = Vis normal størrelse diff --git a/bigbluebutton-client/locale/pl_PL/bbbResources.properties b/bigbluebutton-client/locale/pl_PL/bbbResources.properties index cf8d82e21d..ee70c7549f 100644 --- a/bigbluebutton-client/locale/pl_PL/bbbResources.properties +++ b/bigbluebutton-client/locale/pl_PL/bbbResources.properties @@ -181,7 +181,10 @@ bbb.desktopPublish.closeBtn.toolTip = Zakończ udostępnianie i zamknij bbb.desktopPublish.minimizeBtn.toolTip = Zwiń bbb.desktopPublish.minimizeBtn.accessibilityName = Zwiń okno udostępniania pulpitu bbb.desktopPublish.maximizeRestoreBtn.accessibilityName = Powiększ okno udostępniania pulpitu -bbb.desktopPublish.closeBtn.accessibilityName = Zakończ udostępnianie i zamknij okno udostępniania pulpitu +# bbb.desktopPublish.javaRequiredLabel = Requires Java 7u45 (or later) to run. +# bbb.desktopPublish.javaTestLinkLabel = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip.accessibility = Test Java bbb.desktopView.title = Udostępnianie pulpitu bbb.desktopView.fitToWindow = Dopasuj do okna bbb.desktopView.actualSize = Wyświetl aktualną wielkość diff --git a/bigbluebutton-client/locale/pt_BR/bbbResources.properties b/bigbluebutton-client/locale/pt_BR/bbbResources.properties index 188bb4e3df..b2e2783756 100644 --- a/bigbluebutton-client/locale/pt_BR/bbbResources.properties +++ b/bigbluebutton-client/locale/pt_BR/bbbResources.properties @@ -29,6 +29,13 @@ bbb.mainToolbar.settingsBtn = Configurações bbb.mainToolbar.settingsBtn.toolTip = Abrir configurações bbb.mainToolbar.shortcutBtn = Glossário de atalho bbb.mainToolbar.shortcutBtn.toolTip = Abrir janela de teclas de atalho +bbb.mainToolbar.recordBtn.toolTip.start = Iniciar gravação +bbb.mainToolbar.recordBtn.toolTip.stop = Parar gravação +bbb.mainToolbar.recordBtn.toolTip.recording = A sessão está sendo gravada +bbb.mainToolbar.recordBtn.toolTip.notRecording = A sessão não está sendo gravada +bbb.mainToolbar.recordBtn.confirm.title = Confirmar gravação +bbb.mainToolbar.recordBtn.confirm.message.start = Você tem certeza que deseja iniciar a gravação? +bbb.mainToolbar.recordBtn.confirm.message.stop = Você tem certeza que deseja parar a gravação? bbb.window.minimizeBtn.toolTip = Minimizar bbb.window.maximizeRestoreBtn.toolTip = Maximizar bbb.window.closeBtn.toolTip = Fechar @@ -70,8 +77,8 @@ bbb.users.usersGrid.mediaItemRenderer.webcam = Webcam sendo transmitida bbb.users.usersGrid.mediaItemRenderer.webcamBtn = Ver a webcam bbb.users.usersGrid.mediaItemRenderer.pushToTalk = Acionar o microfone de {0} bbb.users.usersGrid.mediaItemRenderer.pushToMute = Silenciar {0} -bbb.users.usersGrid.mediaItemRenderer.pushToLock = Travar o microfone de {0} -bbb.users.usersGrid.mediaItemRenderer.pushToUnlock = Destravar o microfone de {0} +bbb.users.usersGrid.mediaItemRenderer.pushToLock = Bloquear {0} +bbb.users.usersGrid.mediaItemRenderer.pushToUnlock = Bloquear {0} bbb.users.usersGrid.mediaItemRenderer.kickUser = Expulsar {0} bbb.users.usersGrid.mediaItemRenderer.webcam = Webcam sendo transmitida bbb.users.usersGrid.mediaItemRenderer.micOff = Microfone desativado @@ -181,7 +188,10 @@ bbb.desktopPublish.closeBtn.toolTip = Interromper compartilhamento de tela bbb.desktopPublish.minimizeBtn.toolTip = Minimizar bbb.desktopPublish.minimizeBtn.accessibilityName = Minimizar janela do compartilhamento de tela bbb.desktopPublish.maximizeRestoreBtn.accessibilityName = Maximizar janela do compartilhamento de tela -bbb.desktopPublish.closeBtn.accessibilityName = Parar compartilhamento de tela e fechar janela +bbb.desktopPublish.javaRequiredLabel = Requer Java 7u45 (ou posterior) para rodar. +bbb.desktopPublish.javaTestLinkLabel = Testar Java +bbb.desktopPublish.javaTestLinkLabel.tooltip = Testar Java +bbb.desktopPublish.javaTestLinkLabel.tooltip.accessibility = Testar Java bbb.desktopView.title = Compartilhamento de tela bbb.desktopView.fitToWindow = Ajustar à janela bbb.desktopView.actualSize = Exibir tamanho original @@ -222,7 +232,7 @@ bbb.highlighter.toolbar.color = Selecionar cor bbb.highlighter.toolbar.color.accessibilityName = Cor da anotação do quadro branco bbb.highlighter.toolbar.thickness = Alterar espessura bbb.highlighter.toolbar.thickness.accessibilityName = Espessura da anotação do quadro branco -# bbb.logout.title = Logged Out +bbb.logout.title = Desconectado bbb.logout.button.label = OK bbb.logout.appshutdown = A aplicação no servidor foi interrompida bbb.logout.asyncerror = Um erro assíncrono ocorreu @@ -492,3 +502,25 @@ bbb.shortcutkey.specialKeys.up = Seta para cima bbb.shortcutkey.specialKeys.down = Seta para baixo bbb.shortcutkey.specialKeys.plus = Mais bbb.shortcutkey.specialKeys.minus = Menos + +bbb.toolbar.videodock.toolTip.closeAllVideos = Fechar todas câmeras +bbb.users.settings.lockAll=Bloquear todos +bbb.users.settings.lockAllExcept=Bloquear todos exceto o apresentador +bbb.users.settings.lockSettings=Configurações de bloqueio... +bbb.users.settings.unlockAll=Desbloquear todos usuários +bbb.users.settings.roomIsLocked=Bloqueados por padrão +bbb.users.settings.roomIsMuted=Silenciados por padrão + +bbb.lockSettings.save = Salvar +bbb.lockSettings.save.tooltip = Salvar e aplicar estas configurações +bbb.lockSettings.cancel = Cancelar +bbb.lockSettings.cancel.toolTip = Fecha esta janela sem aplicar + +bbb.lockSettings.moderatorLocking = Bloqueio de moderador +bbb.lockSettings.privateChat = Chat privado +bbb.lockSettings.publicChat = Chat público +bbb.lockSettings.webcam = Câmera +bbb.lockSettings.microphone = Microfone +bbb.lockSettings.title=Configurações de bloqueio +bbb.lockSettings.feature=Recurso +bbb.lockSettings.enabled=Habilitado diff --git a/bigbluebutton-client/locale/pt_PT/bbbResources.properties b/bigbluebutton-client/locale/pt_PT/bbbResources.properties index c6f32d6052..91b708e625 100644 --- a/bigbluebutton-client/locale/pt_PT/bbbResources.properties +++ b/bigbluebutton-client/locale/pt_PT/bbbResources.properties @@ -181,7 +181,10 @@ bbb.desktopPublish.closeBtn.toolTip = Parar a partilha e fechar esta janela bbb.desktopPublish.minimizeBtn.toolTip = Minimizar janela # bbb.desktopPublish.minimizeBtn.accessibilityName = Minimize the Desktop Sharing Publish Window # bbb.desktopPublish.maximizeRestoreBtn.accessibilityName = Maximize the Desktop Sharing Publish Window -# bbb.desktopPublish.closeBtn.accessibilityName = Stop Sharing and Close the Desktop Sharing Publish Window +# bbb.desktopPublish.javaRequiredLabel = Requires Java 7u45 (or later) to run. +# bbb.desktopPublish.javaTestLinkLabel = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip.accessibility = Test Java bbb.desktopView.title = Patilha de Ambiente de Trabalho bbb.desktopView.fitToWindow = Ajustar à janela bbb.desktopView.actualSize = Mostar tamanho actual diff --git a/bigbluebutton-client/locale/ro_RO/bbbResources.properties b/bigbluebutton-client/locale/ro_RO/bbbResources.properties index 1a74bb7192..18384b8224 100644 --- a/bigbluebutton-client/locale/ro_RO/bbbResources.properties +++ b/bigbluebutton-client/locale/ro_RO/bbbResources.properties @@ -181,7 +181,10 @@ bbb.desktopPublish.closeBtn.toolTip = Opreşte partajarea şi închide aceasta f bbb.desktopPublish.minimizeBtn.toolTip = Minimizează aceasta fereastră # bbb.desktopPublish.minimizeBtn.accessibilityName = Minimize the Desktop Sharing Publish Window # bbb.desktopPublish.maximizeRestoreBtn.accessibilityName = Maximize the Desktop Sharing Publish Window -# bbb.desktopPublish.closeBtn.accessibilityName = Stop Sharing and Close the Desktop Sharing Publish Window +# bbb.desktopPublish.javaRequiredLabel = Requires Java 7u45 (or later) to run. +# bbb.desktopPublish.javaTestLinkLabel = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip.accessibility = Test Java bbb.desktopView.title = Partajare spațiu de lucru bbb.desktopView.fitToWindow = Potriviți în cadrul ferestrei bbb.desktopView.actualSize = Afişează dimensiunea actuală diff --git a/bigbluebutton-client/locale/ru_RU/bbbResources.properties b/bigbluebutton-client/locale/ru_RU/bbbResources.properties index 1855520aa9..7a7e80ca0e 100644 --- a/bigbluebutton-client/locale/ru_RU/bbbResources.properties +++ b/bigbluebutton-client/locale/ru_RU/bbbResources.properties @@ -181,7 +181,10 @@ bbb.desktopPublish.closeBtn.toolTip = Остановить трансляцию bbb.desktopPublish.minimizeBtn.toolTip = Свернуть bbb.desktopPublish.minimizeBtn.accessibilityName = Свернуть окно трансляции рабочего стола bbb.desktopPublish.maximizeRestoreBtn.accessibilityName = Развернуть окно трансляции рабочего стола -bbb.desktopPublish.closeBtn.accessibilityName = Остановить трансляцию и закрыть окно +bbb.desktopPublish.javaRequiredLabel = Для запуска требуется Java 7u45 (или новее). +bbb.desktopPublish.javaTestLinkLabel = Тест Java +bbb.desktopPublish.javaTestLinkLabel.tooltip = Тест Java +bbb.desktopPublish.javaTestLinkLabel.tooltip.accessibility = Тест Java bbb.desktopView.title = Трансляция рабочего стола bbb.desktopView.fitToWindow = Подогнать под размеры окна bbb.desktopView.actualSize = Оригинальный размер diff --git a/bigbluebutton-client/locale/si_LK/bbbResources.properties b/bigbluebutton-client/locale/si_LK/bbbResources.properties index c8702c0070..8e08848a1b 100644 --- a/bigbluebutton-client/locale/si_LK/bbbResources.properties +++ b/bigbluebutton-client/locale/si_LK/bbbResources.properties @@ -181,7 +181,10 @@ bbb.chat.fontSize = අකුරු ප්‍රමානය # bbb.desktopPublish.minimizeBtn.toolTip = Minimize # bbb.desktopPublish.minimizeBtn.accessibilityName = Minimize the Desktop Sharing Publish Window # bbb.desktopPublish.maximizeRestoreBtn.accessibilityName = Maximize the Desktop Sharing Publish Window -# bbb.desktopPublish.closeBtn.accessibilityName = Stop Sharing and Close the Desktop Sharing Publish Window +# bbb.desktopPublish.javaRequiredLabel = Requires Java 7u45 (or later) to run. +# bbb.desktopPublish.javaTestLinkLabel = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip.accessibility = Test Java # bbb.desktopView.title = Desktop Sharing # bbb.desktopView.fitToWindow = Fit to Window # bbb.desktopView.actualSize = Display actual size diff --git a/bigbluebutton-client/locale/sk_SK/bbbResources.properties b/bigbluebutton-client/locale/sk_SK/bbbResources.properties index bc3a7d36eb..6b43163492 100644 --- a/bigbluebutton-client/locale/sk_SK/bbbResources.properties +++ b/bigbluebutton-client/locale/sk_SK/bbbResources.properties @@ -181,7 +181,10 @@ bbb.desktopPublish.closeBtn.toolTip = Zastaviť zdieľanie a zatvoriť toto okno bbb.desktopPublish.minimizeBtn.toolTip = Minimalizovať toto okno. # bbb.desktopPublish.minimizeBtn.accessibilityName = Minimize the Desktop Sharing Publish Window # bbb.desktopPublish.maximizeRestoreBtn.accessibilityName = Maximize the Desktop Sharing Publish Window -# bbb.desktopPublish.closeBtn.accessibilityName = Stop Sharing and Close the Desktop Sharing Publish Window +# bbb.desktopPublish.javaRequiredLabel = Requires Java 7u45 (or later) to run. +# bbb.desktopPublish.javaTestLinkLabel = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip.accessibility = Test Java bbb.desktopView.title = Zdieľanie plochy bbb.desktopView.fitToWindow = Prispôsobiť do okna bbb.desktopView.actualSize = Zobraziť aktuálnu veľkosť diff --git a/bigbluebutton-client/locale/sl_SI/bbbResources.properties b/bigbluebutton-client/locale/sl_SI/bbbResources.properties index 99ffaf1f8c..c8ea53255f 100644 --- a/bigbluebutton-client/locale/sl_SI/bbbResources.properties +++ b/bigbluebutton-client/locale/sl_SI/bbbResources.properties @@ -181,7 +181,10 @@ bbb.desktopPublish.closeBtn.toolTip = Prenehaj z deljenjem in zapri to okno. bbb.desktopPublish.minimizeBtn.toolTip = Pomanjšajte to okno. # bbb.desktopPublish.minimizeBtn.accessibilityName = Minimize the Desktop Sharing Publish Window # bbb.desktopPublish.maximizeRestoreBtn.accessibilityName = Maximize the Desktop Sharing Publish Window -# bbb.desktopPublish.closeBtn.accessibilityName = Stop Sharing and Close the Desktop Sharing Publish Window +# bbb.desktopPublish.javaRequiredLabel = Requires Java 7u45 (or later) to run. +# bbb.desktopPublish.javaTestLinkLabel = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip.accessibility = Test Java bbb.desktopView.title = Deljenje namizja bbb.desktopView.fitToWindow = Fit to Window bbb.desktopView.actualSize = Prikaži realno velikost diff --git a/bigbluebutton-client/locale/sr_RS/bbbResources.properties b/bigbluebutton-client/locale/sr_RS/bbbResources.properties index f4d5a9bbdc..c69b34a74a 100644 --- a/bigbluebutton-client/locale/sr_RS/bbbResources.properties +++ b/bigbluebutton-client/locale/sr_RS/bbbResources.properties @@ -181,7 +181,10 @@ bbb.desktopPublish.closeBtn.toolTip = Prekini podelu radne ploče i zatvori proz bbb.desktopPublish.minimizeBtn.toolTip = Minimiraj ovaj prozor. # bbb.desktopPublish.minimizeBtn.accessibilityName = Minimize the Desktop Sharing Publish Window # bbb.desktopPublish.maximizeRestoreBtn.accessibilityName = Maximize the Desktop Sharing Publish Window -# bbb.desktopPublish.closeBtn.accessibilityName = Stop Sharing and Close the Desktop Sharing Publish Window +# bbb.desktopPublish.javaRequiredLabel = Requires Java 7u45 (or later) to run. +# bbb.desktopPublish.javaTestLinkLabel = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip.accessibility = Test Java bbb.desktopView.title = Podela radne ploče bbb.desktopView.fitToWindow = Podesi prozor bbb.desktopView.actualSize = Prikaži trenutnu veličinu diff --git a/bigbluebutton-client/locale/sv_SE/bbbResources.properties b/bigbluebutton-client/locale/sv_SE/bbbResources.properties index b9662a5c6e..e090f309cf 100644 --- a/bigbluebutton-client/locale/sv_SE/bbbResources.properties +++ b/bigbluebutton-client/locale/sv_SE/bbbResources.properties @@ -181,7 +181,10 @@ bbb.desktopPublish.closeBtn.toolTip = Avsluta delning och stäng bbb.desktopPublish.minimizeBtn.toolTip = Minimera bbb.desktopPublish.minimizeBtn.accessibilityName = Minimera fönstret för skärmdelning bbb.desktopPublish.maximizeRestoreBtn.accessibilityName = Maximera fönstret för skärmdelning -bbb.desktopPublish.closeBtn.accessibilityName = Avsluta delning och stäng fönstret för skärmdelning +# bbb.desktopPublish.javaRequiredLabel = Requires Java 7u45 (or later) to run. +# bbb.desktopPublish.javaTestLinkLabel = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip.accessibility = Test Java bbb.desktopView.title = Skärmdelning bbb.desktopView.fitToWindow = Anpassa till fönster bbb.desktopView.actualSize = Visa verklig storlek diff --git a/bigbluebutton-client/locale/th_TH/bbbResources.properties b/bigbluebutton-client/locale/th_TH/bbbResources.properties index 0fd315714e..0dc581f1b9 100644 --- a/bigbluebutton-client/locale/th_TH/bbbResources.properties +++ b/bigbluebutton-client/locale/th_TH/bbbResources.properties @@ -181,7 +181,10 @@ bbb.desktopPublish.closeBtn.toolTip = หยุดการแผยแพร่ bbb.desktopPublish.minimizeBtn.toolTip = ลดหน้าต่างนี้ลง # bbb.desktopPublish.minimizeBtn.accessibilityName = Minimize the Desktop Sharing Publish Window # bbb.desktopPublish.maximizeRestoreBtn.accessibilityName = Maximize the Desktop Sharing Publish Window -# bbb.desktopPublish.closeBtn.accessibilityName = Stop Sharing and Close the Desktop Sharing Publish Window +# bbb.desktopPublish.javaRequiredLabel = Requires Java 7u45 (or later) to run. +# bbb.desktopPublish.javaTestLinkLabel = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip.accessibility = Test Java bbb.desktopView.title = แชร์ปเดสก์ทอปร่วมกัน bbb.desktopView.fitToWindow = พอดีกับหน้าต่าง bbb.desktopView.actualSize = แสดงผลจอขนาดจริง diff --git a/bigbluebutton-client/locale/tr_TR/bbbResources.properties b/bigbluebutton-client/locale/tr_TR/bbbResources.properties index 9e1557d7c5..023f5e9a11 100644 --- a/bigbluebutton-client/locale/tr_TR/bbbResources.properties +++ b/bigbluebutton-client/locale/tr_TR/bbbResources.properties @@ -181,7 +181,10 @@ bbb.desktopPublish.closeBtn.toolTip = Paylaşımı durdur ve Kapat. bbb.desktopPublish.minimizeBtn.toolTip = Küçült bbb.desktopPublish.minimizeBtn.accessibilityName = Masaüstü Paylaşımı Yayımlama Penceresini Küçült bbb.desktopPublish.maximizeRestoreBtn.accessibilityName = Masaüstü Paylaşımı Yayımlama Penceresini Büyült -bbb.desktopPublish.closeBtn.accessibilityName = Paylaşımı durdur ve Masaüstü Paylaşımı Yayımı Penceresini Kapat +# bbb.desktopPublish.javaRequiredLabel = Requires Java 7u45 (or later) to run. +# bbb.desktopPublish.javaTestLinkLabel = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip.accessibility = Test Java bbb.desktopView.title = Masaüstü Paylaşımı bbb.desktopView.fitToWindow = Pencereye Sığdır bbb.desktopView.actualSize = Gerçek boyutu görüntüle diff --git a/bigbluebutton-client/locale/uk_UA/bbbResources.properties b/bigbluebutton-client/locale/uk_UA/bbbResources.properties index 3460530e2b..c71f2258bb 100644 --- a/bigbluebutton-client/locale/uk_UA/bbbResources.properties +++ b/bigbluebutton-client/locale/uk_UA/bbbResources.properties @@ -181,7 +181,10 @@ bbb.desktopPublish.closeBtn.toolTip = Зупинити трансляцію і bbb.desktopPublish.minimizeBtn.toolTip = Згорнути bbb.desktopPublish.minimizeBtn.accessibilityName = Згорнути вікно трансляції bbb.desktopPublish.maximizeRestoreBtn.accessibilityName = Розгорнути вікно трансляції -bbb.desktopPublish.closeBtn.accessibilityName = Зупинити трансляцію і закрити вікно +bbb.desktopPublish.javaRequiredLabel = Для запуску потрібна Java 7u45 (або новіша). +bbb.desktopPublish.javaTestLinkLabel = Тест Java +bbb.desktopPublish.javaTestLinkLabel.tooltip = Тест Java +bbb.desktopPublish.javaTestLinkLabel.tooltip.accessibility = Тест Java bbb.desktopView.title = Трансляція робочого столу bbb.desktopView.fitToWindow = Підігнати під розміри вікна bbb.desktopView.actualSize = Оригінальний розмір diff --git a/bigbluebutton-client/locale/vi_VN/bbbResources.properties b/bigbluebutton-client/locale/vi_VN/bbbResources.properties index f0f42e4069..f2c97e0cee 100644 --- a/bigbluebutton-client/locale/vi_VN/bbbResources.properties +++ b/bigbluebutton-client/locale/vi_VN/bbbResources.properties @@ -181,7 +181,10 @@ bbb.desktopPublish.closeBtn.toolTip = Ngừng chia sẻ và đóng cửa sổ n bbb.desktopPublish.minimizeBtn.toolTip = Thu nhỏ cửa sổ này. bbb.desktopPublish.minimizeBtn.accessibilityName = Thu nhở cửa sổ xuất bản cho chia sẻ dạng desktop bbb.desktopPublish.maximizeRestoreBtn.accessibilityName = Phóng to cửa sổ xuất bản cho chia sẻ dạng desktop -bbb.desktopPublish.closeBtn.accessibilityName = Dừng lại việc chia sẻ và đóng lại cửa sổ xuất bản cho chia sẻ dạng desktop +# bbb.desktopPublish.javaRequiredLabel = Requires Java 7u45 (or later) to run. +# bbb.desktopPublish.javaTestLinkLabel = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip.accessibility = Test Java bbb.desktopView.title = Chia sẻ Màn hình bbb.desktopView.fitToWindow = Phóng toàn Cửa sổ bbb.desktopView.actualSize = Hiện kích thước thật diff --git a/bigbluebutton-client/locale/zh_CN/bbbResources.properties b/bigbluebutton-client/locale/zh_CN/bbbResources.properties index 38ac2fef7c..f6e14028fd 100644 --- a/bigbluebutton-client/locale/zh_CN/bbbResources.properties +++ b/bigbluebutton-client/locale/zh_CN/bbbResources.properties @@ -1,26 +1,26 @@ bbb.mainshell.locale.version = 0.8 bbb.mainshell.statusProgress.connecting = 正在连接到服务器 bbb.mainshell.statusProgress.loading = 载入 {0} 模块 -bbb.mainshell.statusProgress.cannotConnectServer = 抱歉,无法连接到服务器. +bbb.mainshell.statusProgress.cannotConnectServer = 抱歉,无法连接到服务器。 bbb.mainshell.copyrightLabel2 = (c) 2013 BigBlueButton 公司[build {0}]- 详情请访问 http\://www.bigbluebutton.org bbb.mainshell.logBtn.toolTip = 打开日志 bbb.mainshell.resetLayoutBtn.toolTip = 布局重置 -bbb.oldlocalewindow.reminder1 = 您可能正在使用旧版的BigBlueButton界面翻译. -bbb.oldlocalewindow.reminder2 = 请清空浏览器缓存并重试. -bbb.oldlocalewindow.windowTitle = 警告\: 旧的语言文件\! +bbb.oldlocalewindow.reminder1 = 您可能正在使用旧版的 BigBlueButton 界面翻译。 +bbb.oldlocalewindow.reminder2 = 请清空浏览器缓存并重试。 +bbb.oldlocalewindow.windowTitle = 警告\: 旧的语言文件! bbb.micSettings.speakers.header = 测试扬声器 bbb.micSettings.microphone.header = 测试麦克风 bbb.micSettings.playSound = 测试扬声器 bbb.micSettings.playSound.toolTip = 播放音乐来测试您的扬声器 -bbb.micSettings.hearFromHeadset = 你应该从你的耳麦听到声音,而不是从电脑的音箱 -bbb.micSettings.speakIntoMic = 单击此按钮来测试/调整麦克风(推荐用头戴式耳机) +bbb.micSettings.hearFromHeadset = 你应该从你的耳麦听到声音,而不是从电脑的音箱。 +bbb.micSettings.speakIntoMic = 单击此按钮来测试/调整麦克风(推荐用头戴式耳机)。 bbb.micSettings.changeMic = 测试/调整麦克风 -bbb.micSettings.changeMic.toolTip = 打开动画播放器的耳麦设置对话框 +bbb.micSettings.changeMic.toolTip = 打开 Flash Player 耳麦设置对话框 bbb.micSettings.join = 加入语音会议 bbb.micSettings.cancel = 取消 bbb.micSettings.cancel.toolTip = 撤销加入音频会议 -bbb.micSettings.access.helpButton = 需要教学视频请点击此处,这将会打开新的页面 -bbb.micSettings.access.title = 音频设置,焦点将会保持在音频设置窗口直到该窗口关闭 +bbb.micSettings.access.helpButton = 从新页面打开培训视频。 +bbb.micSettings.access.title = 音频设置。焦点将会保持在音频设置窗口直到该窗口关闭。 bbb.mainToolbar.helpBtn = 帮助 bbb.mainToolbar.logoutBtn = 退出 bbb.mainToolbar.logoutBtn.toolTip = 退出 @@ -34,9 +34,9 @@ bbb.window.maximizeRestoreBtn.toolTip = 最大化 bbb.window.closeBtn.toolTip = 关闭 bbb.videoDock.titleBar = 视频区窗口标题栏 bbb.presentation.titleBar = 演示区窗口标题栏 -bbb.chat.titleBar = 聊天窗口标题栏,如果需要浏览信息,请把焦点集中到聊天区 -bbb.users.title = 用户{0}{1} -bbb.users.titleBar = 用户窗口标题栏,双击最大化 +bbb.chat.titleBar = 聊天窗口标题栏(如果需要浏览信息,请把焦点集中到聊天区) +bbb.users.title = 用户 {0} {1} +bbb.users.titleBar = 用户窗口标题栏(双击最大化) bbb.users.quickLink.label = 用户窗口 bbb.users.minimizeBtn.accessibilityName = 最小化用户窗口 bbb.users.maximizeRestoreBtn.accessibilityName = 最大化用户窗口 @@ -44,7 +44,7 @@ bbb.users.settings.buttonTooltip = 设置 bbb.users.settings.audioSettings = 音频设置 bbb.users.settings.webcamSettings = 摄像头设置 bbb.users.settings.muteAll = 全部话筒静音 -bbb.users.settings.muteAllExcept = 除了演讲者外,全部话筒静音 +bbb.users.settings.muteAllExcept = 演讲者外全部话筒静音 bbb.users.settings.unmuteAll = 解除全部话筒静音 bbb.users.settings.lowerAllHands = 全部手放下 bbb.users.raiseHandBtn.toolTip = 举手 @@ -52,9 +52,9 @@ bbb.users.pushToTalk.toolTip = 单击此处开始发言 bbb.users.pushToMute.toolTip = 单击此处将你的话筒设为静音 bbb.users.muteMeBtnTxt.talk = 解除静音 bbb.users.muteMeBtnTxt.mute = 静音 -bbb.users.muteMeBtnTxt.muted = 被设为静音 -bbb.users.muteMeBtnTxt.unmuted = 被解除静音 -bbb.users.usersGrid.accessibilityName = 用户名单,用箭头键浏览 +bbb.users.muteMeBtnTxt.muted = 已被设为静音 +bbb.users.muteMeBtnTxt.unmuted = 已被解除静音 +bbb.users.usersGrid.accessibilityName = 用户名单。使用箭头键浏览。 bbb.users.usersGrid.nameItemRenderer = 名字 bbb.users.usersGrid.nameItemRenderer.youIdentifier = 你 bbb.users.usersGrid.statusItemRenderer = 状态 @@ -67,37 +67,37 @@ bbb.users.usersGrid.statusItemRenderer.viewer = 观众 bbb.users.usersGrid.mediaItemRenderer = 媒体 bbb.users.usersGrid.mediaItemRenderer.talking = 发言 bbb.users.usersGrid.mediaItemRenderer.webcam = 摄像头共享 -bbb.users.usersGrid.mediaItemRenderer.webcamBtn = 单击此处看摄像头 +bbb.users.usersGrid.mediaItemRenderer.webcamBtn = 查看摄像头 bbb.users.usersGrid.mediaItemRenderer.pushToTalk = 单击解除用户静音 bbb.users.usersGrid.mediaItemRenderer.pushToMute = 单击将用户话筒设为静音 bbb.users.usersGrid.mediaItemRenderer.pushToLock = 单击锁定用户的麦克风 bbb.users.usersGrid.mediaItemRenderer.pushToUnlock = 单击解锁用户麦克风 -bbb.users.usersGrid.mediaItemRenderer.kickUser = 踢出用户 +bbb.users.usersGrid.mediaItemRenderer.kickUser = 踢除用户 bbb.users.usersGrid.mediaItemRenderer.webcam = 摄像头共享 -bbb.users.usersGrid.mediaItemRenderer.micOff = 麦克风关闭 -bbb.users.usersGrid.mediaItemRenderer.micOn = 麦克风打开 +bbb.users.usersGrid.mediaItemRenderer.micOff = 关闭麦克风 +bbb.users.usersGrid.mediaItemRenderer.micOn = 打开麦克风 bbb.users.usersGrid.mediaItemRenderer.noAudio = 不在音频会议中 bbb.presentation.title = 演示 bbb.presentation.titleWithPres = 演示文档:{0} bbb.presentation.quickLink.label = 演示窗口 bbb.presentation.fitToWidth.toolTip = 演示窗口调整到适合宽度\n bbb.presentation.fitToPage.toolTip = 演示窗口调整到适合页面 -bbb.presentation.uploadPresBtn.toolTip = 演示窗口中上传演示文件 -bbb.presentation.backBtn.toolTip = 演示窗口中上一个幻灯片 +bbb.presentation.uploadPresBtn.toolTip = 打开文件演示文件上传窗口 +bbb.presentation.backBtn.toolTip = 上一个幻灯片 bbb.presentation.btnSlideNum.toolTip = 选择一个幻灯片 -bbb.presentation.forwardBtn.toolTip = 演示窗口中下一页幻灯片 -bbb.presentation.maxUploadFileExceededAlert = 错误\: 文件过大. -bbb.presentation.uploadcomplete = 文件上传完毕。正在转换,请等待 -bbb.presentation.uploaded = 已上传 -bbb.presentation.document.supported = 上传的文件可以支持,开始转换... -bbb.presentation.document.converted = 成功转换办公文件 -bbb.presentation.error.document.convert.failed = 错误:Office文件转换失败 -bbb.presentation.error.io = IO 错误\: 请与管理员联系 -bbb.presentation.error.security = 安全错误\: 请与管理员联系 -bbb.presentation.error.convert.notsupported = 错误:上传的文件不支持。请上传被支持的文件 -bbb.presentation.error.convert.nbpage = 错误:无法判断文件页数 -bbb.presentation.error.convert.maxnbpagereach = 错误:上传的文件页数过多 -bbb.presentation.converted = 已转换{0}页,共{1}页 +bbb.presentation.forwardBtn.toolTip = 下一页幻灯片 +bbb.presentation.maxUploadFileExceededAlert = 错误\: 文件过大。 +bbb.presentation.uploadcomplete = 上传完毕。请耐心等待文件转换。 +bbb.presentation.uploaded = 已上传。 +bbb.presentation.document.supported = 支持上传文件类型,开始转换... +bbb.presentation.document.converted = 办公文件转换成功。 +bbb.presentation.error.document.convert.failed = 错误:办公文件转换失败。 +bbb.presentation.error.io = IO 错误\: 请与管理员联系。 +bbb.presentation.error.security = 安全错误\: 请与管理员联系。 +bbb.presentation.error.convert.notsupported = 错误:上传的文件不支持。请上传可被支持的文件。 +bbb.presentation.error.convert.nbpage = 错误:无法判断文件页数。 +bbb.presentation.error.convert.maxnbpagereach = 错误:上传的文件页数过多。 +bbb.presentation.converted = 已转换 {0} 页,共 {1} 页。 bbb.presentation.ok = OK bbb.presentation.slider = 演示窗口缩放 bbb.presentation.slideloader.starttext = 演示文本开始 @@ -112,19 +112,19 @@ bbb.presentation.minimizeBtn.accessibilityName = 最小化演示窗口 bbb.presentation.maximizeRestoreBtn.accessibilityName = 最大化演示窗口 bbb.presentation.closeBtn.accessibilityName = 关闭演示窗口 bbb.fileupload.title = 增加演示文件 -bbb.fileupload.fileLbl = 选择文件上传\: +bbb.fileupload.fileLbl = 选择文件上传: bbb.fileupload.selectBtn.label = 选择文件 bbb.fileupload.selectBtn.toolTip = 选择文件 bbb.fileupload.uploadBtn = 上传 bbb.fileupload.uploadBtn.toolTip = 上传文件 -bbb.fileupload.presentationNamesLbl = 已上传演示文件\: +bbb.fileupload.presentationNamesLbl = 已上传演示文件: bbb.fileupload.deleteBtn.toolTip = 删除演示文件 bbb.fileupload.showBtn = 演示 bbb.fileupload.showBtn.toolTip = 演示幻灯片 bbb.fileupload.okCancelBtn = 取消 bbb.fileupload.okCancelBtn.toolTip = 关闭文件上传对话框 bbb.fileupload.genThumbText = 生成缩略图.. -bbb.fileupload.progBarLbl = 进度\: +bbb.fileupload.progBarLbl = 进度: bbb.chat.title = 聊天 bbb.chat.quickLink.label = 聊天窗口 bbb.chat.cmpColorPicker.toolTip = 聊天窗口文字颜色 @@ -135,19 +135,19 @@ bbb.chat.sendBtn.accessibilityName = 发送聊天信息 bbb.chat.publicChatUsername = 所有 bbb.chat.optionsTabName = 选择 bbb.chat.privateChatSelect = 聊天窗口中选择私聊对象 -bbb.chat.private.userLeft = 用户已经离开. -bbb.chat.usersList.toolTip = 选择一个与会者并开始私聊 -bbb.chat.chatOptions = 聊天窗口中的聊天选项 -bbb.chat.fontSize = 聊天窗口的字体大小 -bbb.chat.cmbFontSize.toolTip = 选择一个聊天信息的字体大小 -bbb.chat.messageList = 聊天窗口的信息框 +bbb.chat.private.userLeft = 用户已经离开。 +bbb.chat.usersList.toolTip = 选择一个与会者开始私聊 +bbb.chat.chatOptions = 聊天选项 +bbb.chat.fontSize = 对话字体大小 +bbb.chat.cmbFontSize.toolTip = 选择一个对话的字体大小 +bbb.chat.messageList = 对话信息框 bbb.chat.minimizeBtn.accessibilityName = 最小化聊天窗口 bbb.chat.maximizeRestoreBtn.accessibilityName = 最大化聊天窗口 bbb.chat.closeBtn.accessibilityName = 关闭聊天窗口 -bbb.chat.chatTabs.accessibleNotice = 在这选项卡里的新信息 +bbb.chat.chatTabs.accessibleNotice = 此选项卡里的新信息。 bbb.publishVideo.changeCameraBtn.labelText = 更换摄像头 bbb.publishVideo.changeCameraBtn.toolTip = 打开改变摄像头对话框 -bbb.publishVideo.cmbResolution.tooltip = 选择网络摄像头的分辨率 +bbb.publishVideo.cmbResolution.tooltip = 选择网络摄像头分辨率 bbb.publishVideo.startPublishBtn.labelText = 开始共享 bbb.publishVideo.startPublishBtn.toolTip = 开始共享 bbb.videodock.title = 视频区 @@ -155,11 +155,11 @@ bbb.videodock.quickLink.label = 视频窗口 bbb.video.minimizeBtn.accessibilityName = 最小化视频区窗口 bbb.video.maximizeRestoreBtn.accessibilityName = 最大化视频区窗口 bbb.video.controls.muteButton.toolTip = 静音或取消静音 {0} -bbb.video.controls.switchPresenter.toolTip = 指定{0}演讲者 +bbb.video.controls.switchPresenter.toolTip = 指定 {0} 演讲者 bbb.video.controls.ejectUserBtn.toolTip = 逐出会议 bbb.video.controls.privateChatBtn.toolTip = 和 {0} 聊天 bbb.video.publish.hint.noCamera = 没有摄像头 -bbb.video.publish.hint.cantOpenCamera = 打不开摄像头 +bbb.video.publish.hint.cantOpenCamera = 摄像头无法打开 bbb.video.publish.hint.waitingApproval = 等候批准 bbb.video.publish.hint.videoPreview = 视频预览 bbb.video.publish.hint.openingCamera = 摄像头开启中... @@ -169,7 +169,7 @@ bbb.video.publish.hint.publishing = 发布中... bbb.video.publish.closeBtn.accessName = 关闭摄像头窗口 bbb.video.publish.closeBtn.label = 取消 bbb.video.publish.titleBar = 发布网络摄像窗口 -bbb.desktopPublish.title = 桌面共享\: 演讲人预览 +bbb.desktopPublish.title = 桌面共享:演讲人预览 bbb.desktopPublish.fullscreen.tooltip = 全屏共享 bbb.desktopPublish.fullscreen.label = 全屏 bbb.desktopPublish.region.tooltip = 共享部分屏幕 @@ -181,33 +181,36 @@ bbb.desktopPublish.closeBtn.toolTip = 停止共享并关闭 bbb.desktopPublish.minimizeBtn.toolTip = 最小化 bbb.desktopPublish.minimizeBtn.accessibilityName = 最小化桌面共享发布窗口 bbb.desktopPublish.maximizeRestoreBtn.accessibilityName = 最大化桌面共享发布窗口 -bbb.desktopPublish.closeBtn.accessibilityName = 停止共享并且关闭桌面共享发布窗口 +# bbb.desktopPublish.javaRequiredLabel = Requires Java 7u45 (or later) to run. +# bbb.desktopPublish.javaTestLinkLabel = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip.accessibility = Test Java bbb.desktopView.title = 桌面共享 bbb.desktopView.fitToWindow = 适应窗口大小 bbb.desktopView.actualSize = 显示实际大小 bbb.desktopView.minimizeBtn.accessibilityName = 最小化桌面共享窗口 bbb.desktopView.maximizeRestoreBtn.accessibilityName = 最大化桌面共享窗口 bbb.desktopView.closeBtn.accessibilityName = 关闭桌面共享窗口 -bbb.toolbar.phone.toolTip.start = 分享我的语音 -bbb.toolbar.phone.toolTip.stop = 停止分享我的语音 +bbb.toolbar.phone.toolTip.start = 加入语音会议 +bbb.toolbar.phone.toolTip.stop = 离开语音会议 bbb.toolbar.deskshare.toolTip.start = 分享我的桌面 bbb.toolbar.deskshare.toolTip.stop = 停止分享桌面 bbb.toolbar.video.toolTip.start = 分享我的摄像头 -bbb.toolbar.video.toolTip.stop = 停止分享我的摄像头 +bbb.toolbar.video.toolTip.stop = 停止摄像头分享 bbb.layout.addButton.toolTip = 将自定义布局加入到列表 bbb.layout.combo.toolTip = 改变当前布局 bbb.layout.loadButton.toolTip = 从文件打开布局 -bbb.layout.saveButton.toolTip = 将布局存为文件 +bbb.layout.saveButton.toolTip = 将布局保存为文件 bbb.layout.lockButton.toolTip = 锁定布局 bbb.layout.combo.prompt = 应用布局 bbb.layout.combo.custom = * 自定义布局 bbb.layout.combo.customName = 自定义布局 bbb.layout.combo.remote = 远程 bbb.layout.save.complete = 布局保存成功 -bbb.layout.load.complete = 布局成功调入 -bbb.layout.load.failed = 打开布局失败 +bbb.layout.load.complete = 布局成功载入 +bbb.layout.load.failed = 布局载入失败 bbb.highlighter.toolbar.pencil = 铅笔 -bbb.highlighter.toolbar.pencil.accessibilityName = 切换白板关标为铅笔 +bbb.highlighter.toolbar.pencil.accessibilityName = 切换白板光标为铅笔 bbb.highlighter.toolbar.ellipse = 圆 bbb.highlighter.toolbar.ellipse.accessibilityName = 切换白板关标为圆 bbb.highlighter.toolbar.rectangle = 矩形 @@ -217,19 +220,19 @@ bbb.highlighter.toolbar.panzoom.accessibilityName = 切换白板光标为平移 bbb.highlighter.toolbar.clear = 清除页面 bbb.highlighter.toolbar.clear.accessibilityName = 清除白板页面 bbb.highlighter.toolbar.undo = 撤销形状 -bbb.highlighter.toolbar.undo.accessibilityName = 撤销刚刚画的形状 +bbb.highlighter.toolbar.undo.accessibilityName = 撤销上一步画的形状 bbb.highlighter.toolbar.color = 选择颜色 bbb.highlighter.toolbar.color.accessibilityName = 白板画笔颜色 bbb.highlighter.toolbar.thickness = 修改线条粗细 bbb.highlighter.toolbar.thickness.accessibilityName = 改变白板光标绘画线条粗细 -bbb.logout.title = 退出 +bbb.logout.title = 已退出 bbb.logout.button.label = OK bbb.logout.appshutdown = 服务器应用已被关闭 bbb.logout.asyncerror = 同步错误 bbb.logout.connectionclosed = 连接被关闭 bbb.logout.connectionfailed = 连接服务器失败 -bbb.logout.rejected = 连接被服务器拒绝 -bbb.logout.invalidapp = Red5应用不存在 +bbb.logout.rejected = 服务器连接被拒绝 +bbb.logout.invalidapp = Red5 应用不存在 bbb.logout.unknown = 您已掉线 bbb.logout.usercommand = 您已从会议中登出 bbb.logout.confirm.title = 确认退出 @@ -240,22 +243,22 @@ bbb.notes.title = 笔记 bbb.notes.cmpColorPicker.toolTip = 文字颜色 bbb.notes.saveBtn = 保存 bbb.notes.saveBtn.toolTip = 保存笔记 -bbb.settings.deskshare.instructions = 在弹出窗口中,点击同意来检查桌面共享程序工作是否正常 +bbb.settings.deskshare.instructions = 在弹出窗口中点击同意检查桌面共享程序工作是否正常 bbb.settings.deskshare.start = 检查桌面共享 bbb.settings.voice.volume = 麦克风状态 -bbb.settings.java.label = Java版本错误 -bbb.settings.java.text = 您安装的是Java {0},但BigBlueButton中的桌面共享功能要求的最低版本是{1}。点击下面的按钮安装最新的JRE。 -bbb.settings.java.command = 安装最新版Java -bbb.settings.flash.label = Flash版本错误 -bbb.settings.flash.text = 您安装的Flash为{0},BigBlueButton需要{1}以上版本才能正常运行。点击下面的链接安装最新的Flash Player -bbb.settings.flash.command = 安装最新Flash -bbb.settings.isight.label = iSight摄像头错误 -bbb.settings.isight.text = 如果你的iSight摄像头有问题,可能是你运行的系统是OS X 10.6.5,这个版本在通过Flash抓取摄像头时会有问题。\n要解决这个问题,请点击下面的链接并安装最新版本的Flash或是更新你的Mac系统到最新版本。 -bbb.settings.isight.command = 安装Flash 10.2 RC2 +bbb.settings.java.label = Java 版本错误 +bbb.settings.java.text = 您安装的是Java {0},但 BigBlueButton 中的桌面共享功能要求的最低版本是 {1} 。点击下面的按钮安装最新的 JRE 。 +bbb.settings.java.command = 安装最新版 Java +bbb.settings.flash.label = Flash 版本错误 +bbb.settings.flash.text = 您安装的 Flash 为 {0} ,BigBlueButton 需要 {1} 以上版本才能正常运行。点击下面的链接安装最新的 Flash Player +bbb.settings.flash.command = 安装最新 Flash +bbb.settings.isight.label = iSight 摄像头错误 +bbb.settings.isight.text = 如果你的 iSight 摄像头有问题,可能是你运行的系统是 OS X 10.6.5,这个版本在通过 Flash 抓取摄像头时会有问题。\n要解决这个问题,请点击下面的链接并安装最新版本的 Flash 或是更新你的 Mac 系统到最新版本。 +bbb.settings.isight.command = 安装 Flash 10.2 RC2 bbb.settings.warning.label = 警告 bbb.settings.warning.close = 关闭警告 bbb.settings.noissues = 没有检测到明显的问题。 -bbb.settings.instructions = 在弹出的Flash设置对话框中“接受”Flash使用您的摄像头。若您能够看到和听到自己,说明浏览器已设置正确。其他可能存在的问题显示如下。依次点击以找到可行的解决方案。 +bbb.settings.instructions = 在弹出的 Flash 设置对话框中“接受” Flash 使用您的摄像头。若您能够看到和听到自己,说明浏览器已设置正确。其他可能存在的问题显示如下。依次点击以找到可行的解决方案。 ltbcustom.bbb.highlighter.toolbar.triangle = 三角形 ltbcustom.bbb.highlighter.toolbar.triangle.accessibilityName = 切换白板光标为三角形 ltbcustom.bbb.highlighter.toolbar.line = 直线 @@ -265,23 +268,23 @@ ltbcustom.bbb.highlighter.toolbar.text.accessibilityName = 切换白板光标为 ltbcustom.bbb.highlighter.texttoolbar.textColorPicker = 文字颜色 ltbcustom.bbb.highlighter.texttoolbar.textSizeMenu = 字体大小 -bbb.accessibility.chat.chatBox.reachedFirst = 您已经在第一条信息上 -bbb.accessibility.chat.chatBox.reachedLatest = 您已经在最后一条信息上 +bbb.accessibility.chat.chatBox.reachedFirst = 已经是第一条信息 +bbb.accessibility.chat.chatBox.reachedLatest = 已经是最后一条信息 bbb.accessibility.chat.chatBox.navigatedFirst = 您已经浏览到第一条信息 bbb.accessibility.chat.chatBox.navigatedLatest = 您已经浏览到最后一条信息 -bbb.accessibility.chat.chatBox.navigatedLatestRead = 您已经浏览到您最近读过的信息 +bbb.accessibility.chat.chatBox.navigatedLatestRead = 您已经浏览到您最近一条读过的信息 bbb.accessibility.chat.chatwindow.input = 聊天输入 -bbb.accessibility.chat.initialDescription = 请用箭头键来浏览聊天信息 +bbb.accessibility.chat.initialDescription = 请使用箭头键浏览聊天信息 bbb.accessibility.notes.notesview.input = 注解输入 -bbb.shortcuthelp.title = 快捷键汇编 +bbb.shortcuthelp.title = 快捷键帮助 bbb.shortcuthelp.minimizeBtn.accessibilityName = 最小化快捷键窗口 bbb.shortcuthelp.maximizeRestoreBtn.accessibilityName = 最大化快捷键窗口 bbb.shortcuthelp.closeBtn.accessibilityName = 关闭快捷键窗口 bbb.shortcuthelp.dropdown.general = 通用快捷键 -bbb.shortcuthelp.dropdown.presentation = 演示用快捷键 +bbb.shortcuthelp.dropdown.presentation = 演示快捷键 bbb.shortcuthelp.dropdown.chat = 聊天快捷键 bbb.shortcuthelp.dropdown.users = 用户快捷键 bbb.shortcuthelp.dropdown.polling = 演讲者投票调查快捷键 @@ -295,9 +298,9 @@ bbb.shortcutkey.general.maximize = 187 bbb.shortcutkey.general.maximize.function = 最大化当前窗口 bbb.shortcutkey.flash.exit = 81\n -bbb.shortcutkey.flash.exit.function = 焦点离开动画窗口 +bbb.shortcutkey.flash.exit.function = 焦点离开 Flash 窗口 bbb.shortcutkey.users.muteme = 77 -bbb.shortcutkey.users.muteme.function = 话筒静音或者解除话筒静音 +bbb.shortcutkey.users.muteme.function = 话筒静音或解除话筒静音 bbb.shortcutkey.chat.chatinput = 73 bbb.shortcutkey.chat.chatinput.function = 焦点集中在聊天输入区域 bbb.shortcutkey.present.focusslide = 67 @@ -314,7 +317,7 @@ bbb.shortcutkey.focus.presentation.function = 将焦点移到演示窗口 bbb.shortcutkey.focus.chat = 52 bbb.shortcutkey.focus.chat.function = 将焦点移到聊天窗口 bbb.shortcutkey.focus.pollingCreate = 67 -bbb.shortcutkey.focus.pollingCreate.function = 如果调查创建窗口已打开,请把焦点移到该窗口 +bbb.shortcutkey.focus.pollingCreate.function = 如果调查创建窗口已打开,请把焦点移到该窗口。 bbb.shortcutkey.focus.pollingStats = 83 bbb.shortcutkey.focus.pollingStats.function = 如果调查统计窗口已经打开,请把焦点移到该处 bbb.shortcutkey.focus.voting = 89 @@ -339,7 +342,7 @@ bbb.shortcutkey.present.upload.function = 上传演示文档 bbb.shortcutkey.present.previous = 65 bbb.shortcutkey.present.previous.function = 转到上一页幻灯片 bbb.shortcutkey.present.select = 83 -bbb.shortcutkey.present.select.function = 观看所以幻灯片 +bbb.shortcutkey.present.select.function = 观看所有幻灯片 bbb.shortcutkey.present.next = 69 bbb.shortcutkey.present.next.function = 转到下一张幻灯片 bbb.shortcutkey.present.fitWidth = 70 @@ -358,7 +361,7 @@ bbb.shortcutkey.users.muteall.function = 将所有人的话筒设为静音或者 bbb.shortcutkey.users.focusUsers = 85 bbb.shortcutkey.users.focusUsers.function = 焦点集中到用户名单上 bbb.shortcutkey.users.muteAllButPres = 65 -bbb.shortcutkey.users.muteAllButPres.function = 除演讲者外,把全部话筒静音 +bbb.shortcutkey.users.muteAllButPres.function = 静音演讲者外所有话筒 bbb.shortcutkey.chat.focusTabs = 89 bbb.shortcutkey.chat.focusTabs.function = 焦点集中到聊天栏上 @@ -389,7 +392,7 @@ bbb.shortcutkey.chat.chatbox.debug.function = 临时调试快捷键 bbb.polling.createPoll = 创建新的问卷调查 bbb.polling.createPoll.moreThanOneResponse = 允许用户选择多个反馈 bbb.polling.createPoll.hint = 提示:另起一行开始新的答案 -bbb.polling.createPoll.answers = 回答\: +bbb.polling.createPoll.answers = 回答: bbb.polling.createPoll.question = 问题: bbb.polling.createPoll.title = 标题: bbb.polling.createPoll.publishToWeb = 打开网络投票 @@ -422,7 +425,7 @@ bbb.polling.toolbar.toolTip = 投票中 bbb.polling.stats.repost = 重新发布 bbb.polling.stats.close = 关闭 -bbb.polling.stats.didNotVote = 还没有投票 +bbb.polling.stats.didNotVote = 还未投票 bbb.polling.stats.refresh = 刷新 bbb.polling.stats.stopPoll = 停止投票 bbb.polling.stats.webPollURL = 该投票在这里可以找到: @@ -433,62 +436,62 @@ bbb.polling.stats.percentage = % 的投票 bbb.polling.webPollClosed = 网络投票已经关闭 bbb.polling.pollClosed = 投票已经关闭!结果是: -bbb.polling.vote.error.radio = 请选择一个选项,或者关闭窗口放弃投票 -bbb.polling.vote.error.check = 请选择一个或者多个选项,或者关闭窗口放弃投票 +bbb.polling.vote.error.radio = 请选择一个选项,或者关闭窗口放弃投票。 +bbb.polling.vote.error.check = 请选择一个或者多个选项,或者关闭窗口放弃投票。 bbb.publishVideo.startPublishBtn.labelText = 开始共享 bbb.publishVideo.changeCameraBtn.labelText = 更换摄像头 -bbb.accessibility.alerts.madePresenter = 您现在是演讲者 -bbb.accessibility.alerts.madeViewer = 您现在是观众 +bbb.accessibility.alerts.madePresenter = 您现在是演讲者。 +bbb.accessibility.alerts.madeViewer = 您现在是观众。 bbb.shortcutkey.polling.buttonClick = 80 -bbb.shortcutkey.polling.buttonClick.function = 打开投票调查菜单 +bbb.shortcutkey.polling.buttonClick.function = 打开投票调查菜单。 bbb.shortcutkey.polling.focusTitle = 67 -bbb.shortcutkey.polling.focusTitle.function = 把焦点放在标题输入框 +bbb.shortcutkey.polling.focusTitle.function = 把焦点放在标题输入框。 bbb.shortcutkey.polling.focusQuestion = 81\n -bbb.shortcutkey.polling.focusQuestion.function = 把焦点放在问题输入框 +bbb.shortcutkey.polling.focusQuestion.function = 把焦点放在问题输入框。 bbb.shortcutkey.polling.focusAnswers = 65 -bbb.shortcutkey.polling.focusAnswers.function = 把焦点放在答案输入框 +bbb.shortcutkey.polling.focusAnswers.function = 把焦点放在答案输入框。 bbb.shortcutkey.polling.focusMultipleCB = 77 -bbb.shortcutkey.polling.focusMultipleCB.function = 把焦点放到“允许多项选择”的选择框 +bbb.shortcutkey.polling.focusMultipleCB.function = 焦点集中到“允许多项选择”选择框 bbb.shortcutkey.polling.focusWebPollCB = 66 -bbb.shortcutkey.polling.focusWebPollCB.function = 把焦点放到“允许网络投票”选择框 +bbb.shortcutkey.polling.focusWebPollCB.function = 把焦点放到“允许网络投票”选择框。 bbb.shortcutkey.polling.previewClick = 80 -bbb.shortcutkey.polling.previewClick.function = 预览您的投票并继续进行 +bbb.shortcutkey.polling.previewClick.function = 预览您的投票并继续。 bbb.shortcutkey.polling.cancelClick = 88 -bbb.shortcutkey.polling.cancelClick.function = 取消并退出投票创建 +bbb.shortcutkey.polling.cancelClick.function = 取消并退出投票创建。 bbb.shortcutkey.polling.modify = 69 -bbb.shortcutkey.polling.modify.function = 返回并修改您的投票 +bbb.shortcutkey.polling.modify.function = 返回并修改您的投票。 bbb.shortcutkey.polling.publish = 85 -bbb.shortcutkey.polling.publish.function = 发布您的调查并开放投票 +bbb.shortcutkey.polling.publish.function = 发布您的调查并开放投票。 bbb.shortcutkey.polling.save = 83 -bbb.shortcutkey.polling.save.function = 保存您的调查以便将来使用 +bbb.shortcutkey.polling.save.function = 保存您的调查以便将来使用。 bbb.shortcutkey.pollStats.explanation = ---- -bbb.shortcutkey.pollStats.explanation.function = 只有调查已经被发布后才可以获取调查结果 +bbb.shortcutkey.pollStats.explanation.function = 只有调查已经被发布后才可以获取调查结果。 bbb.shortcutkey.polling.focusData = 68 -bbb.shortcutkey.polling.focusData.function = 把焦点放到投票结果 +bbb.shortcutkey.polling.focusData.function = 把焦点放到投票结果。 bbb.shortcutkey.polling.refresh = 82 -bbb.shortcutkey.polling.refresh.function = 刷新投票结果 +bbb.shortcutkey.polling.refresh.function = 刷新投票结果。 bbb.shortcutkey.polling.focusWebPoll = 73 -bbb.shortcutkey.polling.focusWebPoll.function = 把焦点放到网络投票链接框 +bbb.shortcutkey.polling.focusWebPoll.function = 把焦点放到网络投票链接框。 bbb.shortcutkey.polling.stopPoll = 79 -bbb.shortcutkey.polling.stopPoll.function = 停止调查并结束投票 +bbb.shortcutkey.polling.stopPoll.function = 停止调查并结束投票。 bbb.shortcutkey.polling.repostPoll = 80 -bbb.shortcutkey.polling.repostPoll.function = 重新发布调查 +bbb.shortcutkey.polling.repostPoll.function = 重新发布调查。 bbb.shortcutkey.polling.closeStatsWindow = 88 -bbb.shortcutkey.polling.closeStatsWindow.function = 关闭调查结果窗口 +bbb.shortcutkey.polling.closeStatsWindow.function = 关闭调查结果窗口。 bbb.shortcutkey.polling.vote = 86 -bbb.shortcutkey.polling.vote.function = 赞成已经选择的选项 +bbb.shortcutkey.polling.vote.function = 赞成已经选择的选项。 bbb.shortcutkey.polling.focusVoteQuestion = 81\n -bbb.shortcutkey.polling.focusVoteQuestion.function = 把焦点放在问题上 +bbb.shortcutkey.polling.focusVoteQuestion.function = 把焦点放在问题上。 bbb.shortcutkey.specialKeys.space = 空格键 -bbb.shortcutkey.specialKeys.left = 左箭头键 -bbb.shortcutkey.specialKeys.right = 右箭头键 -bbb.shortcutkey.specialKeys.up = 上箭头键 -bbb.shortcutkey.specialKeys.down = 下箭头键键 +bbb.shortcutkey.specialKeys.left = 左键 +bbb.shortcutkey.specialKeys.right = 右键 +bbb.shortcutkey.specialKeys.up = 上键 +bbb.shortcutkey.specialKeys.down = 下键 bbb.shortcutkey.specialKeys.plus = 加 bbb.shortcutkey.specialKeys.minus = 减 diff --git a/bigbluebutton-client/locale/zh_TW/bbbResources.properties b/bigbluebutton-client/locale/zh_TW/bbbResources.properties index d0277f8962..3fba22a1de 100644 --- a/bigbluebutton-client/locale/zh_TW/bbbResources.properties +++ b/bigbluebutton-client/locale/zh_TW/bbbResources.properties @@ -181,7 +181,10 @@ bbb.desktopPublish.closeBtn.toolTip = 停止共享並關閉視窗 bbb.desktopPublish.minimizeBtn.toolTip = 最小化視窗 bbb.desktopPublish.minimizeBtn.accessibilityName = 最小化螢幕共享發佈視窗 bbb.desktopPublish.maximizeRestoreBtn.accessibilityName = 最大化螢幕共享發佈視窗 -bbb.desktopPublish.closeBtn.accessibilityName = 停止共享并關閉螢幕發佈視窗 +# bbb.desktopPublish.javaRequiredLabel = Requires Java 7u45 (or later) to run. +# bbb.desktopPublish.javaTestLinkLabel = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip = Test Java +# bbb.desktopPublish.javaTestLinkLabel.tooltip.accessibility = Test Java bbb.desktopView.title = 桌面共享 bbb.desktopView.fitToWindow = 填滿整個視窗 bbb.desktopView.actualSize = 顯示實際大小 diff --git a/bigbluebutton-client/resources/config.xml.template b/bigbluebutton-client/resources/config.xml.template index 2401ac373a..e27e6a06d0 100755 --- a/bigbluebutton-client/resources/config.xml.template +++ b/bigbluebutton-client/resources/config.xml.template @@ -3,6 +3,7 @@ 0.8 VERSION + diff --git a/bigbluebutton-client/resources/prod/bbb-deskshare-applet-0.8.1.jar b/bigbluebutton-client/resources/prod/bbb-deskshare-applet-0.8.1.jar old mode 100644 new mode 100755 index 6643900cf4..19db4097e3 Binary files a/bigbluebutton-client/resources/prod/bbb-deskshare-applet-0.8.1.jar and b/bigbluebutton-client/resources/prod/bbb-deskshare-applet-0.8.1.jar differ diff --git a/bigbluebutton-client/resources/prod/bbb-deskshare-applet-unsigned-0.8.1.jar b/bigbluebutton-client/resources/prod/bbb-deskshare-applet-unsigned-0.8.1.jar old mode 100644 new mode 100755 index b0baa8fcb0..cdbfc69919 Binary files a/bigbluebutton-client/resources/prod/bbb-deskshare-applet-unsigned-0.8.1.jar and b/bigbluebutton-client/resources/prod/bbb-deskshare-applet-unsigned-0.8.1.jar differ diff --git a/bigbluebutton-client/resources/prod/lib/bbb_deskshare.js b/bigbluebutton-client/resources/prod/lib/bbb_deskshare.js index 66c2f0d3c1..3b83b5df17 100755 --- a/bigbluebutton-client/resources/prod/lib/bbb_deskshare.js +++ b/bigbluebutton-client/resources/prod/lib/bbb_deskshare.js @@ -9,8 +9,10 @@ function startApplet(IP, roomNumber, fullScreen, useSVC2) "" + "" + "" + + "" + "" + "" + + "" + "" ); } diff --git a/bigbluebutton-client/resources/prod/locales.xml b/bigbluebutton-client/resources/prod/locales.xml index e08491c2dd..3fad42325b 100755 --- a/bigbluebutton-client/resources/prod/locales.xml +++ b/bigbluebutton-client/resources/prod/locales.xml @@ -49,4 +49,5 @@ + diff --git a/bigbluebutton-client/src/DeskshareStandalone.mxml b/bigbluebutton-client/src/DeskshareStandalone.mxml index 76854f7c03..03d85fc7a8 100755 --- a/bigbluebutton-client/src/DeskshareStandalone.mxml +++ b/bigbluebutton-client/src/DeskshareStandalone.mxml @@ -219,7 +219,7 @@ with BigBlueButton; if not, see . case "NetStream.Play.Start": trace("DeskshareSA::NetStream.Publish.Start for broadcast stream " + stream); trace("DeskshareSA::Dispatching start viewing event"); - service.sendStartedViewingNotification(); + service.sendStartedViewingNotification(stream); break; case "NetStream.Play.UnpublishNotify": trace("DeskshareSA::NetStream.Play.UnpublishNotify for broadcast stream " + stream); diff --git a/bigbluebutton-client/src/org/bigbluebutton/common/IBbbCanvas.as b/bigbluebutton-client/src/org/bigbluebutton/common/IBbbCanvas.as index 003354f83e..d99e26039d 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/common/IBbbCanvas.as +++ b/bigbluebutton-client/src/org/bigbluebutton/common/IBbbCanvas.as @@ -33,7 +33,7 @@ package org.bigbluebutton.common function doesContain(child:DisplayObject):Boolean; function acceptOverlayCanvas(overlay:IBbbCanvas):void; function moveCanvas(x:Number, y:Number):void; - function zoomCanvas(width:Number, height:Number):void; + function zoomCanvas(width:Number, height:Number, zoom:Number):void; function showCanvas(show:Boolean):void; } } \ No newline at end of file diff --git a/bigbluebutton-client/src/org/bigbluebutton/core/EventConstants.as b/bigbluebutton-client/src/org/bigbluebutton/core/EventConstants.as index 2ff1a66861..e4fc8d3a5e 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/core/EventConstants.as +++ b/bigbluebutton-client/src/org/bigbluebutton/core/EventConstants.as @@ -57,7 +57,7 @@ package org.bigbluebutton.core public static const USER_KICKED_OUT:String = 'UserKickedOutEvent'; public static const USER_MUTED_VOICE:String = 'UserVoiceMutedEvent'; public static const USER_TALKING:String = 'UserTalkingEvent'; - public static const USER_LOCKED_VOICE:String = 'UserLockedVoiceEvent'; + public static const USER_LOCKED:String = 'UserLockedEvent'; public static const START_PRIVATE_CHAT:String = "StartPrivateChatEvent"; public static const GET_MY_USER_INFO_REP:String = "GetMyUserInfoResponse"; public static const IS_USER_PUBLISHING_CAM_RESP:String = "IsUserPublishingCamResponse"; diff --git a/bigbluebutton-client/src/org/bigbluebutton/core/events/LockControlEvent.as b/bigbluebutton-client/src/org/bigbluebutton/core/events/LockControlEvent.as new file mode 100644 index 0000000000..1e1c5bf297 --- /dev/null +++ b/bigbluebutton-client/src/org/bigbluebutton/core/events/LockControlEvent.as @@ -0,0 +1,47 @@ +/** +* BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ +* +* Copyright (c) 2010 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 2.1 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.events +{ + import flash.events.Event; + + public class LockControlEvent extends Event + { + public static const LOCK_ALL:String = "LOCKCONTROL_LOCK_ALL"; + public static const UNLOCK_ALL:String = "LOCKCONTROL_UNLOCK_ALL"; + + public static const LOCK_ALMOST_ALL:String = "LOCKCONTROL_LOCK_ALMOST_ALL"; + + public static const LOCK_USER:String = "LOCKCONTROL_LOCK_USER"; + public static const UNLOCK_USER:String = "LOCKCONTROL_UNLOCK_USER"; + + public static const OPEN_LOCK_SETTINGS:String = "LOCKCONTROL_OPEN_LOCK_SETTINGS"; + public static const SAVE_LOCK_SETTINGS:String = "LOCKCONTROL_SAVE_LOCK_SETTINGS"; + + public static const CHANGED_LOCK_SETTINGS:String = "LOCKCONTROL_CHANGED_LOCK_SETTINGS"; + + + public var internalUserID:String; + public var payload:Object; + + public function LockControlEvent(type:String) + { + super(type, true, false); + } + } +} \ No newline at end of file diff --git a/bigbluebutton-client/src/org/bigbluebutton/core/events/LockSettingsEvent.as b/bigbluebutton-client/src/org/bigbluebutton/core/events/LockSettingsEvent.as new file mode 100644 index 0000000000..eaf6fcb2e8 --- /dev/null +++ b/bigbluebutton-client/src/org/bigbluebutton/core/events/LockSettingsEvent.as @@ -0,0 +1,34 @@ +/** +* BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ +* +* Copyright (c) 2010 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 2.1 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.events +{ + import flash.events.Event; + + public class LockSettingsEvent extends Event + { + public static const LOCKSETTINGS_CHANGE:String = "LOCKSETTINGS_CHANGE"; + + public var lockSettingsMap:Object; + + public function LockSettingsEvent(type:String) + { + super(type, true, false); + } + } +} \ No newline at end of file diff --git a/bigbluebutton-client/src/org/bigbluebutton/core/events/VoiceConfEvent.as b/bigbluebutton-client/src/org/bigbluebutton/core/events/VoiceConfEvent.as index 93dc9d9902..5c2fb8de28 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/core/events/VoiceConfEvent.as +++ b/bigbluebutton-client/src/org/bigbluebutton/core/events/VoiceConfEvent.as @@ -24,7 +24,7 @@ package org.bigbluebutton.core.events { public static const MUTE_ALL:String = "VOICECONF_MUTE_ALL"; public static const UNMUTE_ALL:String = "VOICECONF_UNMUTE_ALL"; - public static const LOCK_MUTE_USER:String = "LOCK_MUTE_USER"; + public static const LOCK_MUTE_USER:String = "LOCK_MUTE_USER"; public static const MUTE_ALMOST_ALL:String = "VOICECONF_MUTE_ALMOST_ALL"; public static const MUTE_USER:String = "VOICECONF_MUTE_USER"; @@ -34,7 +34,7 @@ package org.bigbluebutton.core.events public var userid:int; public var mute:Boolean; - public var lock:Boolean; + public var lock:Boolean; public function VoiceConfEvent(type:String) { diff --git a/bigbluebutton-client/src/org/bigbluebutton/core/model/Config.as b/bigbluebutton-client/src/org/bigbluebutton/core/model/Config.as index 5609a74b8f..10dadbe464 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/core/model/Config.as +++ b/bigbluebutton-client/src/org/bigbluebutton/core/model/Config.as @@ -34,6 +34,12 @@ package org.bigbluebutton.core.model help.url = config.help.@url; return help; } + + public function get javaTest():Object { + var javaTest:Object = new Object(); + javaTest.url = config.javaTest.@url; + return javaTest; + } public function get locale():Object { var v:Object = new Object(); @@ -81,6 +87,15 @@ package org.bigbluebutton.core.model public function get layout():XML { return new XML(config.layout.toXMLString()); } + + public function get meeting():XML { + return new XML(config.meeting.toXMLString()); + } + + public function get lock():XML { + if(config.lock == null) return null; + return new XML(config.lock.toXMLString()); + } public function isModulePresent(name:String):Boolean { var mn:XMLList = config.modules..@name; diff --git a/bigbluebutton-client/src/org/bigbluebutton/core/vo/LockSettings.as b/bigbluebutton-client/src/org/bigbluebutton/core/vo/LockSettings.as new file mode 100644 index 0000000000..ebfe51fe36 --- /dev/null +++ b/bigbluebutton-client/src/org/bigbluebutton/core/vo/LockSettings.as @@ -0,0 +1,70 @@ +/** + * BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ + * + * Copyright (c) 2012 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.vo +{ + public class LockSettings + { + private var allowModeratorLocking:Boolean; + private var disableCam:Boolean; + private var disableMic:Boolean; + private var disablePrivateChat:Boolean; + private var disablePublicChat:Boolean; + + public function LockSettings(pAllowModeratorLocking:Boolean, pDisableCam:Boolean, pDisableMic:Boolean, pDisablePrivateChat:Boolean, pDisablePublicChat:Boolean) + { + this.allowModeratorLocking = pAllowModeratorLocking; + this.disableCam = pDisableCam; + this.disableMic = pDisableMic; + this.disablePrivateChat = pDisablePrivateChat; + this.disablePublicChat = pDisablePublicChat; + } + + public function toMap():Object { + var map:Object = { + allowModeratorLocking: this.allowModeratorLocking, + disableCam: this.disableCam, + disableMic: this.disableMic, + disablePrivateChat: this.disablePrivateChat, + disablePublicChat: this.disablePublicChat + }; + + return map; + } + + public function getAllowModeratorLocking():Boolean { + return allowModeratorLocking; + } + + public function getDisableCam():Boolean { + return disableCam; + } + + public function getDisableMic():Boolean { + return disableMic; + } + + public function getDisablePrivateChat():Boolean { + return disablePrivateChat; + } + + public function getDisablePublicChat():Boolean { + return disablePublicChat; + } + } +} \ No newline at end of file diff --git a/bigbluebutton-client/src/org/bigbluebutton/core/vo/LockSettingsVO.as b/bigbluebutton-client/src/org/bigbluebutton/core/vo/LockSettingsVO.as new file mode 100644 index 0000000000..d067505899 --- /dev/null +++ b/bigbluebutton-client/src/org/bigbluebutton/core/vo/LockSettingsVO.as @@ -0,0 +1,70 @@ +/** + * BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ + * + * Copyright (c) 2012 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.vo +{ + public class LockSettingsVO + { + private var allowModeratorLocking:Boolean; + private var disableCam:Boolean; + private var disableMic:Boolean; + private var disablePrivateChat:Boolean; + private var disablePublicChat:Boolean; + + public function LockSettingsVO(pAllowModeratorLocking:Boolean, pDisableCam:Boolean, pDisableMic:Boolean, pDisablePrivateChat:Boolean, pDisablePublicChat:Boolean) + { + this.allowModeratorLocking = pAllowModeratorLocking; + this.disableCam = pDisableCam; + this.disableMic = pDisableMic; + this.disablePrivateChat = pDisablePrivateChat; + this.disablePublicChat = pDisablePublicChat; + } + + public function toMap():Object { + var map:Object = { + allowModeratorLocking: this.allowModeratorLocking, + disableCam: this.disableCam, + disableMic: this.disableMic, + disablePrivateChat: this.disablePrivateChat, + disablePublicChat: this.disablePublicChat + }; + + return map; + } + + public function getAllowModeratorLocking():Boolean { + return allowModeratorLocking; + } + + public function getDisableCam():Boolean { + return disableCam; + } + + public function getDisableMic():Boolean { + return disableMic; + } + + public function getDisablePrivateChat():Boolean { + return disablePrivateChat; + } + + public function getDisablePublicChat():Boolean { + return disablePublicChat; + } + } +} \ No newline at end of file diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/api/ExternalApiCalls.as b/bigbluebutton-client/src/org/bigbluebutton/main/api/ExternalApiCalls.as index 3cefe7a9eb..389e3abb8d 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/main/api/ExternalApiCalls.as +++ b/bigbluebutton-client/src/org/bigbluebutton/main/api/ExternalApiCalls.as @@ -225,9 +225,9 @@ package org.bigbluebutton.main.api broadcastEvent(payload); } - public function handleUserVoiceLockedEvent(event:BBBEvent):void { + public function handleUserLockedEvent(event:BBBEvent):void { var payload:Object = new Object(); - payload.eventName = EventConstants.USER_LOCKED_VOICE; + payload.eventName = EventConstants.USER_LOCKED; payload.userID = UsersUtil.internalUserIDToExternalUserID(event.payload.userID); payload.locked = event.payload.locked; diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/api/maps/ExternalApiEventMap.mxml b/bigbluebutton-client/src/org/bigbluebutton/main/api/maps/ExternalApiEventMap.mxml index 3805bfc958..ca7995fedb 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/main/api/maps/ExternalApiEventMap.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/main/api/maps/ExternalApiEventMap.mxml @@ -75,8 +75,8 @@ with BigBlueButton; if not, see . - - + + diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/events/BBBEvent.as b/bigbluebutton-client/src/org/bigbluebutton/main/events/BBBEvent.as index 06e80a011b..bceedc7ded 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/main/events/BBBEvent.as +++ b/bigbluebutton-client/src/org/bigbluebutton/main/events/BBBEvent.as @@ -34,7 +34,7 @@ package org.bigbluebutton.main.events { public static const DESKSHARE_STARTED:String = 'BBB_DESKSHARE_STARTED'; public static const USER_VOICE_JOINED:String = 'user voice joined event'; public static const USER_VOICE_MUTED:String = "user voice muted event"; - public static const USER_VOICE_LOCKED:String = "user voice locked event"; + public static const USER_LOCKED:String = "user locked event"; public static const USER_VOICE_LEFT:String = "user voice left event"; public static const USER_VOICE_TALKING:String = "user voice talking event"; public static const CAMERA_SETTING:String = "camera settings event"; @@ -42,6 +42,7 @@ package org.bigbluebutton.main.events { public static const MIC_SETTINGS_CLOSED:String = "MIC_SETTINGS_CLOSED"; public static const CAM_SETTINGS_CLOSED:String = "CAM_SETTINGS_CLOSED"; public static const JOIN_VOICE_FOCUS_HEAD:String = "JOIN_VOICE_FOCUS_HEAD"; + public static const CHANGE_RECORDING_STATUS:String = "CHANGE_RECORDING_STATUS"; public var message:String; public var payload:Object = new Object(); diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/events/RecordStatusEvent.as b/bigbluebutton-client/src/org/bigbluebutton/main/events/RecordStatusEvent.as deleted file mode 100755 index a71467e569..0000000000 --- a/bigbluebutton-client/src/org/bigbluebutton/main/events/RecordStatusEvent.as +++ /dev/null @@ -1,36 +0,0 @@ -/** - * BigBlueButton open source conferencing system - http://www.bigbluebutton.org/ - * - * Copyright (c) 2012 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.main.events -{ - import flash.events.Event; - - public class RecordStatusEvent extends Event - { - public static const RECORD_STATUS_EVENT:String = "RECORD_STATUS_EVENT"; - - public var module:String; - public var status:String; - - public function RecordStatusEvent(bubbles:Boolean=true, cancelable:Boolean=false) - { - super(RECORD_STATUS_EVENT, bubbles, cancelable); - } - - } -} \ No newline at end of file diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/maps/ApplicationEventMap.mxml b/bigbluebutton-client/src/org/bigbluebutton/main/maps/ApplicationEventMap.mxml index 9f10e55d9a..fc726bde93 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/main/maps/ApplicationEventMap.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/main/maps/ApplicationEventMap.mxml @@ -109,6 +109,10 @@ with BigBlueButton; if not, see . + + + + . import org.bigbluebutton.core.managers.ConfigManager; import org.bigbluebutton.core.services.SkinningService; import org.bigbluebutton.core.services.StreamMonitor; + import org.bigbluebutton.main.events.BBBEvent; import org.bigbluebutton.main.events.ConfigEvent; import org.bigbluebutton.main.events.LogoutEvent; import org.bigbluebutton.main.events.ModuleLoadEvent; diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/model/ConferenceParameters.as b/bigbluebutton-client/src/org/bigbluebutton/main/model/ConferenceParameters.as index 795a72fdb1..a0890aff76 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/main/model/ConferenceParameters.as +++ b/bigbluebutton-client/src/org/bigbluebutton/main/model/ConferenceParameters.as @@ -90,5 +90,20 @@ package org.bigbluebutton.main.model */ public var userid:String; public var record:Boolean; + + /** + * Flag used to start room as locked + * */ + public var lockOnStart:Boolean; + + /** + * Flag used to start room as muted + * */ + public var muteOnStart:Boolean; + + /** + * Parameter used to send initial lock settings + * */ + public var lockSettings:Object; } } \ No newline at end of file diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/model/users/BBBUser.as b/bigbluebutton-client/src/org/bigbluebutton/main/model/users/BBBUser.as index 9c78c3823b..2e2fa5866e 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/main/model/users/BBBUser.as +++ b/bigbluebutton-client/src/org/bigbluebutton/main/model/users/BBBUser.as @@ -20,13 +20,14 @@ package org.bigbluebutton.main.model.users { import com.asfusion.mate.events.Dispatcher; - import mx.collections.ArrayCollection; - - import org.bigbluebutton.common.LogUtil; import org.bigbluebutton.common.Role; - import org.bigbluebutton.core.managers.UserManager; + import org.bigbluebutton.core.events.LockControlEvent; + import org.bigbluebutton.core.events.VoiceConfEvent; + import org.bigbluebutton.core.managers.UserManager; + import org.bigbluebutton.core.vo.LockSettingsVO; import org.bigbluebutton.main.model.users.events.StreamStartedEvent; - import org.bigbluebutton.util.i18n.ResourceUtil; + import org.bigbluebutton.modules.videoconf.events.ClosePublishWindowEvent; + import org.bigbluebutton.util.i18n.ResourceUtil; public class BBBUser { @@ -43,6 +44,12 @@ package org.bigbluebutton.main.model.users [Bindable] public var name:String; [Bindable] public var talking:Boolean = false; [Bindable] public var phoneUser:Boolean = false; + + [Bindable] public var disableMyCam:Boolean = false; + [Bindable] public var disableMyMic:Boolean = false; + [Bindable] public var disableMyPrivateChat:Boolean = false; + [Bindable] public var disableMyPublicChat:Boolean = false; + private var _hasStream:Boolean = false; [Bindable] public function get hasStream():Boolean { @@ -112,7 +119,7 @@ package org.bigbluebutton.main.model.users verifyMedia(); } - [Bindable] public var voiceLocked:Boolean = false; + [Bindable] public var userLocked:Boolean = false; [Bindable] public var status:String = ""; [Bindable] public var customdata:Object = {}; @@ -170,6 +177,7 @@ package org.bigbluebutton.main.model.users isPresenter = ResourceUtil.getInstance().getString('bbb.viewers.viewersGrid.statusItemRenderer.presIcon.toolTip'); if (raiseHand) handRaised = ResourceUtil.getInstance().getString('bbb.viewers.viewersGrid.statusItemRenderer.raiseHand.toolTip'); + status = showingWebcam + isPresenter + handRaised; } @@ -183,6 +191,11 @@ package org.bigbluebutton.main.model.users presenter = status.value } switch (status.name) { + case "locked": + userLocked = status.value as Boolean; + if(me) + applyLockSettings(); + break; case "presenter": presenter = status.value; break; @@ -243,10 +256,13 @@ package org.bigbluebutton.main.model.users n.talking = user.talking; n.userStatus = user.userStatus; n.voiceJoined = user.voiceJoined; - n.voiceLocked = user.voiceLocked; + n.userLocked = user.userLocked; n.voiceMuted = user.voiceMuted; n.voiceUserid = user.voiceUserid; - + n.disableMyCam = user.disableMyCam; + n.disableMyMic = user.disableMyMic; + n.disableMyPrivateChat = user.disableMyPrivateChat; + n.disableMyPublicChat = user.disableMyPublicChat; return n; } @@ -254,5 +270,32 @@ package org.bigbluebutton.main.model.users var dispatcher:Dispatcher = new Dispatcher(); dispatcher.dispatchEvent(new StreamStartedEvent(userID, name, streamName)); } + + public function applyLockSettings():void { + var lockSettings:LockSettingsVO = UserManager.getInstance().getConference().getLockSettings(); + + disableMyCam = userLocked && lockSettings.getDisableCam(); + disableMyMic = userLocked && lockSettings.getDisableMic(); + disableMyPrivateChat = userLocked && lockSettings.getDisablePrivateChat(); + disableMyPublicChat = userLocked && lockSettings.getDisablePublicChat(); + + var dispatcher:Dispatcher = new Dispatcher(); + + var event:LockControlEvent = new LockControlEvent(LockControlEvent.CHANGED_LOCK_SETTINGS) + dispatcher.dispatchEvent(event); + + //If it's sharing webcam, stop it + if(disableMyCam && hasStream){ + dispatcher.dispatchEvent(new ClosePublishWindowEvent()); + } + + //If it's sharing microphone, mute it + if(disableMyMic && !UserManager.getInstance().getConference().isMyVoiceMuted()) { + var e:VoiceConfEvent = new VoiceConfEvent(VoiceConfEvent.MUTE_USER); + e.userid = UserManager.getInstance().getConference().getMyVoiceUserId(); + e.mute = true; + dispatcher.dispatchEvent(e); + } + } } } \ No newline at end of file diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/model/users/Conference.as b/bigbluebutton-client/src/org/bigbluebutton/main/model/users/Conference.as index 0ff4ea5440..a3a1b4b51f 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/main/model/users/Conference.as +++ b/bigbluebutton-client/src/org/bigbluebutton/main/model/users/Conference.as @@ -23,7 +23,9 @@ package org.bigbluebutton.main.model.users { import org.bigbluebutton.common.LogUtil; import org.bigbluebutton.common.Role; import org.bigbluebutton.core.BBB; + import org.bigbluebutton.core.model.Config; import org.bigbluebutton.core.vo.CameraSettingsVO; + import org.bigbluebutton.core.vo.LockSettingsVO; public class Conference { public var meetingName:String; @@ -33,7 +35,10 @@ package org.bigbluebutton.main.model.users { public var avatarURL:String; public var voiceBridge:String; public var dialNumber:String; + [Bindable] public var record:Boolean; + private var lockSettings:LockSettingsVO; + private var _myCamSettings:CameraSettingsVO = new CameraSettingsVO(); [Bindable] private var me:BBBUser = null; @@ -327,12 +332,12 @@ package org.bigbluebutton.main.model.users { } [Bindable] - public function set voiceLocked(locked:Boolean):void { - me.voiceLocked = locked; + public function set locked(locked:Boolean):void { + me.userLocked = locked; } - public function get voiceLocked():Boolean { - return me.voiceLocked; + public function get locked():Boolean { + return me.userLocked; } public function getMyExternalUserID():String { @@ -396,6 +401,77 @@ package org.bigbluebutton.main.model.users { uids.addItem(u.userID); } return uids; - } + } + + /** + * Read default lock settings from config.xml + * */ + public function configLockSettings():void { + var config:Config = BBB.initConfigManager().config; + + var allowModeratorLocking:Boolean, disableCam:Boolean, disableMic:Boolean, disablePrivateChat:Boolean, disablePublicChat:Boolean; + + var lockConfig:XML; + + if(config!=null) { + lockConfig = config.lock; + } + + try{ + allowModeratorLocking = (lockConfig.@allowModeratorLocking.toUpperCase() == "TRUE"); + }catch(e:Error) { + allowModeratorLocking = false; + } + + try{ + disableCam = (lockConfig.@disableCamForLockedUsers.toUpperCase() == "TRUE"); + }catch(e:Error) { + disableCam = false; + } + + try{ + disableMic = (lockConfig.@disableMicForLockedUsers.toUpperCase() == "TRUE"); + }catch(e:Error) { + disableMic = false; + } + + try{ + disablePrivateChat = (lockConfig.@disablePrivateChatForLockedUsers.toUpperCase() == "TRUE"); + }catch(e:Error) { + disablePrivateChat = false; + } + + try{ + disablePublicChat = (lockConfig.@disablePublicChatForLockedUsers.toUpperCase() == "TRUE"); + }catch(e:Error) { + disablePublicChat = false; + } + + lockSettings = new LockSettingsVO(allowModeratorLocking, disableCam, disableMic, disablePrivateChat, disablePublicChat); + } + + public function getMyUser():BBBUser { + var eachUser:BBBUser; + + for (var i:int = 0; i < users.length; i++) { + eachUser = users.getItemAt(i) as BBBUser; + + if (eachUser.userID == me.userID) { + return eachUser; + } + } + + return null; + } + + public function getLockSettings():LockSettingsVO { + return lockSettings; + } + + public function setLockSettings(lockSettings:LockSettingsVO):void { + this.lockSettings = lockSettings; + + getMyUser().applyLockSettings(); + } } } diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/model/users/NetConnectionDelegate.as b/bigbluebutton-client/src/org/bigbluebutton/main/model/users/NetConnectionDelegate.as index e6eda0a27b..d90cbd2ab1 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/main/model/users/NetConnectionDelegate.as +++ b/bigbluebutton-client/src/org/bigbluebutton/main/model/users/NetConnectionDelegate.as @@ -145,7 +145,7 @@ package org.bigbluebutton.main.model.users _netConnection.connect(uri, _conferenceParameters.username, _conferenceParameters.role, _conferenceParameters.room, _conferenceParameters.voicebridge, _conferenceParameters.record, _conferenceParameters.externUserID, - _conferenceParameters.internalUserID); + _conferenceParameters.internalUserID, _conferenceParameters.lockOnStart, _conferenceParameters.muteOnStart, _conferenceParameters.lockSettings); } catch(e:ArgumentError) { // Invalid parameters. switch (e.errorID) { diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/model/users/UserService.as b/bigbluebutton-client/src/org/bigbluebutton/main/model/users/UserService.as index 038bed2f83..d46ef9cef8 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/main/model/users/UserService.as +++ b/bigbluebutton-client/src/org/bigbluebutton/main/model/users/UserService.as @@ -29,8 +29,11 @@ package org.bigbluebutton.main.model.users import org.bigbluebutton.common.LogUtil; import org.bigbluebutton.core.BBB; + import org.bigbluebutton.core.managers.ConfigManager; import org.bigbluebutton.core.managers.UserConfigManager; import org.bigbluebutton.core.managers.UserManager; + import org.bigbluebutton.core.model.Config; + import org.bigbluebutton.main.events.BBBEvent; import org.bigbluebutton.main.events.SuccessfulLoginEvent; import org.bigbluebutton.main.events.UserServicesEvent; import org.bigbluebutton.main.model.ConferenceParameters; @@ -73,6 +76,8 @@ package org.bigbluebutton.main.model.users private function joinListener(success:Boolean, result:Object):void { if (success) { + var config:Config = BBB.initConfigManager().config; + UserManager.getInstance().getConference().setMyName(result.username); UserManager.getInstance().getConference().setMyRole(result.role); UserManager.getInstance().getConference().setMyRoom(result.room); @@ -89,9 +94,18 @@ package org.bigbluebutton.main.model.users UserManager.getInstance().getConference().dialNumber = result.dialnumber; UserManager.getInstance().getConference().setMyUserid(result.internalUserId); + UserManager.getInstance().getConference().externalMeetingID = result.externMeetingID; + UserManager.getInstance().getConference().meetingName = result.conferenceName; + UserManager.getInstance().getConference().internalMeetingID = result.room; + UserManager.getInstance().getConference().externalUserID = result.externUserID; + UserManager.getInstance().getConference().avatarURL = result.avatarURL; + UserManager.getInstance().getConference().voiceBridge = result.voicebridge; + UserManager.getInstance().getConference().dialNumber = result.dialnumber; + UserManager.getInstance().getConference().record = (result.record != "false"); + _conferenceParameters = new ConferenceParameters(); - _conferenceParameters.meetingName = result.conferenceName; - _conferenceParameters.externMeetingID = result.externMeetingID; + _conferenceParameters.meetingName = result.conferenceName; + _conferenceParameters.externMeetingID = result.externMeetingID; _conferenceParameters.conference = result.conference; _conferenceParameters.username = result.username; _conferenceParameters.role = result.role; @@ -103,12 +117,26 @@ package org.bigbluebutton.main.model.users _conferenceParameters.externUserID = result.externUserID; _conferenceParameters.internalUserID = result.internalUserId; _conferenceParameters.logoutUrl = result.logoutUrl; - _conferenceParameters.record = true; + _conferenceParameters.record = (result.record != "false"); - if (result.record == "false") { - _conferenceParameters.record = false; + var muteOnStart:Boolean; + try { + muteOnStart = (config.meeting.@muteOnStart.toUpperCase() == "TRUE"); + } catch(e:Error) { + muteOnStart = false; } + var lockOnStart:Boolean; + try { + lockOnStart = (config.meeting.@lockOnStart.toUpperCase() == "TRUE"); + } catch(e:Error) { + lockOnStart = false; + } + + _conferenceParameters.muteOnStart = muteOnStart; + _conferenceParameters.lockOnStart = lockOnStart; + _conferenceParameters.lockSettings = UserManager.getInstance().getConference().getLockSettings().toMap(); + // assign the meeting name to the document title ExternalInterface.call("setTitle", _conferenceParameters.meetingName); @@ -192,5 +220,15 @@ package org.bigbluebutton.main.model.users var name:String = e.username; sender.assignPresenter(assignTo, name, 1); } + + public function changeRecordingStatus(e:BBBEvent):void { + trace("UserService::changeRecordingStatus") + if (this.isModerator() && !e.payload.remote) { + _userSOService.changeRecordingStatus( + UserManager.getInstance().getConference().getMyUserId(), + e.payload.recording + ); + } + } } } diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/model/users/UsersSOService.as b/bigbluebutton-client/src/org/bigbluebutton/main/model/users/UsersSOService.as index 8ada1f4772..3f1eaa9ab6 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/main/model/users/UsersSOService.as +++ b/bigbluebutton-client/src/org/bigbluebutton/main/model/users/UsersSOService.as @@ -21,6 +21,7 @@ package org.bigbluebutton.main.model.users { import flash.events.AsyncErrorEvent; import flash.events.NetStatusEvent; + import flash.external.ExternalInterface; import flash.net.NetConnection; import flash.net.Responder; import flash.net.SharedObject; @@ -32,6 +33,7 @@ package org.bigbluebutton.main.model.users { import org.bigbluebutton.core.events.CoreEvent; import org.bigbluebutton.core.managers.ConnectionManager; import org.bigbluebutton.core.managers.UserManager; + import org.bigbluebutton.core.vo.LockSettingsVO; import org.bigbluebutton.main.events.BBBEvent; import org.bigbluebutton.main.events.LogoutEvent; import org.bigbluebutton.main.events.MadePresenterEvent; @@ -40,12 +42,15 @@ package org.bigbluebutton.main.model.users { import org.bigbluebutton.main.events.UserJoinedEvent; import org.bigbluebutton.main.events.UserLeftEvent; import org.bigbluebutton.main.model.ConferenceParameters; + import org.bigbluebutton.main.model.users.BBBUser; import org.bigbluebutton.main.model.users.events.ConnectionFailedEvent; import org.bigbluebutton.main.model.users.events.RoleChangeEvent; import org.bigbluebutton.modules.users.services.MessageSender; import org.bigbluebutton.util.i18n.ResourceUtil; import flash.external.ExternalInterface; import org.bigbluebutton.main.model.users.BBBUser; + import org.bigbluebutton.main.views.LockSettings; + import org.bigbluebutton.modules.deskshare.events.StopSharingButtonEvent; public class UsersSOService { public static const NAME:String = "ViewersSOService"; @@ -88,9 +93,10 @@ package org.bigbluebutton.main.model.users { _participantsSO.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler); _participantsSO.client = this; _participantsSO.connect(_connectionManager.connection); - LogUtil.debug("In UserSOService:join - Setting my userid to [" + userid + "]"); - + LogUtil.debug("In UserSOService:join - Setting my userid to [" + userid + "]"); + UserManager.getInstance().getConference().setMyUserid(userid); queryForParticipants(); + queryForRecordingStatus(); } @@ -184,6 +190,7 @@ package org.bigbluebutton.main.model.users { dispatcher.dispatchEvent(kickedEvent); if (UserManager.getInstance().getConference().amIThisUser(userid)) { + dispatcher.dispatchEvent(new StopSharingButtonEvent(StopSharingButtonEvent.STOP_SHARING)); dispatcher.dispatchEvent(new LogoutEvent(LogoutEvent.USER_LOGGED_OUT)); } } @@ -209,17 +216,17 @@ package org.bigbluebutton.main.model.users { user.userID = joinedUser.userid; user.name = joinedUser.name; user.role = joinedUser.role; - user.externUserID = joinedUser.externUserID; - user.isLeavingFlag = false; + user.externUserID = joinedUser.externUserID; + user.isLeavingFlag = false; LogUtil.debug("User status: " + joinedUser.status.hasStream); LogUtil.info("Joined as [" + user.userID + "," + user.name + "," + user.role + "]"); UserManager.getInstance().getConference().addUser(user); - participantStatusChange(user.userID, "hasStream", joinedUser.hasStream); - participantStatusChange(user.userID, "presenter", joinedUser.presenter); - participantStatusChange(user.userID, "raiseHand", joinedUser.raiseHand); - + participantStatusChange(user.userID, "hasStream", joinedUser.status.hasStream); + participantStatusChange(user.userID, "presenter", joinedUser.status.presenter); + participantStatusChange(user.userID, "raiseHand", joinedUser.status.raiseHand); + participantStatusChange(user.userID, "locked", joinedUser.status.locked); var joinEvent:UserJoinedEvent = new UserJoinedEvent(UserJoinedEvent.JOINED); joinEvent.userID = user.userID; @@ -357,5 +364,61 @@ package org.bigbluebutton.main.model.users { } } ) + + /** + * Callback from the server when lock settings are changed + */ + public function lockSettingsChange(newLockSettings:Object):void { + LogUtil.debug("Received lock settings change") + UserManager.getInstance().getConference().setLockSettings(new LockSettingsVO(newLockSettings.allowModeratorLocking, newLockSettings.disableCam, newLockSettings.disableMic, newLockSettings.disablePrivateChat, newLockSettings.disablePublicChat)); + } + + private function queryForRecordingStatus():void { + var nc:NetConnection = _connectionManager.connection; + nc.call( + "participants.getRecordingStatus",// Remote function name + new Responder( + // Boolean - On successful result + function(result:Object):void { + LogUtil.debug("Successfully queried recording status: " + result); + sendRecordingStatusUpdate(result); + }, + // status - On error occurred + function(status:Object):void { + LogUtil.error("Error occurred:"); + for (var x:Object in status) { + LogUtil.error(x + " : " + status[x]); + } + sendConnectionFailedEvent(ConnectionFailedEvent.UNKNOWN_REASON); + } + )//new Responder + ); //_netConnection.call + } + + public function changeRecordingStatus(userID:String, recording:Boolean):void { + trace("UsersSOService::changeRecordingStatus") + var nc:NetConnection = _connectionManager.connection; + nc.call( + "participants.setRecordingStatus",// Remote function name + responder, + userID, + recording + ); //_netConnection.call + } + + private function sendRecordingStatusUpdate(recording:Boolean):void { + var e:BBBEvent = new BBBEvent(BBBEvent.CHANGE_RECORDING_STATUS); + e.payload.remote = true; + e.payload.recording = recording; + dispatcher.dispatchEvent(e); + } + + /** + * Callback from the server + */ + public function recordingStatusChange(userID:String, recording:Boolean):void { + LogUtil.debug("Received recording status change [" + userID + "," + recording + "]") + sendRecordingStatusUpdate(recording); + } } } diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/CameraDisplaySettings.mxml b/bigbluebutton-client/src/org/bigbluebutton/main/views/CameraDisplaySettings.mxml index 9cad4d279e..986a00944b 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/main/views/CameraDisplaySettings.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/main/views/CameraDisplaySettings.mxml @@ -305,33 +305,27 @@ with BigBlueButton; if not, see . - + - - - - + - - - \ No newline at end of file diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/ChromeAllow.mxml b/bigbluebutton-client/src/org/bigbluebutton/main/views/ChromeAllow.mxml new file mode 100644 index 0000000000..20c9211482 --- /dev/null +++ b/bigbluebutton-client/src/org/bigbluebutton/main/views/ChromeAllow.mxml @@ -0,0 +1,58 @@ + + + + + + + + + + + diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/LockSettings.mxml b/bigbluebutton-client/src/org/bigbluebutton/main/views/LockSettings.mxml new file mode 100644 index 0000000000..e004d12ddc --- /dev/null +++ b/bigbluebutton-client/src/org/bigbluebutton/main/views/LockSettings.mxml @@ -0,0 +1,161 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/MainApplicationShell.mxml b/bigbluebutton-client/src/org/bigbluebutton/main/views/MainApplicationShell.mxml index 852f5310ab..6902fccde2 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/main/views/MainApplicationShell.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/main/views/MainApplicationShell.mxml @@ -33,7 +33,7 @@ with BigBlueButton; if not, see . - + @@ -46,6 +46,7 @@ with BigBlueButton; if not, see . + . import mx.containers.TitleWindow; import mx.controls.Alert; import mx.core.FlexGlobals; + import mx.core.IFlexDisplayObject; import mx.core.UIComponent; import mx.events.CloseEvent; import mx.managers.PopUpManager; @@ -73,142 +75,158 @@ with BigBlueButton; if not, see . import org.bigbluebutton.common.events.OpenWindowEvent; import org.bigbluebutton.common.events.ToolbarButtonEvent; import org.bigbluebutton.core.BBB; + import org.bigbluebutton.core.events.LockControlEvent; + import org.bigbluebutton.core.managers.UserManager; import org.bigbluebutton.main.events.AppVersionEvent; import org.bigbluebutton.main.events.BBBEvent; import org.bigbluebutton.main.events.ConfigEvent; import org.bigbluebutton.main.events.LogoutEvent; import org.bigbluebutton.main.events.ModuleLoadEvent; import org.bigbluebutton.main.events.PortTestEvent; - import org.bigbluebutton.main.events.RecordStatusEvent; import org.bigbluebutton.main.events.ShortcutEvent; import org.bigbluebutton.main.events.SuccessfulLoginEvent; import org.bigbluebutton.main.model.LayoutOptions; import org.bigbluebutton.main.model.users.events.ConnectionFailedEvent; import org.bigbluebutton.util.i18n.ResourceUtil; - import org.bigbluebutton.util.logging.Logger; - - private var globalDispatcher:Dispatcher; - private var dispState:String; //full-screen? - private var images:Images = new Images(); - private var stoppedModules:ArrayCollection; - private var logs:Logger = new Logger(); + import org.bigbluebutton.util.logging.Logger; + + private var globalDispatcher:Dispatcher; + private var dispState:String; //full-screen? + private var images:Images = new Images(); + private var stoppedModules:ArrayCollection; + private var logs:Logger = new Logger(); private var logWindow:LogWindow; - private var scWindow:ShortcutHelpWindow; - private var logoutWindow:LoggedOutWindow; + private var scWindow:ShortcutHelpWindow; + private var logoutWindow:LoggedOutWindow; private var connectionLostWindow:ConnectionLostWindow; - [Bindable] private var baseIndex:int = 100000; - - // LIVE or PLAYBACK - private var _mode:String = 'LIVE'; - [Bindable] public var appVersion:String = ' '; - private var localeVersion:String = 'old'; - [Bindable] public var numberOfModules:int = 0; - - [Bindable] private var fullscreen_icon:Class = images.full_screen; - [Bindable] private var logs_icon:Class = images.table; - [Bindable] private var reset_layout_icon:Class = images.layout; + [Bindable] private var baseIndex:int = 100000; + + // LIVE or PLAYBACK + private var _mode:String = 'LIVE'; + [Bindable] public var appVersion:String = ' '; + private var localeVersion:String = 'old'; + [Bindable] public var numberOfModules:int = 0; + + [Bindable] private var fullscreen_icon:Class = images.full_screen; + [Bindable] private var logs_icon:Class = images.table; + [Bindable] private var reset_layout_icon:Class = images.layout; [Bindable] private var statsIcon:Class = images.bandwidth; - - private var receivedConfigLocaleVer:Boolean = false; + + private var receivedConfigLocaleVer:Boolean = false; private var receivedResourceLocaleVer:Boolean = false; - - public function get mode():String { - return _mode; - } - - [Bindable] private var layoutOptions:LayoutOptions; - - [Bindable] private var showToolbarOpt:Boolean = true; - [Bindable] private var toolbarHeight:Number = 30; + + public function get mode():String { + return _mode; + } + + [Bindable] private var layoutOptions:LayoutOptions; + + [Bindable] private var showToolbarOpt:Boolean = true; + [Bindable] private var toolbarHeight:Number = 32; [Bindable] private var toolbarPaddingTop:Number = 4; [Bindable] private var showFooterOpt:Boolean = true; - [Bindable] private var footerHeight:Number = 20; + [Bindable] private var footerHeight:Number = 24; [Bindable] private var isTunneling:Boolean = false; private var confirmingLogout:Boolean = false; - - public function initOptions(e:Event):void { - layoutOptions = new LayoutOptions(); - layoutOptions.parseOptions(); - showToolbarOpt = layoutOptions.showToolbar; + + public function initOptions(e:Event):void { + UserManager.getInstance().getConference().configLockSettings(); + layoutOptions = new LayoutOptions(); + layoutOptions.parseOptions(); + showToolbarOpt = layoutOptions.showToolbar; if (!showToolbarOpt) { toolbarHeight = 0; toolbarPaddingTop = 0; - } + } toolbar.displayToolbar(); showFooterOpt = layoutOptions.showFooter; if (!showFooterOpt) { footerHeight = 0; - } + } - } - - protected function initializeShell():void { - globalDispatcher = new Dispatcher(); - } - - protected function initFullScreen():void { - /* Set up full screen handler. */ - stage.addEventListener(FullScreenEvent.FULL_SCREEN, fullScreenHandler); - dispState = stage.displayState; - } - - private var sendStartModulesEvent:Boolean = true; - - private function handleApplicationVersionEvent(event:AppVersionEvent):void { - if (event.configLocaleVersion == true) { - receivedConfigLocaleVer = true; - appVersion = event.appVersion; - localeVersion = event.localeVersion; -// LogUtil.debug("Received locale version fron config.xml"); - } else { - receivedResourceLocaleVer = true; - LogUtil.debug("Received locale version fron locale file."); - } - - if (receivedConfigLocaleVer && receivedResourceLocaleVer) { - LogUtil.debug("Comparing locale versions."); - if (!event.suppressLocaleWarning) checkLocaleVersion(localeVersion); + } + + protected function initializeShell():void { + globalDispatcher = new Dispatcher(); + + systemManager.addEventListener(Event.RESIZE, updateCopyrightLabelDimensions); + copyrightLabel2.addEventListener(FlexEvent.UPDATE_COMPLETE, updateCopyrightLabelDimensions); + updateCopyrightLabelDimensions(); + } + + private function updateCopyrightLabelDimensions(e:Event = null):void { + var screenRect:Rectangle = systemManager.screen; + + if (spacer.width == 0) { + copyrightLabel2.width += (screenRect.width - controlBar.width); + } else { + copyrightLabel2.width += Math.min(spacer.width, copyrightLabel2.measuredWidth - copyrightLabel2.width); + } + } + + protected function initFullScreen():void { + /* Set up full screen handler. */ + stage.addEventListener(FullScreenEvent.FULL_SCREEN, fullScreenHandler); + dispState = stage.displayState; + } + + private var sendStartModulesEvent:Boolean = true; + + private function handleApplicationVersionEvent(event:AppVersionEvent):void { + if (event.configLocaleVersion == true) { + receivedConfigLocaleVer = true; + appVersion = event.appVersion; + localeVersion = event.localeVersion; +// LogUtil.debug("Received locale version fron config.xml"); + } else { + receivedResourceLocaleVer = true; + LogUtil.debug("Received locale version fron locale file."); + } + + if (receivedConfigLocaleVer && receivedResourceLocaleVer) { + LogUtil.debug("Comparing locale versions."); + if (!event.suppressLocaleWarning) checkLocaleVersion(localeVersion); if (sendStartModulesEvent) { - - sendStartModulesEvent = false; - sendStartAllModulesEvent(); - } - } - } - - public function sendStartAllModulesEvent():void{ - LogUtil.debug("Sending start all modules event"); - var dispatcher:Dispatcher = new Dispatcher(); - dispatcher.dispatchEvent(new ModuleLoadEvent(ModuleLoadEvent.START_ALL_MODULES)); - } - - private function fullScreenHandler(evt:FullScreenEvent):void { - dispState = stage.displayState + " (fullScreen=" + evt.fullScreen.toString() + ")"; - if (evt.fullScreen) { - LogUtil.debug("Switching to full screen"); - /* Do something specific here if we switched to full screen mode. */ - - } else { - LogUtil.debug("Switching to normal screen"); - /* Do something specific here if we switched to normal mode. */ - } - } - - private function openLogWindow():void { - if (logWindow == null){ - logWindow = new LogWindow(); - logWindow.logs = logs; - } - mdiCanvas.windowManager.add(logWindow); - mdiCanvas.windowManager.absPos(logWindow, 50, 50); - logWindow.width = mdiCanvas.width - 100; - logWindow.height = mdiCanvas.height - 100; - } + + sendStartModulesEvent = false; + sendStartAllModulesEvent(); + } + } + } + + public function sendStartAllModulesEvent():void{ + LogUtil.debug("Sending start all modules event"); + var dispatcher:Dispatcher = new Dispatcher(); + dispatcher.dispatchEvent(new ModuleLoadEvent(ModuleLoadEvent.START_ALL_MODULES)); + } + + private function fullScreenHandler(evt:FullScreenEvent):void { + dispState = stage.displayState + " (fullScreen=" + evt.fullScreen.toString() + ")"; + if (evt.fullScreen) { + LogUtil.debug("Switching to full screen"); + /* Do something specific here if we switched to full screen mode. */ + + } else { + LogUtil.debug("Switching to normal screen"); + /* Do something specific here if we switched to normal mode. */ + } + } + + private function openLogWindow():void { + if (logWindow == null){ + logWindow = new LogWindow(); + logWindow.logs = logs; + } + mdiCanvas.windowManager.add(logWindow); + mdiCanvas.windowManager.absPos(logWindow, 50, 50); + logWindow.width = mdiCanvas.width - 100; + logWindow.height = mdiCanvas.height - 100; + } public function openShortcutHelpWindow(e:Event = null):void{ if (scWindow == null) { @@ -228,68 +246,68 @@ with BigBlueButton; if not, see . scWindow.focusHead(); } - - private function toggleFullScreen():void{ - LogUtil.debug("Toggling fullscreen"); - try { - switch (stage.displayState) { - case StageDisplayState.FULL_SCREEN: - LogUtil.debug("full screen mode"); - // If already in full screen mode, switch to normal mode. - stage.displayState = StageDisplayState.NORMAL; - break; - default: - LogUtil.debug("Normal screen mode"); - // If not in full screen mode, switch to full screen mode. - stage.displayState = StageDisplayState.FULL_SCREEN; - break; - } - } catch (err:SecurityError) { - // ignore - } - } - - private function handleOpenWindowEvent(event:OpenWindowEvent):void { - isTunneling = BBB.initConnectionManager().isTunnelling; - var window:IBbbModuleWindow = event.window; - mdiCanvas.addWindow(window); - } - - private function handleCloseWindowEvent(event:CloseWindowEvent):void { - var window:IBbbModuleWindow = event.window; - mdiCanvas.removeWindow(window); - } - - private function resetLayout():void{ - mdiCanvas.resetWindowLayout(); - } - - private function addComponentToCanvas(e:AddUIComponentToMainCanvas):void{ - mdiCanvas.addChild(e.component); - } - - public function checkLocaleVersion(localeVersion:String):void { - Alert.okLabel ="OK"; - var version:String = "old-locales"; - version = ResourceUtil.getInstance().getString('bbb.mainshell.locale.version'); - LogUtil.debug("Locale from config=" + localeVersion + ", from locale file=" + version); - - if ((version == "old-locales") || (version == "") || (version == null)) { - wrongLocaleVersion(); - } else { - if (version != localeVersion) wrongLocaleVersion(); - } - } - - private function showMicSettings(event:BBBEvent):void { - var micSettings:MicSettings = MicSettings(PopUpManager.createPopUp(mdiCanvas, MicSettings, true)); - var point1:Point = new Point(); - // Calculate position of TitleWindow in Application's coordinates. - point1.x = width/2; - point1.y = height/2; - micSettings.x = point1.x - (micSettings.width/2); - micSettings.y = point1.y - (micSettings.height/2); - } + + private function toggleFullScreen():void{ + LogUtil.debug("Toggling fullscreen"); + try { + switch (stage.displayState) { + case StageDisplayState.FULL_SCREEN: + LogUtil.debug("full screen mode"); + // If already in full screen mode, switch to normal mode. + stage.displayState = StageDisplayState.NORMAL; + break; + default: + LogUtil.debug("Normal screen mode"); + // If not in full screen mode, switch to full screen mode. + stage.displayState = StageDisplayState.FULL_SCREEN; + break; + } + } catch (err:SecurityError) { + // ignore + } + } + + private function handleOpenWindowEvent(event:OpenWindowEvent):void { + isTunneling = BBB.initConnectionManager().isTunnelling; + var window:IBbbModuleWindow = event.window; + mdiCanvas.addWindow(window); + } + + private function handleCloseWindowEvent(event:CloseWindowEvent):void { + var window:IBbbModuleWindow = event.window; + mdiCanvas.removeWindow(window); + } + + private function resetLayout():void{ + mdiCanvas.resetWindowLayout(); + } + + private function addComponentToCanvas(e:AddUIComponentToMainCanvas):void{ + mdiCanvas.addChild(e.component); + } + + public function checkLocaleVersion(localeVersion:String):void { + Alert.okLabel ="OK"; + var version:String = "old-locales"; + version = ResourceUtil.getInstance().getString('bbb.mainshell.locale.version'); + LogUtil.debug("Locale from config=" + localeVersion + ", from locale file=" + version); + + if ((version == "old-locales") || (version == "") || (version == null)) { + wrongLocaleVersion(); + } else { + if (version != localeVersion) wrongLocaleVersion(); + } + } + + private function showMicSettings(event:BBBEvent):void { + var micSettings:MicSettings = MicSettings(PopUpManager.createPopUp(mdiCanvas, MicSettings, true)); + var point1:Point = new Point(); + // Calculate position of TitleWindow in Application's coordinates. + point1.x = width/2; + point1.y = height/2; + micSettings.x = point1.x - (micSettings.width/2); + micSettings.y = point1.y - (micSettings.height/2); + } private function openVideoPreviewWindow(event:BBBEvent):void { var camSettings:CameraDisplaySettings = CameraDisplaySettings(PopUpManager.createPopUp(mdiCanvas, CameraDisplaySettings, true)); @@ -303,33 +321,33 @@ with BigBlueButton; if not, see . camSettings.x = point1.x - (camSettings.width/2); camSettings.y = point1.y - (camSettings.height/2); } - - private function wrongLocaleVersion():void { - var localeWindow:OldLocaleWarnWindow = OldLocaleWarnWindow(PopUpManager.createPopUp(mdiCanvas, OldLocaleWarnWindow, false)); - - var point1:Point = new Point(); - // Calculate position of TitleWindow in Application's coordinates. - point1.x = width/2; - point1.y = height/2; - localeWindow.x = point1.x - (localeWindow.width/2); - localeWindow.y = point1.y - (localeWindow.height/2); - } - - private function handleLogout(e:ConnectionFailedEvent):void { - if (layoutOptions.showLogoutWindow) { - if (logoutWindow != null) return; - logoutWindow = LoggedOutWindow(PopUpManager.createPopUp( mdiCanvas, LoggedOutWindow, false)); - - var point1:Point = new Point(); - // Calculate position of TitleWindow in Application's coordinates. - point1.x = width/2; - point1.y = height/2; - logoutWindow.x = point1.x - (logoutWindow.width/2); - logoutWindow.y = point1.y - (logoutWindow.height/2); - - if (e is ConnectionFailedEvent) logoutWindow.setReason((e as ConnectionFailedEvent).type); - else logoutWindow.setReason("You have logged out of the conference"); - + + private function wrongLocaleVersion():void { + var localeWindow:OldLocaleWarnWindow = OldLocaleWarnWindow(PopUpManager.createPopUp(mdiCanvas, OldLocaleWarnWindow, false)); + + var point1:Point = new Point(); + // Calculate position of TitleWindow in Application's coordinates. + point1.x = width/2; + point1.y = height/2; + localeWindow.x = point1.x - (localeWindow.width/2); + localeWindow.y = point1.y - (localeWindow.height/2); + } + + private function handleLogout(e:ConnectionFailedEvent):void { + if (layoutOptions.showLogoutWindow) { + if (logoutWindow != null) return; + logoutWindow = LoggedOutWindow(PopUpManager.createPopUp( mdiCanvas, LoggedOutWindow, false)); + + var point1:Point = new Point(); + // Calculate position of TitleWindow in Application's coordinates. + point1.x = width/2; + point1.y = height/2; + logoutWindow.x = point1.x - (logoutWindow.width/2); + logoutWindow.y = point1.y - (logoutWindow.height/2); + + if (e is ConnectionFailedEvent) logoutWindow.setReason((e as ConnectionFailedEvent).type); + else logoutWindow.setReason("You have logged out of the conference"); + mdiCanvas.removeAllWindows(); } else { mdiCanvas.removeAllWindows(); @@ -368,10 +386,6 @@ with BigBlueButton; if not, see . handleLogout(e); } - private function handleRecordStatusEvent(evt:RecordStatusEvent):void { - Alert.show(evt.status, evt.module); - } - private function handleAddToolbarComponent(event:ToolbarButtonEvent):void { if (event.location == ToolbarButtonEvent.BOTTOM_TOOLBAR) { (event.button as UIComponent).tabIndex = baseIndex; @@ -404,7 +418,19 @@ with BigBlueButton; if not, see . private function closeNetworkStatsWindow(e:Event = null):void { networkStatsWindow.disappear(); } - + + private function openLockSettingsWindow(event:LockControlEvent):void { + var popUp:IFlexDisplayObject = PopUpManager.createPopUp(mdiCanvas, LockSettings, true); + var lockSettings:LockSettings = LockSettings(popUp); + + var point1:Point = new Point(); + point1.x = width/2; + point1.y = height/2; + lockSettings.x = point1.x - (lockSettings.width/2); + lockSettings.y = point1.y - (lockSettings.height/2); + } + + ]]> @@ -426,24 +452,40 @@ with BigBlueButton; if not, see . - - - - - - - - - - - + + + + + + + + + diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/MainToolbar.mxml b/bigbluebutton-client/src/org/bigbluebutton/main/views/MainToolbar.mxml index 2f4daaf41e..62ab9d97c4 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/main/views/MainToolbar.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/main/views/MainToolbar.mxml @@ -23,7 +23,7 @@ with BigBlueButton; if not, see . + initialize="init()" creationComplete="onCreationComplete()" > @@ -91,7 +91,9 @@ with BigBlueButton; if not, see . private var xml:XML; private function init():void{ - AlertAccImpl.enableAccessibility(); + if (Capabilities.hasAccessibility) { + AlertAccImpl.enableAccessibility(); + } baseIndex = 101; numButtons = 0; @@ -102,6 +104,21 @@ with BigBlueButton; if not, see . timer.start(); } + + private function onCreationComplete():void { + if (this.width < 800) { + meetingNameLbl.visible = false; + langSelector.visible = false; + shortcutKeysBtn.visible = false; + helpBtn.visible = false; + muteMeBtn.visible = false; + meetingNameLbl.width = 0; + langSelector.width = 0; + shortcutKeysBtn.width = 0; + helpBtn.width = 0; + } + } + private function checkAccessiblity(e:TimerEvent):void { // remove the quick links if there's no screen reader active if (!Accessibility.active) { @@ -328,14 +345,15 @@ with BigBlueButton; if not, see . tabIndex="{baseIndex+4}" height="22" styleName="quickWindowLinkStyle" /> - - + + + + tabIndex="{baseIndex}" width="400" left="0"/> - - + - - - - - - - - - - + + + + + + + - - - - - - - + + + + + + + + + + . - - + - . + diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/MicWarning.mxml b/bigbluebutton-client/src/org/bigbluebutton/main/views/MicWarning.mxml new file mode 100644 index 0000000000..e94fbe390f --- /dev/null +++ b/bigbluebutton-client/src/org/bigbluebutton/main/views/MicWarning.mxml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/MuteMeButton.mxml b/bigbluebutton-client/src/org/bigbluebutton/main/views/MuteMeButton.mxml index 2b2d6581cb..4bb6e002ec 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/main/views/MuteMeButton.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/main/views/MuteMeButton.mxml @@ -25,6 +25,7 @@ $Id: $ xmlns:flc="flexlib.controls.*" xmlns:mate="http://mate.asfusion.com/" visible="false" + includeInLayout="false" creationComplete="onCreationComplete()" toolTip="{UserManager.getInstance().getConference().voiceMuted ? ResourceUtil.getInstance().getString('bbb.users.pushToTalk.toolTip') : ResourceUtil.getInstance().getString('bbb.users.pushToMute.toolTip')}" click="toggleMuteMeState()" width="140" maxWidth="180" @@ -36,6 +37,7 @@ $Id: $ + + + + + + + + + + + + diff --git a/bigbluebutton-client/src/org/bigbluebutton/main/views/assets/chrome_allow.png b/bigbluebutton-client/src/org/bigbluebutton/main/views/assets/chrome_allow.png new file mode 100644 index 0000000000..f5bccc25ae Binary files /dev/null and b/bigbluebutton-client/src/org/bigbluebutton/main/views/assets/chrome_allow.png differ 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 f37528d86b..9dd265d543 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/ChatBox.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/ChatBox.mxml @@ -62,40 +62,43 @@ with BigBlueButton; if not, see . + + . if(Capabilities.hasAccessibility) Accessibility.updateProperties(); + + lockSettingsChanged(null); } private function focusChatBox(e:ShortcutEvent):void{ @@ -325,7 +330,7 @@ with BigBlueButton; if not, see . var contextMenu:ContextMenu = new ContextMenu(); contextMenu.hideBuiltInItems(); - var copyAllButton:ContextMenuItem = new ContextMenuItem(COPY_ALL_BUTTON); + var copyAllButton:ContextMenuItem = new ContextMenuItem(ResourceUtil.getInstance().getString("bbb.chat.contextmenu.copyalltext")); copyAllButton.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, menuItemHandler); contextMenu.customItems.push(copyAllButton); @@ -333,7 +338,7 @@ with BigBlueButton; if not, see . } private function menuItemHandler(e:ContextMenuEvent):void{ - if (e.target.caption == COPY_ALL_BUTTON){ + if (e.target.caption == ResourceUtil.getInstance().getString("bbb.chat.contextmenu.copyalltext")){ System.setClipboard(chatMessages.getAllMessageAsString()); } } @@ -359,6 +364,8 @@ with BigBlueButton; if not, see . private function localeChanged(e:Event):void { var modifier:String = ExternalInterface.call("determineModifier"); loadKeyCombos(modifier); + + addContextMenuItems(); } private function loadKeyCombos(modifier:String):void { @@ -425,7 +432,8 @@ with BigBlueButton; if not, see . if (currentMessage < 0){ currentMessage = 0; latestMessage = 0; - chatMessagesList.accessibilityProperties.description = chatMessages.messages.getItemAt(currentMessage).toString(); + if (chatMessages.messages.length > 0) + chatMessagesList.accessibilityProperties.description = chatMessages.messages.getItemAt(currentMessage).toString(); } if (e.otherUserID == chatWithUserID){ chatMessagesList.accessibilityProperties.description += " "; @@ -586,6 +594,11 @@ with BigBlueButton; if not, see . } private function sendMessages():void { + if(!sendBtn.enabled) { + txtMsgArea.text = StringUtil.trim(txtMsgArea.text); + return; + } + // Trim the message. This will trim the '/n' char so we don't send a message when the // user just hits the enter key var msgToSend:String = StringUtil.trim(txtMsgArea.text); @@ -603,6 +616,18 @@ with BigBlueButton; if not, see . private function focusChatInput(e:ShortcutEvent):void{ txtMsgArea.setFocus(); } + + private function lockSettingsChanged(e:Event):void { + var userManager:UserManager = UserManager.getInstance(); + var conference:Conference = userManager.getConference(); + var me:BBBUser = conference.getMyUser(); + + if(publicChat) { + sendBtn.enabled = !me.disableMyPublicChat; + } else { + sendBtn.enabled = !me.disableMyPrivateChat; + } + } ]]> diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/ChatMessageRenderer.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/ChatMessageRenderer.mxml index d63de7bec5..63160e0b26 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/ChatMessageRenderer.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/ChatMessageRenderer.mxml @@ -98,15 +98,12 @@ with BigBlueButton; if not, see . ]]> - - + + - - - - - + visible="true" + color="gray" right="0" /> + + diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/ChatView.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/ChatView.mxml index 2967a8102a..550b182a56 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/ChatView.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/chat/views/ChatView.mxml @@ -95,9 +95,7 @@ with BigBlueButton; if not, see . private var baseIndex:int; private static const PUBLIC_TAB_NEW:String = ResourceUtil.getInstance().getString("bbb.accessibility.chat.chatView.publicTabNew"); private var publicWaiting:Boolean = false; - private var privateWaiting:ArrayCollection = new ArrayCollection(); - private var publicFocus:Boolean = false; - private var privateFocus:Boolean = false; + private var publicFocus:Boolean = false; private var noticeLabel:String; [Embed(source="../sounds/notice.mp3")] @@ -336,12 +334,9 @@ with BigBlueButton; if not, see . // Activates an audio alert for screen-reader users on private message reception private function privateNotification(event:PrivateChatMessageEvent):void{ if (! UsersUtil.isMe(event.message.fromUserID)) { - privateWaiting.addItem(event); if (Accessibility.active){ noticeSound.play(); } - chatTabs.getChildByName(event.message.fromUserID).addEventListener(FocusEvent.FOCUS_IN, privateChatFocus); - chatTabs.getChildByName(event.message.fromUserID).addEventListener(FocusEvent.FOCUS_OUT, privateChatUnfocus); } } @@ -349,62 +344,11 @@ with BigBlueButton; if not, see . publicFocus = true; publicWaiting = false; } - - public function privateChatFocus(event:FocusEvent):void{ - if (event.target.name == "chatMessagesList"){ - var removed:Boolean = false; - for (var messageCounter:int = 0; messageCounter < event.target.parent.exposeNumMessages(); messageCounter ++){ - removed = removePrivateSender(event.target.parent.exposeSenderID(messageCounter)); - if (removed) { - messageCounter = event.target.parent.exposeNumMessages() + 1; - } - } - - if (privateWaiting.length == 1){ - privateFocus = true; - } else { - privateFocus == false; - } - } - } - public function publicChatUnfocus(event:FocusEvent):void { publicFocus = false; } - - public function privateChatUnfocus(event:FocusEvent):void { - // If you unfocus from private chat into public or options, privateFocus will be false - // Even if you focus to a different private chat, you cannot focus all of them. - privateFocus = false; - } - - // Returns an array of userIDs. The userIDs refer to users who have sent this user private messages which have not been read. - public function getPrivateSenders():ArrayCollection { - var privateSenders:ArrayCollection = new ArrayCollection; - if (privateWaiting.length){ - for (var i:int = 0; i < privateWaiting.length; i++){ - privateSenders.addItem(privateWaiting.getItemAt(i).message.chatobj.userid); - } - } - return privateSenders; - } - - // This is slightly mis-named; it removes the notification of this sender sending a private message for notification purposes - private function removePrivateSender(senderID:String):Boolean{ - var success:Boolean = false; - if (privateWaiting.length){ - for (var i:int = 0; i < privateWaiting.length; i++){ - if (senderID == privateWaiting.getItemAt(i).message.chatobj.userid){ - privateWaiting.removeItemAt(i); - success = true; - i = privateWaiting.length; - } - } - } - return success; - } - + private function focusPreviousChatTab(e:ShortcutEvent):void{ if (chatTabs.selectedIndex > 0){ chatTabs.selectedIndex--; diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/deskshare/events/StartedViewingEvent.as b/bigbluebutton-client/src/org/bigbluebutton/modules/deskshare/events/StartedViewingEvent.as index 57feab0def..a18e4570de 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/deskshare/events/StartedViewingEvent.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/deskshare/events/StartedViewingEvent.as @@ -24,6 +24,8 @@ package org.bigbluebutton.modules.deskshare.events { public static const STARTED_VIEWING_EVENT:String = "STARTED VIEWING DESKSHARE EVENT"; + public var stream:String; + public function StartedViewingEvent(type: String, bubbles:Boolean=true, cancelable:Boolean=false) { super(type, bubbles, cancelable); diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/deskshare/managers/DeskshareManager.as b/bigbluebutton-client/src/org/bigbluebutton/modules/deskshare/managers/DeskshareManager.as index ba7a104bc0..89a843a858 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/deskshare/managers/DeskshareManager.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/deskshare/managers/DeskshareManager.as @@ -60,9 +60,9 @@ package org.bigbluebutton.modules.deskshare.managers service.sendStartViewingNotification(videoWidth, videoHeight); } - public function handleStartedViewingEvent():void { - LogUtil.debug("handleStartedViewingEvent"); - service.sendStartedViewingNotification(); + public function handleStartedViewingEvent(stream:String):void { + LogUtil.debug("handleStartedViewingEvent [" + stream + "]"); + service.sendStartedViewingNotification(stream); } public function handleMadePresenterEvent(e:MadePresenterEvent):void { diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/deskshare/managers/ViewerWindowManager.as b/bigbluebutton-client/src/org/bigbluebutton/modules/deskshare/managers/ViewerWindowManager.as index 2eeea22013..76b3d963ab 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/deskshare/managers/ViewerWindowManager.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/deskshare/managers/ViewerWindowManager.as @@ -43,9 +43,9 @@ package org.bigbluebutton.modules.deskshare.managers if (isViewing) viewWindow.stopViewing(); } - public function handleStartedViewingEvent():void{ + public function handleStartedViewingEvent(stream:String):void{ LogUtil.debug("ViewerWindowManager handleStartedViewingEvent"); - service.sendStartedViewingNotification(); + service.sendStartedViewingNotification(stream); } private function openWindow(window:IBbbModuleWindow):void{ diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/deskshare/maps/DeskshareEventMap.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/deskshare/maps/DeskshareEventMap.mxml index a79f858d60..b3d27ee4d7 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/deskshare/maps/DeskshareEventMap.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/deskshare/maps/DeskshareEventMap.mxml @@ -79,7 +79,7 @@ with BigBlueButton; if not, see . - + diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/deskshare/services/DeskshareService.as b/bigbluebutton-client/src/org/bigbluebutton/modules/deskshare/services/DeskshareService.as index 070f539461..cf6a3a4df3 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/deskshare/services/DeskshareService.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/deskshare/services/DeskshareService.as @@ -72,8 +72,8 @@ package org.bigbluebutton.modules.deskshare.services conn.sendStartViewingNotification(captureWidth, captureHeight); } - public function sendStartedViewingNotification():void{ - conn.sendStartedViewingNotification(); + public function sendStartedViewingNotification(stream:String):void{ + conn.sendStartedViewingNotification(stream); } } } \ No newline at end of file diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/deskshare/services/red5/Connection.as b/bigbluebutton-client/src/org/bigbluebutton/modules/deskshare/services/red5/Connection.as index dc9505728e..08df6b1b92 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/deskshare/services/red5/Connection.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/deskshare/services/red5/Connection.as @@ -302,9 +302,9 @@ package org.bigbluebutton.modules.deskshare.services.red5 } } - public function sendStartedViewingNotification():void{ + public function sendStartedViewingNotification(stream:String):void{ trace("Sending start viewing to server"); - nc.call("deskshare.startedToViewStream", null); + nc.call("deskshare.startedToViewStream", null, stream); } /** diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/deskshare/view/components/DesktopPublishWindow.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/deskshare/view/components/DesktopPublishWindow.mxml index 0bd40a1a91..4fbc607bd3 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/deskshare/view/components/DesktopPublishWindow.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/deskshare/view/components/DesktopPublishWindow.mxml @@ -27,10 +27,9 @@ with BigBlueButton; if not, see . xmlns:dspub="flexlib.mdi.containers.*" backgroundColor="#C0C0C0" initialize="init()" - creationComplete="onCreationComplete()" - + creationComplete="onCreationComplete()" verticalScrollPolicy="off" horizontalScrollPolicy="off" - width="320" height="240" + width="320" height="320" title="{ResourceUtil.getInstance().getString('bbb.desktopPublish.title')}" resizable="false"> @@ -47,29 +46,29 @@ with BigBlueButton; if not, see . . closeWindow(); } + private function onCheckYourJavaClicked():void { + var CHECK_JAVA_URL:String = BBB.initConfigManager().config.javaTest.url; + navigateToURL(new URLRequest(CHECK_JAVA_URL)); + } ]]> @@ -366,33 +369,46 @@ with BigBlueButton; if not, see . - - - - - - - - - + + + + + + + + + + + + + + + + + + + diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/deskshare/view/components/DesktopViewWindow.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/deskshare/view/components/DesktopViewWindow.mxml index 53dfcda703..9749db1932 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/deskshare/view/components/DesktopViewWindow.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/deskshare/view/components/DesktopViewWindow.mxml @@ -147,6 +147,7 @@ with BigBlueButton; if not, see . video = new Video(width, height); video.width = width; video.height = height; + video.smoothing = true; video.attachNetStream(ns); ns.play(stream); this.stream = stream; @@ -172,7 +173,9 @@ with BigBlueButton; if not, see . LogUtil.debug("NetStream.Publish.Start for broadcast stream " + stream); LogUtil.debug("Dispatching start viewing event"); var dispatcher: Dispatcher = new Dispatcher(); - dispatcher.dispatchEvent(new StartedViewingEvent(StartedViewingEvent.STARTED_VIEWING_EVENT)); + var viewEvent:StartedViewingEvent = new StartedViewingEvent(StartedViewingEvent.STARTED_VIEWING_EVENT); + viewEvent.stream = stream; + dispatcher.dispatchEvent(viewEvent); break; case "NetStream.Play.UnpublishNotify": LogUtil.debug("NetStream.Play.UnpublishNotify for broadcast stream " + stream); diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/deskshare/view/components/ToolbarButton.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/deskshare/view/components/ToolbarButton.mxml index 4fdbe20042..3de3f899d5 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/deskshare/view/components/ToolbarButton.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/deskshare/view/components/ToolbarButton.mxml @@ -22,7 +22,8 @@ with BigBlueButton; if not, see . . this.selected = false; this.setStyle("icon", icon_unlocked); } - - /* disabling this for new because it needs more work to work - private function loopToStart(e:FocusEvent):void { - if (e.target == this && !e.shiftKey) - _dispatcher.dispatchEvent(new BBBEvent(BBBEvent.JOIN_VOICE_FOCUS_HEAD)); - } - - private function loopToEnd(e:ShortcutEvent):void{ - this.setFocus(); - } - */ - ]]> diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/notes/views/NoteRenderer.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/notes/views/NoteRenderer.mxml index 2c73f9ff79..1ddc9d4dcc 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/notes/views/NoteRenderer.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/notes/views/NoteRenderer.mxml @@ -63,10 +63,9 @@ with BigBlueButton; if not, see . - + - - - + + diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/phone/managers/PhoneManager.as b/bigbluebutton-client/src/org/bigbluebutton/modules/phone/managers/PhoneManager.as index 87f29b9d4f..1cb7162eec 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/phone/managers/PhoneManager.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/phone/managers/PhoneManager.as @@ -101,10 +101,10 @@ package org.bigbluebutton.modules.phone.managers { || ((Microphone.names.length == 1) && (Microphone.names[0] == "Unknown Microphone"))); } - private function setupMic(useMic:Boolean):void { + private function setupMic(useMic:Boolean, microphoneIndex:int):void { withMic = useMic; if (withMic) - streamManager.initMicrophone(); + streamManager.initMicrophone(microphoneIndex); else streamManager.initWithNoMicrophone(); } @@ -112,10 +112,10 @@ package org.bigbluebutton.modules.phone.managers { private function setupConnection():void { streamManager.setConnection(connectionManager.getConnection()); } - - public function joinVoice(autoJoin:Boolean):void { + + public function joinVoice(autoJoin:Boolean, microphoneIndex:int = 0):void { userHangup = false; - setupMic(autoJoin); + setupMic(autoJoin, microphoneIndex); var uid:String = String(Math.floor(new Date().getTime())); var uname:String = encodeURIComponent(UsersUtil.getMyExternalUserID() + "-bbbID-" + attributes.username); connectionManager.connect(uid, attributes.internalUserID, uname , attributes.room, attributes.uri); diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/phone/managers/StreamManager.as b/bigbluebutton-client/src/org/bigbluebutton/modules/phone/managers/StreamManager.as index 8d68084fd8..d321c1666b 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/phone/managers/StreamManager.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/phone/managers/StreamManager.as @@ -18,18 +18,18 @@ */ package org.bigbluebutton.modules.phone.managers { - import com.asfusion.mate.events.Dispatcher; - import flash.events.ActivityEvent; - import flash.events.AsyncErrorEvent; - import flash.events.IEventDispatcher; - import flash.events.NetStatusEvent; - import flash.events.StatusEvent; - import flash.media.Microphone; - import flash.media.MicrophoneEnhancedMode; - import flash.media.MicrophoneEnhancedOptions; - import flash.media.SoundCodec; - import flash.net.NetConnection; - import flash.net.NetStream; + import com.asfusion.mate.events.Dispatcher; + import flash.events.ActivityEvent; + import flash.events.AsyncErrorEvent; + import flash.events.IEventDispatcher; + import flash.events.NetStatusEvent; + import flash.events.StatusEvent; + import flash.media.Microphone; + import flash.media.MicrophoneEnhancedMode; + import flash.media.MicrophoneEnhancedOptions; + import flash.media.SoundCodec; + import flash.net.NetConnection; + import flash.net.NetStream; import org.bigbluebutton.common.LogUtil; import org.bigbluebutton.core.BBB; import org.bigbluebutton.main.events.BBBEvent; @@ -42,11 +42,12 @@ package org.bigbluebutton.modules.phone.managers { private var incomingStream:NetStream = null private var outgoingStream:NetStream = null; private var publishName:String = null; - private var mic:Microphone = null; + private var mic:Microphone = null; + private var micIndex:int = 0; private var isCallConnected:Boolean = false; private var muted:Boolean = false; - private var audioCodec:String = "SPEEX"; - private var dispatcher:Dispatcher; + private var audioCodec:String = "SPEEX"; + private var dispatcher:Dispatcher; public function StreamManager() { dispatcher = new Dispatcher(); @@ -56,11 +57,13 @@ package org.bigbluebutton.modules.phone.managers { this.connection = connection; } - public function initMicrophone():void { - mic = Microphone.getMicrophone(-1); + public function initMicrophone(microphoneIndex:int):void { + mic = Microphone.getMicrophone(-1); + this.micIndex = microphoneIndex; if(mic == null){ initWithNoMicrophone(); } else { + LogUtil.debug("Setting up microphone"); setupMicrophone(); mic.addEventListener(StatusEvent.STATUS, micStatusHandler); } @@ -74,8 +77,8 @@ package org.bigbluebutton.modules.phone.managers { } if ((BBB.getFlashPlayerVersion() >= 10.3) && (phoneOptions.enabledEchoCancel)) { - LogUtil.debug("Using acoustic echo cancellation."); - mic = Microphone(Microphone["getEnhancedMicrophone"]()); + LogUtil.debug("Using acoustic echo cancellation."); + mic = Microphone.getEnhancedMicrophone(micIndex); var options:MicrophoneEnhancedOptions = new MicrophoneEnhancedOptions(); options.mode = MicrophoneEnhancedMode.FULL_DUPLEX; options.autoGain = false; @@ -100,7 +103,6 @@ package org.bigbluebutton.modules.phone.managers { mic.rate = 8; LogUtil.debug("Using Nellymoser codec."); } - mic.gain = 60; } public function initWithNoMicrophone(): void { @@ -237,4 +239,4 @@ package org.bigbluebutton.modules.phone.managers { LogUtil.debug("Recieve ON METADATA from SIP"); } } -} +} diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/phone/maps/PhoneEventMap.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/phone/maps/PhoneEventMap.mxml index cee498e5af..a917b1a7db 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/phone/maps/PhoneEventMap.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/phone/maps/PhoneEventMap.mxml @@ -65,7 +65,7 @@ with BigBlueButton; if not, see . - + diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/FileUploadWindow.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/FileUploadWindow.mxml index e618dd1d2a..3c0b900360 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/FileUploadWindow.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/FileUploadWindow.mxml @@ -271,27 +271,20 @@ with BigBlueButton; if not, see . - - - - + + - - - - + - - - - + @@ -299,28 +292,19 @@ with BigBlueButton; if not, see . styleName="presentationUploadProgressBarStyle" labelPlacement="center" width="460" visible="false"/> - - - - - - - - - + + - - - - + + - - + diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/PresentationWindow.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/PresentationWindow.mxml index a555d08153..9a60ae6785 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/PresentationWindow.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/PresentationWindow.mxml @@ -201,6 +201,11 @@ with BigBlueButton; if not, see . keyCombos[modifier+(ResourceUtil.getInstance().getString('bbb.shortcutkey.present.fitWidth') as String)] = ShortcutEvent.FIT_TO_WIDTH; keyCombos[modifier+(ResourceUtil.getInstance().getString('bbb.shortcutkey.present.fitPage') as String)] = ShortcutEvent.FIT_TO_PAGE; //keyCombos[modifier+(ResourceUtil.getInstance().getString('bbb.shortcutkey.whiteboard.undo') as String)] = ShortcutEvent.UNDO_WHITEBOARD; + + keyCombos[Keyboard.LEFT] = ShortcutEvent.PREVIOUS_SLIDE; + keyCombos[Keyboard.RIGHT] = ShortcutEvent.NEXT_SLIDE; + keyCombos[Keyboard.PAGE_UP] = ShortcutEvent.PREVIOUS_SLIDE; + keyCombos[Keyboard.PAGE_DOWN] = ShortcutEvent.NEXT_SLIDE; } // Handle presentation-scope hotkeys diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/SlideView.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/SlideView.mxml index a81602c55c..d9031a59bc 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/SlideView.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/present/ui/views/SlideView.mxml @@ -95,7 +95,7 @@ with BigBlueButton; if not, see . private var whiteboardCanvasHolder:Canvas = new Canvas(); private var whiteboardCanvas:IBbbCanvas; - [Bindable] public var slides:ArrayCollection; + [Bindable] public var slides:ArrayCollection = new ArrayCollection(); [Bindable] public var selectedSlide:int=0; [Bindable] private var lateComerSynched:Boolean = false; @@ -218,7 +218,7 @@ with BigBlueButton; if not, see . slideLoader.content.width = slideLoader.width; slideLoader.content.height = slideLoader.height; moveCanvas(slideLoader.x, slideLoader.y); - zoomCanvas(slideLoader.width, slideLoader.height); + zoomCanvas(slideLoader.width, slideLoader.height, zoomPercentage); } /** @@ -468,13 +468,13 @@ with BigBlueButton; if not, see . } } - public function zoomCanvas(width:Number, height:Number):void{ + public function zoomCanvas(width:Number, height:Number, zoom:Number):void{ whiteboardCanvasHolder.width = width; whiteboardCanvasHolder.height = height; moveCanvas(slideLoader.x, slideLoader.y); if (whiteboardCanvas != null) { //LogUtil.debug("Zooming Canvas " + width + " " + height); - whiteboardCanvas.zoomCanvas(width, height); + whiteboardCanvas.zoomCanvas(width, height, zoom); } } diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/users/business/ListenersSOService.as b/bigbluebutton-client/src/org/bigbluebutton/modules/users/business/ListenersSOService.as index e7ca441db4..80a3b1eaf8 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/users/business/ListenersSOService.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/users/business/ListenersSOService.as @@ -18,17 +18,22 @@ */ package org.bigbluebutton.modules.users.business { - import com.asfusion.mate.events.Dispatcher; + import com.asfusion.mate.events.Dispatcher; + import flash.events.AsyncErrorEvent; import flash.events.NetStatusEvent; import flash.net.NetConnection; import flash.net.Responder; - import flash.net.SharedObject; + import flash.net.SharedObject; + import org.bigbluebutton.common.LogUtil; import org.bigbluebutton.core.EventConstants; import org.bigbluebutton.core.UsersUtil; import org.bigbluebutton.core.events.CoreEvent; + import org.bigbluebutton.core.events.LockControlEvent; + import org.bigbluebutton.core.events.VoiceConfEvent; import org.bigbluebutton.core.managers.UserManager; + import org.bigbluebutton.core.vo.LockSettingsVO; import org.bigbluebutton.main.events.BBBEvent; import org.bigbluebutton.main.model.users.BBBUser; import org.bigbluebutton.main.model.users.Conference; @@ -89,9 +94,12 @@ package org.bigbluebutton.modules.users.business LogUtil.debug(LOGNAME + ":Voice is connected to Shared object"); notifyConnectionStatusListener(true); + // Query/set lock settings with server + getLockSettings(); // Query the server if there are already listeners in the conference. getCurrentUsers(); getRoomMuteState(); + getRoomLockState(); } private function leave():void { @@ -105,7 +113,7 @@ package org.bigbluebutton.modules.users.business _connectionListener = connectionListener; } - public function userJoin(userId:Number, cidName:String, cidNum:String, muted:Boolean, talking:Boolean, locked:Boolean):void { + public function userJoin(userId:Number, cidName:String, cidNum:String, muted:Boolean, talking:Boolean):void { trace("***************** Voice user joining [" + cidName + "]"); if (cidName) { @@ -117,7 +125,7 @@ package org.bigbluebutton.modules.users.business var internUserID:String = UsersUtil.externalUserIDToInternalUserID(externUserID); if (UsersUtil.getMyExternalUserID() == externUserID) { - _conference.setMyVoiceUserId(userId); + _conference.setMyVoiceUserId(userId); _conference.muteMyVoice(muted); _conference.setMyVoiceJoined(true); } @@ -130,7 +138,14 @@ package org.bigbluebutton.modules.users.business var bbbEvent:BBBEvent = new BBBEvent(BBBEvent.USER_VOICE_JOINED); bbbEvent.payload.userID = bu.userID; - globalDispatcher.dispatchEvent(bbbEvent); + globalDispatcher.dispatchEvent(bbbEvent); + + if(_conference.getLockSettings().getDisableMic() && !bu.voiceMuted && bu.userLocked && bu.me) { + var ev:VoiceConfEvent = new VoiceConfEvent(VoiceConfEvent.MUTE_USER); + ev.userid = userId; + ev.mute = true; + dispatcher.dispatchEvent(ev); + } } } else { // caller doesn't exist yet and must be a phone user var n:BBBUser = new BBBUser(); @@ -186,23 +201,6 @@ package org.bigbluebutton.modules.users.business } } - public function userLockedMute(userID:Number, locked:Boolean):void { - if (UserManager.getInstance().getConference().amIThisVoiceUser(userID)) { - UserManager.getInstance().getConference().voiceLocked = locked; - } - - var bu:BBBUser = UsersUtil.getVoiceUser(userID) - if (bu != null) { - bu.voiceLocked = locked; - LogUtil.debug("[" + bu.name + "] is now locked=[" + bu.voiceLocked + "] muted=[" + bu.voiceMuted + "]"); - - var bbbEvent:BBBEvent = new BBBEvent(BBBEvent.USER_VOICE_LOCKED); - bbbEvent.payload.locked = bu.voiceLocked; - bbbEvent.payload.userID = bu.userID; - globalDispatcher.dispatchEvent(bbbEvent); - } - } - public function userTalk(userID:Number, talk:Boolean):void { trace("User talking event"); var l:BBBUser = _conference.getVoiceUser(userID); @@ -232,7 +230,7 @@ package org.bigbluebutton.modules.users.business l.voiceMuted = false; l.voiceJoined = false; l.talking = false; - l.voiceLocked = false; + l.userLocked = false; var bbbEvent:BBBEvent = new BBBEvent(BBBEvent.USER_VOICE_LEFT); bbbEvent.payload.userID = l.userID; @@ -255,27 +253,27 @@ package org.bigbluebutton.modules.users.business } } - public function lockMuteUser(userid:Number, lock:Boolean):void { - var nc:NetConnection = _module.connection; - nc.call( - "voice.lockMuteUser",// Remote function name - new Responder( - // participants - On successful result - function(result:Object):void { - LogUtil.debug("Successfully lock mute/unmute: " + userid); - }, - // status - On error occurred - function(status:Object):void { - LogUtil.error("Error occurred:"); - for (var x:Object in status) { - LogUtil.error(x + " : " + status[x]); - } - } - ),//new Responder - userid, - lock - ); //_netConnection.call - } +// public function lockMuteUser(userid:Number, lock:Boolean):void { +// var nc:NetConnection = _module.connection; +// nc.call( +// "voice.lockMuteUser",// Remote function name +// new Responder( +// // participants - On successful result +// function(result:Object):void { +// LogUtil.debug("Successfully lock mute/unmute: " + userid); +// }, +// // status - On error occurred +// function(status:Object):void { +// LogUtil.error("Error occurred:"); +// for (var x:Object in status) { +// LogUtil.error(x + " : " + status[x]); +// } +// } +// ),//new Responder +// userid, +// lock +// ); //_netConnection.call +// } public function muteUnmuteUser(userid:Number, mute:Boolean):void { var nc:NetConnection = _module.connection; @@ -299,7 +297,8 @@ package org.bigbluebutton.modules.users.business ); //_netConnection.call } - public function muteAllUsers(mute:Boolean):void { + public function muteAllUsers(mute:Boolean, dontMuteThese:Array = null):void { + if(dontMuteThese == null) dontMuteThese = []; var nc:NetConnection = _module.connection; nc.call( "voice.muteAllUsers",// Remote function name @@ -316,14 +315,21 @@ package org.bigbluebutton.modules.users.business } } ),//new Responder - mute + mute, + dontMuteThese ); //_netConnection.call _listenersSO.send("muteStateCallback", mute); } public function muteStateCallback(mute:Boolean):void { var e:UsersEvent = new UsersEvent(UsersEvent.ROOM_MUTE_STATE); - e.mute_state = mute; + e.new_state = mute; + dispatcher.dispatchEvent(e); + } + + public function lockStateCallback(lock:Boolean):void { + var e:UsersEvent = new UsersEvent(UsersEvent.ROOM_LOCK_STATE); + e.new_state = lock; dispatcher.dispatchEvent(e); } @@ -360,7 +366,7 @@ package org.bigbluebutton.modules.users.business for(var p:Object in result.participants) { var u:Object = result.participants[p] - userJoin(u.participant, u.name, u.name, u.muted, u.talking, u.locked); + userJoin(u.participant, u.name, u.name, u.muted, u.talking); } } }, @@ -383,7 +389,7 @@ package org.bigbluebutton.modules.users.business // participants - On successful result function(result:Object):void { var e:UsersEvent = new UsersEvent(UsersEvent.ROOM_MUTE_STATE); - e.mute_state = result as Boolean; + e.new_state = result as Boolean; dispatcher.dispatchEvent(e); }, // status - On error occurred @@ -397,6 +403,26 @@ package org.bigbluebutton.modules.users.business ); //_netConnection.call } + public function getRoomLockState():void{ + var nc:NetConnection = _module.connection; + nc.call( + "lock.isRoomLocked",// Remote function name + new Responder( + function(result:Object):void { + var e:UsersEvent = new UsersEvent(UsersEvent.ROOM_LOCK_STATE); + e.new_state = result as Boolean; + dispatcher.dispatchEvent(e); + }, + function(status:Object):void { + LogUtil.error("Error occurred:"); + for (var x:Object in status) { + LogUtil.error(x + " : " + status[x]); + } + } + )//new Responder + ); //_netConnection.call + } + private function notifyConnectionStatusListener(connected:Boolean, errors:Array=null):void { if (_connectionListener != null) { LogUtil.debug(LOGNAME + 'notifying connectionListener for Voice'); @@ -458,5 +484,94 @@ package org.bigbluebutton.modules.users.business } _soErrors.push(error); } + + + /** + * Set lock state of all users in the room, except the users listed in second parameter + * */ + public function setAllUsersLock(lock:Boolean, except:Array = null):void { + if(except == null) except = []; + var nc:NetConnection = _module.connection; + nc.call( + "lock.setAllUsersLock",// Remote function name + new Responder( + function(result:Object):void { + LogUtil.debug("Successfully locked all users except " + except.join(",")); + }, + function(status:Object):void { + LogUtil.error("Error occurred:"); + for (var x:Object in status) { + LogUtil.error(x + " : " + status[x]); + } + } + )//new Responder + , lock, except + ); //_netConnection.call + + _listenersSO.send("lockStateCallback", lock); + } + + /** + * Set lock state of all users in the room, except the users listed in second parameter + * */ + public function setUserLock(internalUserID:String, lock:Boolean):void { + var nc:NetConnection = _module.connection; + nc.call( + "lock.setUserLock",// Remote function name + new Responder( + function(result:Object):void { + LogUtil.debug("Successfully locked user " + internalUserID); + }, + function(status:Object):void { + LogUtil.error("Error occurred:"); + for (var x:Object in status) { + LogUtil.error(x + " : " + status[x]); + } + } + )//new Responder + , lock, internalUserID + ); //_netConnection.call + } + + + public function getLockSettings():void{ + var nc:NetConnection = _module.connection; + nc.call( + "lock.getLockSettings",// Remote function name + new Responder( + function(result:Object):void { + _conference.setLockSettings(new LockSettingsVO(result.allowModeratorLocking, result.disableCam, result.disableMic, result.disablePrivateChat, result.disablePublicChat)); + }, + function(status:Object):void { + LogUtil.error("Error occurred:"); + for (var x:Object in status) { + LogUtil.error(x + " : " + status[x]); + } + } + )//new Responder + ); //_netConnection.call + } + + public function saveLockSettings(newLockSettings:Object):void{ + var nc:NetConnection = _module.connection; + nc.call( + "lock.setLockSettings",// Remote function name + new Responder( + function(result:Object):void { + + }, + function(status:Object):void { + LogUtil.error("Error occurred:"); + for (var x:Object in status) { + LogUtil.error(x + " : " + status[x]); + } + } + )//new Responder + , + newLockSettings + ); //_netConnection.call + } + + } } \ No newline at end of file diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/users/business/UsersProxy.as b/bigbluebutton-client/src/org/bigbluebutton/modules/users/business/UsersProxy.as index a788efc6a2..121c5c60c6 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/users/business/UsersProxy.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/users/business/UsersProxy.as @@ -24,13 +24,14 @@ package org.bigbluebutton.modules.users.business import org.bigbluebutton.common.Role; import org.bigbluebutton.core.UsersUtil; + import org.bigbluebutton.core.events.LockControlEvent; + import org.bigbluebutton.core.events.VoiceConfEvent; import org.bigbluebutton.core.managers.UserManager; import org.bigbluebutton.main.model.users.BBBUser; import org.bigbluebutton.main.model.users.events.KickUserEvent; - import org.bigbluebutton.modules.users.events.UsersEvent; import org.bigbluebutton.modules.users.events.StartUsersModuleEvent; import org.bigbluebutton.modules.users.events.StopUsersModuleEvent; - import org.bigbluebutton.core.events.VoiceConfEvent; + import org.bigbluebutton.modules.users.events.UsersEvent; public class UsersProxy { @@ -92,33 +93,53 @@ package org.bigbluebutton.modules.users.business public function muteAlmostAllUsers(command:VoiceConfEvent):void { - //find the presenter and lock them + var dontMuteThese:Array = []; + var pres:BBBUser = UserManager.getInstance().getConference().getPresenter(); - if (pres && pres.voiceLocked) pres = null; - - if (pres) - _listenersService.lockMuteUser(int(pres.voiceUserid), true); - - _listenersService.muteAllUsers(true); - - //unlock the presenter - if (pres) - _listenersService.lockMuteUser(int(pres.voiceUserid), false); + if (pres != null) dontMuteThese.push(pres.voiceUserid); + + _listenersService.muteAllUsers(true, dontMuteThese); } - public function lockMuteUser(command:VoiceConfEvent):void - { - _listenersService.lockMuteUser(command.userid, command.lock); + public function kickUser(event:KickUserEvent):void { + var user:BBBUser = UsersUtil.getUser(event.userid); + _listenersService.ejectUser(user.voiceUserid); } - - public function kickUser(event:KickUserEvent):void { - var user:BBBUser = UsersUtil.getUser(event.userid); - _listenersService.ejectUser(user.voiceUserid); - } - + public function ejectUser(command:VoiceConfEvent):void { _listenersService.ejectUser(command.userid); } + + //Lock events + public function lockAllUsers(command:LockControlEvent):void + { + _listenersService.setAllUsersLock(true); + } + + public function unlockAllUsers(command:LockControlEvent):void + { + _listenersService.setAllUsersLock(false); + } + + public function lockAlmostAllUsers(command:LockControlEvent):void + { + var pres:BBBUser = UserManager.getInstance().getConference().getPresenter(); + _listenersService.setAllUsersLock(true, [pres.userID]); + } + + public function lockUser(command:LockControlEvent):void + { + _listenersService.setUserLock(command.internalUserID, true); + } + + public function unlockUser(command:LockControlEvent):void + { + _listenersService.setUserLock(command.internalUserID, false); + } + + public function saveLockSettings(command:LockControlEvent):void { + _listenersService.saveLockSettings(command.payload); + } } } \ No newline at end of file diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/users/events/UsersEvent.as b/bigbluebutton-client/src/org/bigbluebutton/modules/users/events/UsersEvent.as index c5ccb6c219..0d542d0545 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/users/events/UsersEvent.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/users/events/UsersEvent.as @@ -23,8 +23,9 @@ package org.bigbluebutton.modules.users.events public class UsersEvent extends Event { public static const ROOM_MUTE_STATE:String = "USERS_ROOM_MUTE_STATE"; + public static const ROOM_LOCK_STATE:String = "USERS_ROOM_LOCK_STATE"; - public var mute_state:Boolean; + public var new_state:Boolean; public function UsersEvent(type:String) { diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/users/maps/UsersEventMap.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/users/maps/UsersEventMap.mxml index 765add61b1..325ded32d6 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/users/maps/UsersEventMap.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/users/maps/UsersEventMap.mxml @@ -24,9 +24,14 @@ with BigBlueButton; if not, see . . - - + + + + + + + + + + + + + + + + + + + + + + diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/MediaItemRenderer.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/MediaItemRenderer.mxml index 82ed6d0a18..2fd698fad7 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/MediaItemRenderer.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/MediaItemRenderer.mxml @@ -41,10 +41,12 @@ import org.bigbluebutton.common.Images; import org.bigbluebutton.common.LogUtil; import org.bigbluebutton.common.Role; + import org.bigbluebutton.core.events.LockControlEvent; import org.bigbluebutton.core.events.VoiceConfEvent; import org.bigbluebutton.core.managers.UserManager; import org.bigbluebutton.main.events.BBBEvent; import org.bigbluebutton.main.events.StoppedViewingWebcamEvent; + import org.bigbluebutton.main.model.users.BBBUser; import org.bigbluebutton.main.model.users.Conference; import org.bigbluebutton.main.model.users.events.KickUserEvent; import org.bigbluebutton.main.model.users.events.LowerHandEvent; @@ -75,7 +77,7 @@ BindingUtils.bindSetter(updateButtons, voiceJoinedInd, "visible"); BindingUtils.bindSetter(updateButtons, muteInd, "visible"); - BindingUtils.bindSetter(updateButtons, voiceLockedInd, "visible"); + BindingUtils.bindSetter(updateButtons, userLockedInd, "visible"); BindingUtils.bindSetter(updateButtons, hasStreamInd, "visible"); BindingUtils.bindSetter(updateButtons, viewingStreamInd, "visible"); @@ -139,9 +141,15 @@ } public function toggleLockState():void { - var e:VoiceConfEvent = new VoiceConfEvent(VoiceConfEvent.LOCK_MUTE_USER); - e.userid = data.voiceUserid; - e.lock = !data.voiceLocked; + var e:LockControlEvent; + + if(data.userLocked) { + e = new LockControlEvent(LockControlEvent.UNLOCK_USER); + } else { + e = new LockControlEvent(LockControlEvent.LOCK_USER); + } + + e.internalUserID = data.userID; dispatchEvent(e); } @@ -156,28 +164,42 @@ muteBtn.visible = false; muteBtn.includeInLayout = true; } else { - muteImg.visible = !rolledOver; - muteImg.includeInLayout = !rolledOver; - muteBtn.visible = rolledOver; - muteBtn.includeInLayout = rolledOver; - - if(data.talking && !rolledOver){ - muteImg.filters = [new GlowFilter(0x898989)]; - }else{ - muteImg.filters = []; + if(data.userLocked && UserManager.getInstance().getConference().getLockSettings().getDisableMic()) { + muteImg.visible = true; + muteImg.includeInLayout = true; + muteBtn.visible = false; + muteBtn.includeInLayout = false; + } else { + muteImg.visible = !rolledOver; + muteImg.includeInLayout = !rolledOver; + muteBtn.visible = rolledOver; + muteBtn.includeInLayout = rolledOver; + + if(data.talking && !rolledOver){ + muteImg.filters = [new GlowFilter(0x898989)]; + }else{ + muteImg.filters = []; + } } } - if (!data.voiceJoined) { - lockImg.visible = false; - lockImg.includeInLayout = false; - lockBtn.visible = false; - lockBtn.includeInLayout = true; - } else { + //If it's not a moderator, it always can be locked. + //If it's a moderator and moderator locking is eanbled, it can be locked + //If it's a moderator and moderator locking is disabeld, it can be unlocked + if( data.role != BBBUser.MODERATOR + || (data.role == BBBUser.MODERATOR && UserManager.getInstance().getConference().getLockSettings().getAllowModeratorLocking()) + || (data.role == BBBUser.MODERATOR && !UserManager.getInstance().getConference().getLockSettings().getAllowModeratorLocking() && data.userLocked == true) + ){ lockImg.visible = !rolledOver; lockImg.includeInLayout = !rolledOver; lockBtn.visible = rolledOver; lockBtn.includeInLayout = rolledOver; + } else { + //If it can't be clicked, only show image + lockImg.visible = true; + lockImg.includeInLayout = true; + lockBtn.visible = false; + lockBtn.includeInLayout = false; } if (data.hasStream) { @@ -205,7 +227,7 @@ else muteImg.source = images.audio_20; - if (data.voiceLocked) + if (data.userLocked) lockImg.source = images.locked_20; //else if (moderator) // lockImg.source = images.unlocked_20; @@ -217,7 +239,7 @@ else muteBtn.setStyle("icon", images.audio_muted); - if (data.voiceLocked == rolledOverLock) + if (data.userLocked == rolledOverLock) lockBtn.setStyle("icon", images.unlocked); else lockBtn.setStyle("icon", images.locked); @@ -251,11 +273,11 @@ width="20" height="20" click="toggleLockState()" mouseOver="lockMouseOverHandler()" mouseOut="lockMouseOutHandler()" - toolTip="{data.voiceLocked ? ResourceUtil.getInstance().getString('bbb.users.usersGrid.mediaItemRenderer.pushToUnlock',[data.name]) : ResourceUtil.getInstance().getString('bbb.users.usersGrid.mediaItemRenderer.pushToLock',[data.name])}" /> + toolTip="{data.userLocked ? ResourceUtil.getInstance().getString('bbb.users.usersGrid.mediaItemRenderer.pushToUnlock',[data.name]) : ResourceUtil.getInstance().getString('bbb.users.usersGrid.mediaItemRenderer.pushToLock',[data.name])}" /> - + diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/UsersWindow.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/UsersWindow.mxml index 41129ef15a..ed69343e0f 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/UsersWindow.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/users/views/UsersWindow.mxml @@ -33,41 +33,41 @@ + - - + + + + diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/maps/VideoEventMapDelegate.as b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/maps/VideoEventMapDelegate.as index 34ad7353ff..86f31b47a2 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/maps/VideoEventMapDelegate.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/maps/VideoEventMapDelegate.as @@ -431,8 +431,6 @@ package org.bigbluebutton.modules.videoconf.maps public function switchToPresenter(event:MadePresenterEvent):void{ trace("VideoEventMapDelegate:: [" + me + "] Got Switch to presenter event. ready = [" + _ready + "]"); - -// if (!_ready) return; if (options.showButton) { displayToolbarButton(); @@ -441,13 +439,11 @@ package org.bigbluebutton.modules.videoconf.maps public function switchToViewer(event:MadePresenterEvent):void{ trace("VideoEventMapDelegate:: [" + me + "] Got Switch to viewer event. ready = [" + _ready + "]"); - -// if (!_ready) return; - + if (options.showButton){ LogUtil.debug("****************** Switching to viewer. Show video button?=[" + UsersUtil.amIPresenter() + "]"); displayToolbarButton(); - if (_isPublishing) { + if (_isPublishing && options.presenterShareOnly) { stopBroadcasting(); } } diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/ControlButtons.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/ControlButtons.mxml index 39278a39d6..bba8b51253 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/ControlButtons.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/ControlButtons.mxml @@ -21,25 +21,28 @@ with BigBlueButton; if not, see . - + . [Bindable] private var showButton:Boolean; + private function lockSettingsChanged(e:*):void { + showControlButtons(); + } + private function onCreationComplete():void { showControlButtons(); showPrivateChatButton(); @@ -70,19 +77,25 @@ with BigBlueButton; if not, see . showControlButtons(); } - private function onKickUserClicked():void { + private function onKickUserClicked(event:Event):void { + event.stopImmediatePropagation(); + var gd:Dispatcher = new Dispatcher(); gd.dispatchEvent(new KickUserEvent(sharerUserID)); } - private function onPrivateChatClicked():void { + private function onPrivateChatClicked(event:Event):void { + event.stopImmediatePropagation(); + var e:CoreEvent = new CoreEvent(EventConstants.START_PRIVATE_CHAT); e.message.chatWith = sharerUserID; var gd:Dispatcher = new Dispatcher(); gd.dispatchEvent(e); } - private function onSwitchPresenterClicked():void { + private function onSwitchPresenterClicked(event:Event):void { + event.stopImmediatePropagation(); + var e:RoleChangeEvent = new RoleChangeEvent(RoleChangeEvent.ASSIGN_PRESENTER); e.userid = sharerUserID; e.username = UsersUtil.getUserName(sharerUserID); @@ -90,7 +103,9 @@ with BigBlueButton; if not, see . gd.dispatchEvent(e); } - private function onMuteUnmuteClicked():void { + private function onMuteUnmuteClicked(event:Event):void { + event.stopImmediatePropagation(); + var bu:BBBUser = UsersUtil.getUser(sharerUserID); if (bu != null) { var e:VoiceConfEvent = new VoiceConfEvent(VoiceConfEvent.MUTE_USER); @@ -164,27 +179,40 @@ with BigBlueButton; if not, see . switchPresenter.visible = false; } } - - private function displayMuteButton(controlsForPresenter:Boolean):void { - /** - * Display button if user is joined to voice and: - * 1. if I am moderator OR - * 2. if display controls for presenter and I am presenter OR - * 3. if this window is me - */ - if (muteUnmuteBtn != null) { - if (UsersUtil.isUserJoinedToVoice(sharerUserID)) { - if (UsersUtil.amIModerator() || (controlsForPresenter && UsersUtil.amIPresenter()) || UsersUtil.isMe(sharerUserID)) { - muteUnmuteBtn.visible = true; - muteUnmuteBtn.toolTip = ResourceUtil.getInstance().getString('bbb.video.controls.muteButton.toolTip', [UsersUtil.getUserName(sharerUserID)]); - return; - } - } - muteUnmuteBtn.visible = false; - } - } - - private function showPrivateChatButton():void { + + private function displayMuteButton(controlsForPresenter:Boolean):void { + /** + * Display button if user is joined to voice and: + * 1. I am moderator or presenter and display controls for presenter and user is not locked with mic disabled due to lock + * 2. if this window is me and my mic is not disabled due to lock + * */ + if (muteUnmuteBtn != null) { + if (UsersUtil.isUserJoinedToVoice(sharerUserID)) { + var isMe:Boolean = UsersUtil.isMe(sharerUserID); + var userManager:UserManager = UserManager.getInstance(); + var conference:Conference = userManager.getConference(); + var me:BBBUser = conference.getMyUser(); + + var allowMuteUnmuteButton:Boolean = true; + if(isMe && me.disableMyMic) { + allowMuteUnmuteButton = false; + } else if (UsersUtil.amIModerator() || (controlsForPresenter && UsersUtil.amIPresenter()) ) { + var thisUser:BBBUser = UsersUtil.getUser(sharerUserID); + if(thisUser.userLocked && conference.getLockSettings().getDisableMic()) { + allowMuteUnmuteButton = false; + } + } + if ( allowMuteUnmuteButton ) { + muteUnmuteBtn.visible = true; + muteUnmuteBtn.toolTip = ResourceUtil.getInstance().getString('bbb.video.controls.muteButton.toolTip', [UsersUtil.getUserName(sharerUserID)]); + return; + } + } + muteUnmuteBtn.visible = false; + } + } + + private function showPrivateChatButton():void { var chatOptions:ChatOptions = new ChatOptions(); // the first check is to see if the chat module is in the config.xml if (BBB.getConfigForModule("ChatModule") && chatOptions.privateEnabled && ! UsersUtil.isMe(sharerUserID)) { @@ -197,15 +225,15 @@ with BigBlueButton; if not, see . } ]]> - - - - diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/ToolbarButton.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/ToolbarButton.mxml index 40688b4bed..20abcd3709 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/ToolbarButton.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/videoconf/views/ToolbarButton.mxml @@ -33,14 +33,19 @@ with BigBlueButton; if not, see . + . private var dispatcher:Dispatcher; + public function lockSettingsChanged(e:*):void{ + var userManager:UserManager = UserManager.getInstance(); + var conference:Conference = userManager.getConference(); + var me:BBBUser = conference.getMyUser(); + + this.visible = !me.disableMyCam; + this.includeInLayout = !me.disableMyCam; + } + private function init():void{ dispatcher = new Dispatcher(); this.toolTip = ResourceUtil.getInstance().getString('bbb.toolbar.video.toolTip.start'); @@ -68,6 +82,7 @@ with BigBlueButton; if not, see . this.enabled = true; this.selected = false; _currentState = OFF_STATE; + lockSettingsChanged(null); } public function set isPresenter(presenter:Boolean):void { diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/WhiteboardCanvasDisplayModel.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/WhiteboardCanvasDisplayModel.as index 2bce094c1e..8c602fe95f 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/WhiteboardCanvasDisplayModel.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/WhiteboardCanvasDisplayModel.as @@ -78,6 +78,8 @@ package org.bigbluebutton.modules.whiteboard private var width:Number; private var height:Number; + private var zoomPercentage:Number = 1; + public function doMouseDown(mouseX:Number, mouseY:Number):void { /** * Check if the presenter is starting a new text annotation without committing the last one. @@ -97,25 +99,27 @@ package org.bigbluebutton.modules.whiteboard case DrawObject.DRAW_START: dobj = shapeFactory.makeDrawObject(o, whiteboardModel); if (dobj != null) { - dobj.draw(o, shapeFactory.parentWidth, shapeFactory.parentHeight); + dobj.draw(o, shapeFactory.parentWidth, shapeFactory.parentHeight, zoomPercentage); wbCanvas.addGraphic(dobj); _annotationsList.push(dobj); } break; case DrawObject.DRAW_UPDATE: case DrawObject.DRAW_END: - var gobj:DrawObject = _annotationsList.pop(); - if (gobj.id == o.id) { -// LogUtil.debug("Removing shape [" + gobj.id + "]"); - wbCanvas.removeGraphic(gobj as DisplayObject); - } else { // no DRAW_START event was thrown for o so place gobj back on the top - LogUtil.debug("Not removing shape [" + gobj.id + "] new [" + o.id + "]"); - _annotationsList.push(gobj); + if (_annotationsList.length > 0) { + var gobj:DrawObject = _annotationsList.pop(); + if (gobj.id == o.id) { + // LogUtil.debug("Removing shape [" + gobj.id + "]"); + wbCanvas.removeGraphic(gobj as DisplayObject); + } else { // no DRAW_START event was thrown for o so place gobj back on the top + LogUtil.debug("Not removing shape [" + gobj.id + "] new [" + o.id + "]"); + _annotationsList.push(gobj); + } } - + dobj = shapeFactory.makeDrawObject(o, whiteboardModel); if (dobj != null) { - dobj.draw(o, shapeFactory.parentWidth, shapeFactory.parentHeight); + dobj.draw(o, shapeFactory.parentWidth, shapeFactory.parentHeight, zoomPercentage); wbCanvas.addGraphic(dobj); _annotationsList.push(dobj); } @@ -305,7 +309,7 @@ package org.bigbluebutton.modules.whiteboard if(an.type != DrawObject.TEXT) { var dobj:DrawObject = shapeFactory.makeDrawObject(an, whiteboardModel); if (dobj != null) { - dobj.draw(an, shapeFactory.parentWidth, shapeFactory.parentHeight); + dobj.draw(an, shapeFactory.parentWidth, shapeFactory.parentHeight, zoomPercentage); wbCanvas.addGraphic(dobj); _annotationsList.push(dobj); } @@ -365,7 +369,7 @@ package org.bigbluebutton.modules.whiteboard if(an.type != DrawObject.TEXT) { var dobj:DrawObject = shapeFactory.makeDrawObject(an, whiteboardModel); if (dobj != null) { - dobj.draw(an, shapeFactory.parentWidth, shapeFactory.parentHeight); + dobj.draw(an, shapeFactory.parentWidth, shapeFactory.parentHeight, zoomPercentage); wbCanvas.addGraphic(dobj); _annotationsList.push(dobj); } @@ -380,7 +384,8 @@ package org.bigbluebutton.modules.whiteboard } } - public function zoomCanvas(width:Number, height:Number):void{ + public function zoomCanvas(width:Number, height:Number, zoom:Number):void{ + zoomPercentage = zoom / 100; shapeFactory.setParentDim(width, height); this.width = width; this.height = height; @@ -420,7 +425,7 @@ package org.bigbluebutton.modules.whiteboard if (o != null) { var dobj:DrawObject = shapeFactory.makeDrawObject(o, whiteboardModel); if (dobj != null) { - dobj.draw(o, shapeFactory.parentWidth, shapeFactory.parentHeight); + dobj.draw(o, shapeFactory.parentWidth, shapeFactory.parentHeight, zoomPercentage); wbCanvas.addGraphic(dobj); _annotationsList[objIndex] = dobj; } diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/DrawObject.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/DrawObject.as index acba412c76..216b0c3dc2 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/DrawObject.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/DrawObject.as @@ -98,11 +98,11 @@ package org.bigbluebutton.modules.whiteboard.business.shapes public function makeGraphic(parentWidth:Number, parentHeight:Number):void {} - public function draw(a:Annotation, parentWidth:Number, parentHeight:Number):void { + public function draw(a:Annotation, parentWidth:Number, parentHeight:Number, zoom:Number):void { } - public function redraw(a:Annotation, parentWidth:Number, parentHeight:Number):void { + public function redraw(a:Annotation, parentWidth:Number, parentHeight:Number, zoom:Number):void { } } diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/Ellipse.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/Ellipse.as index 3bf2586d74..3473963c1e 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/Ellipse.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/Ellipse.as @@ -35,14 +35,14 @@ package org.bigbluebutton.modules.whiteboard.business.shapes super(id, type, status); } - override public function draw(a:Annotation, parentWidth:Number, parentHeight:Number):void { + override public function draw(a:Annotation, parentWidth:Number, parentHeight:Number, zoom:Number):void { // LogUtil.debug("Drawing ELLIPSE"); var ao:Object = a.annotation; if(!ao.fill) - this.graphics.lineStyle(ao.thickness, ao.color, ao.transparency ? 0.6 : 1.0); - else this.graphics.lineStyle(ao.thickness, ao.color); + this.graphics.lineStyle(ao.thickness * zoom, ao.color, ao.transparency ? 0.6 : 1.0); + else this.graphics.lineStyle(ao.thickness * zoom, ao.color); var arrayEnd:Number = (ao.points as Array).length; var startX:Number = denormalize((ao.points as Array)[0], parentWidth); @@ -59,8 +59,8 @@ package org.bigbluebutton.modules.whiteboard.business.shapes } - override public function redraw(a:Annotation, parentWidth:Number, parentHeight:Number):void { - draw(a, parentWidth, parentHeight); + override public function redraw(a:Annotation, parentWidth:Number, parentHeight:Number, zoom:Number):void { + draw(a, parentWidth, parentHeight, zoom); } } } \ No newline at end of file diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/Line.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/Line.as index 1982b04c0a..5d223be245 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/Line.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/Line.as @@ -30,11 +30,11 @@ package org.bigbluebutton.modules.whiteboard.business.shapes super(id, type, status); } - override public function draw(a:Annotation, parentWidth:Number, parentHeight:Number):void { + override public function draw(a:Annotation, parentWidth:Number, parentHeight:Number, zoom:Number):void { // LogUtil.debug("Drawing LINE"); var ao:Object = a.annotation; - this.graphics.lineStyle(ao.thickness, ao.color); + this.graphics.lineStyle(ao.thickness * zoom, ao.color); var arrayEnd:Number = (ao.points as Array).length; var startX:Number = denormalize((ao.points as Array)[0], parentWidth); var startY:Number = denormalize((ao.points as Array)[1], parentHeight); @@ -46,8 +46,8 @@ package org.bigbluebutton.modules.whiteboard.business.shapes this.graphics.lineTo(endX-startX, endY-startY); } - override public function redraw(a:Annotation, parentWidth:Number, parentHeight:Number):void { - draw(a, parentWidth, parentHeight); + override public function redraw(a:Annotation, parentWidth:Number, parentHeight:Number, zoom:Number):void { + draw(a, parentWidth, parentHeight, zoom); } } diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/Pencil.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/Pencil.as index 32589f5c68..fa8fe30875 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/Pencil.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/Pencil.as @@ -34,10 +34,10 @@ package org.bigbluebutton.modules.whiteboard.business.shapes super(id, type, status); } - override public function draw(a:Annotation, parentWidth:Number, parentHeight:Number):void { + override public function draw(a:Annotation, parentWidth:Number, parentHeight:Number, zoom:Number):void { var ao:Object = a.annotation; - this.graphics.lineStyle(ao.thickness, ao.color); + this.graphics.lineStyle(ao.thickness * zoom, ao.color); var graphicsCommands:Vector. = new Vector.(); graphicsCommands.push(1); @@ -53,8 +53,8 @@ package org.bigbluebutton.modules.whiteboard.business.shapes this.alpha = 1; } - override public function redraw(a:Annotation, parentWidth:Number, parentHeight:Number):void { - draw(a, parentWidth, parentHeight); + override public function redraw(a:Annotation, parentWidth:Number, parentHeight:Number, zoom:Number):void { + draw(a, parentWidth, parentHeight, zoom); } } diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/Rectangle.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/Rectangle.as index 7ab9915dee..9c0797965b 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/Rectangle.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/Rectangle.as @@ -56,12 +56,12 @@ package org.bigbluebutton.modules.whiteboard.business.shapes } - override public function draw(a:Annotation, parentWidth:Number, parentHeight:Number):void { + override public function draw(a:Annotation, parentWidth:Number, parentHeight:Number, zoom:Number):void { // LogUtil.debug("Drawing RECTANGLE"); var ao:Object = a.annotation; if (!ao.fill) - this.graphics.lineStyle(ao.thickness, ao.color, ao.transparency ? 0.6 : 1.0); - else this.graphics.lineStyle(ao.thickness, ao.color); + this.graphics.lineStyle(ao.thickness * zoom, ao.color, ao.transparency ? 0.6 : 1.0); + else this.graphics.lineStyle(ao.thickness * zoom, ao.color); var arrayEnd:Number = (ao.points as Array).length; var startX:Number = denormalize((ao.points as Array)[0], parentWidth); @@ -79,8 +79,8 @@ package org.bigbluebutton.modules.whiteboard.business.shapes } - override public function redraw(a:Annotation, parentWidth:Number, parentHeight:Number):void { - draw(a, parentWidth, parentHeight); + override public function redraw(a:Annotation, parentWidth:Number, parentHeight:Number, zoom:Number):void { + draw(a, parentWidth, parentHeight, zoom); } } } \ No newline at end of file diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/TextDrawObject.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/TextDrawObject.as index e9e2056334..4dc7adcb69 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/TextDrawObject.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/TextDrawObject.as @@ -81,7 +81,7 @@ package org.bigbluebutton.modules.whiteboard.business.shapes return _textField; } - override public function draw(a:Annotation, parentWidth:Number, parentHeight:Number):void { + override public function draw(a:Annotation, parentWidth:Number, parentHeight:Number, zoom:Number):void { LogUtil.debug("Drawing TEXT"); this.x = denormalize(a.annotation.x, parentWidth); diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/Triangle.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/Triangle.as index f18f5a7f6c..9f4161de37 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/Triangle.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/business/shapes/Triangle.as @@ -31,13 +31,13 @@ package org.bigbluebutton.modules.whiteboard.business.shapes super(id, type, status); } - override public function draw(a:Annotation, parentWidth:Number, parentHeight:Number):void { + override public function draw(a:Annotation, parentWidth:Number, parentHeight:Number, zoom:Number):void { // LogUtil.debug("Drawing TRIANGLE"); var ao:Object = a.annotation; if (!ao.fill) - this.graphics.lineStyle(ao.thickness, ao.color, ao.transparency ? 0.6 : 1.0); - else this.graphics.lineStyle(ao.thickness, ao.color); + this.graphics.lineStyle(ao.thickness * zoom, ao.color, ao.transparency ? 0.6 : 1.0); + else this.graphics.lineStyle(ao.thickness * zoom, ao.color); var arrayEnd:Number = (ao.points as Array).length; var startX:Number = denormalize((ao.points as Array)[0], parentWidth); @@ -55,8 +55,8 @@ package org.bigbluebutton.modules.whiteboard.business.shapes this.graphics.lineTo(startX+triangleWidth/2, startY); } - override public function redraw(a:Annotation, parentWidth:Number, parentHeight:Number):void { - draw(a, parentWidth, parentHeight); + override public function redraw(a:Annotation, parentWidth:Number, parentHeight:Number, zoom:Number):void { + draw(a, parentWidth, parentHeight, zoom); } } } \ No newline at end of file diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/maps/WhiteboardEventMap.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/maps/WhiteboardEventMap.mxml index e8ce49d217..896f9f7a3f 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/maps/WhiteboardEventMap.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/maps/WhiteboardEventMap.mxml @@ -28,6 +28,7 @@ with BigBlueButton; if not, see . import org.bigbluebutton.modules.present.events.NavigationEvent; import org.bigbluebutton.modules.present.events.PresentationEvent; import org.bigbluebutton.modules.present.events.WindowResizedEvent; + import org.bigbluebutton.modules.present.events.UploadEvent; import org.bigbluebutton.modules.whiteboard.events.PageEvent; import org.bigbluebutton.modules.whiteboard.events.StartWhiteboardModuleEvent; import org.bigbluebutton.modules.whiteboard.events.ToggleGridEvent; diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/models/Presentation.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/models/Presentation.as index d3772ce343..f88c6f4ac3 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/models/Presentation.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/models/Presentation.as @@ -41,7 +41,11 @@ package org.bigbluebutton.modules.whiteboard.models } public function getAnnotation(id:String):Annotation { + if (_currentPage != null) { return _currentPage.getAnnotation(id); + } + + return null; } private function createPages(numPages:int):void { diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/models/WhiteboardModel.as b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/models/WhiteboardModel.as index 006e05b84d..3a839111b4 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/models/WhiteboardModel.as +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/models/WhiteboardModel.as @@ -111,8 +111,10 @@ package org.bigbluebutton.modules.whiteboard.models /* Need to increment the page by 1 as what is passed is zero-based while we store the pages as 1-based.*/ // var curPage:int = pageNum; // LogUtil.debug("*** Switching to page [ " + curPage + " ] ****"); - _currentPresentation.setCurrentPage(pageNum); - _dispatcher.dispatchEvent(new WhiteboardUpdate(WhiteboardUpdate.CHANGE_PAGE)); + if (_currentPresentation != null) { + _currentPresentation.setCurrentPage(pageNum); + _dispatcher.dispatchEvent(new WhiteboardUpdate(WhiteboardUpdate.CHANGE_PAGE)); + } } public function enable(enabled:Boolean):void { diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardCanvas.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardCanvas.mxml index 27bc84b319..f5aec9bab3 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardCanvas.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardCanvas.mxml @@ -279,10 +279,10 @@ with BigBlueButton; if not, see . addRawChild(child); } - public function zoomCanvas(width:Number, height:Number):void { + public function zoomCanvas(width:Number, height:Number, zoom:Number):void { this.width = width; this.height = height; - displayModel.zoomCanvas(width, height); + displayModel.zoomCanvas(width, height, zoom); model.zoomCanvas(width, height); textToolbar.adjustForZoom(width, height); } diff --git a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardToolbar.mxml b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardToolbar.mxml index 21e8f4fe6d..be116fdf00 100755 --- a/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardToolbar.mxml +++ b/bigbluebutton-client/src/org/bigbluebutton/modules/whiteboard/views/WhiteboardToolbar.mxml @@ -37,6 +37,9 @@ with BigBlueButton; if not, see . + + + .colorPickerStyle { @@ -75,8 +78,12 @@ with BigBlueButton; if not, see . import org.bigbluebutton.core.UsersUtil; import org.bigbluebutton.core.managers.UserManager; import org.bigbluebutton.main.events.MadePresenterEvent; - import org.bigbluebutton.main.events.ShortcutEvent; - import org.bigbluebutton.modules.present.events.PresentationEvent; + import org.bigbluebutton.main.events.ShortcutEvent; + import org.bigbluebutton.modules.present.events.DisplaySlideEvent; + import org.bigbluebutton.modules.present.events.PresentationEvent; + import org.bigbluebutton.modules.present.events.NavigationEvent; + import org.bigbluebutton.modules.present.events.SlideEvent; + import org.bigbluebutton.modules.present.events.UploadEvent; import org.bigbluebutton.modules.present.ui.views.PresentationWindow; import org.bigbluebutton.modules.present.ui.views.SlideView; import org.bigbluebutton.modules.whiteboard.business.shapes.DrawObject; @@ -117,7 +124,10 @@ with BigBlueButton; if not, see . [Bindable] private var baseIndex:int; [Bindable] private var showWhiteboardToolbar:Boolean = false; - + + private var mousedOver:Boolean = false; + private var slideLoaded:Boolean = false; + public var canvas:WhiteboardCanvas; private var presentationWindow:PresentationWindow; @@ -206,7 +216,7 @@ with BigBlueButton; if not, see . private function viewerMode(e:MadePresenterEvent):void { canvas.makeTextObjectsUneditable(e); if (!toolbarAllowed()) { - hideToolbar(); + checkVisibility(); if (panzoomBtn) { panzoomBtn.dispatchEvent(new MouseEvent(MouseEvent.CLICK)); } @@ -229,16 +239,17 @@ with BigBlueButton; if not, see . presentationWindow = window; presentationWindow.addEventListener(MoveEvent.MOVE, setPositionAndDepth); presentationWindow.addEventListener(ResizeEvent.RESIZE, setPositionAndDepth); + presentationWindow.addEventListener(MouseEvent.CLICK, setPositionAndDepth); if (!wbOptions.keepToolbarVisible) { - window.presCtrlBar.addEventListener(MouseEvent.ROLL_OVER, hideToolbar); - window.presCtrlBar.addEventListener(MouseEvent.ROLL_OUT, showToolbar); + window.presCtrlBar.addEventListener(MouseEvent.ROLL_OVER, handleMouseOut); + window.presCtrlBar.addEventListener(MouseEvent.ROLL_OUT, handleMouseIn); - window.addEventListener(MouseEvent.ROLL_OVER, showToolbar); - window.addEventListener(MouseEvent.ROLL_OUT, hideToolbar); + window.addEventListener(MouseEvent.ROLL_OVER, handleMouseIn); + window.addEventListener(MouseEvent.ROLL_OUT, handleMouseOut); - this.addEventListener(MouseEvent.ROLL_OVER, showToolbar); - this.addEventListener(MouseEvent.ROLL_OUT, hideToolbar); + this.addEventListener(MouseEvent.ROLL_OVER, handleMouseIn); + this.addEventListener(MouseEvent.ROLL_OUT, handleMouseOut); } else { var listener1:Listener = new Listener(); listener1.method = checkVisibility; @@ -246,14 +257,13 @@ with BigBlueButton; if not, see . var listener2:Listener = new Listener(); listener2.method = checkVisibility; listener2.type = MadePresenterEvent.SWITCH_TO_VIEWER_MODE; - presentationWindow.addEventListener(MouseEvent.CLICK, setPositionAndDepth); //Do an initial check to see if the toolbar should be visible checkVisibility(); } } private function checkVisibility(e:MadePresenterEvent = null):void { - if (toolbarAllowed()) { + if (toolbarAllowed() && slideLoaded && (wbOptions.keepToolbarVisible || mousedOver)) { setPositionAndDepth(); showWhiteboardToolbar = true; } else { @@ -271,17 +281,35 @@ with BigBlueButton; if not, see . parent.removeChild(this); } - private function showToolbar(e:MouseEvent):void { - if (toolbarAllowed()) { - setPositionAndDepth(); - showWhiteboardToolbar = true; - } + private function handleMouseIn(e:MouseEvent):void { + mousedOver = true; + checkVisibility(); } - private function hideToolbar(e:MouseEvent = null):void { - showWhiteboardToolbar = false; + private function handleMouseOut(e:MouseEvent = null):void { + mousedOver = false; + checkVisibility(); } + private function handleSlideLoaded(e:DisplaySlideEvent):void { + slideLoaded = true; + checkVisibility(); + } + + private function handleSlideChange(e:NavigationEvent):void { + slideLoaded = false; + // don't switch the toolbar button on slide change + checkVisibility(); + } + + private function handlePresentationSwitch(e:UploadEvent):void { + slideLoaded = false; + if (panzoomBtn) { + panzoomBtn.dispatchEvent(new MouseEvent(MouseEvent.CLICK)); + } + checkVisibility(); + } + private function graphicObjSelected(event:GraphicObjectFocusEvent):void { var gobj:GraphicObject = event.data; } diff --git a/bigbluebutton-config/bigbluebutton-release b/bigbluebutton-config/bigbluebutton-release index 42d37d5882..599b80a8e2 100644 --- a/bigbluebutton-config/bigbluebutton-release +++ b/bigbluebutton-config/bigbluebutton-release @@ -1 +1 @@ -BIGBLUEBUTTON_RELEASE=0.81-RC2 +BIGBLUEBUTTON_RELEASE=0.81 diff --git a/bigbluebutton-config/bin/bbb-conf b/bigbluebutton-config/bin/bbb-conf index 34da777ae6..f9b998409f 100755 --- a/bigbluebutton-config/bin/bbb-conf +++ b/bigbluebutton-config/bin/bbb-conf @@ -45,6 +45,7 @@ # 2012-02-22 FFD Updates to development environment # 2012-04-27 FFD Added sum of version numbers in --check # 2013-02-03 FFD Updated for changes to parameters for 0.81 in bigbluebutton-sip.properties +# 2013-11-07 FFD Finished 0.81 #set -x #set -e diff --git a/bigbluebutton-config/web/index.html b/bigbluebutton-config/web/index.html index 82010fa9d7..06c8950e3e 100755 --- a/bigbluebutton-config/web/index.html +++ b/bigbluebutton-config/web/index.html @@ -22,7 +22,7 @@
  • twitter
  • Facebook
  • YouTube
  • -
  • google
  • +
  • google
  • @@ -101,7 +101,7 @@ diff --git a/bigbluebutton-config/web/testjava.html b/bigbluebutton-config/web/testjava.html new file mode 100644 index 0000000000..9c5a78062a --- /dev/null +++ b/bigbluebutton-config/web/testjava.html @@ -0,0 +1,8 @@ + + + +Redirecting to BigBlueButton Help + + + + diff --git a/bigbluebutton-web/grails-app/conf/bigbluebutton.properties b/bigbluebutton-web/grails-app/conf/bigbluebutton.properties index 751fc4e432..153ad161da 100755 --- a/bigbluebutton-web/grails-app/conf/bigbluebutton.properties +++ b/bigbluebutton-web/grails-app/conf/bigbluebutton.properties @@ -77,7 +77,7 @@ defaultDialAccessNumber=613-555-1234 # conference. This is only used for the old scheduling which will be # removed in the future. Use the API to create a conference. defaultWelcomeMessage=
    Welcome to %%CONFNAME%%!

    For help on using BigBlueButton see these (short) tutorial videos.

    To join the audio bridge click the headset icon (upper-left hand corner). Use a headset to avoid causing background noise for others.
    -defaultWelcomeMessageFooter=This server is running BigBlueButton 0.81-RC2. +defaultWelcomeMessageFooter=This server is running BigBlueButton 0.81. # Default maximum number of users a meeting can have. # Doesn't get enforced yet but is the default value when the create diff --git a/bigbluebutton-web/grails-app/controllers/org/bigbluebutton/web/controllers/ApiController.groovy b/bigbluebutton-web/grails-app/controllers/org/bigbluebutton/web/controllers/ApiController.groovy index d61da2fc26..95cfbf0700 100755 --- a/bigbluebutton-web/grails-app/controllers/org/bigbluebutton/web/controllers/ApiController.groovy +++ b/bigbluebutton-web/grails-app/controllers/org/bigbluebutton/web/controllers/ApiController.groovy @@ -41,7 +41,7 @@ import java.util.HashMap; import java.util.Iterator; import java.util.ArrayList; import java.text.DateFormat; - +import org.bigbluebutton.api.Util; class ApiController { private static final Integer SESSION_TIMEOUT = 14400 // 4 hours @@ -1716,8 +1716,8 @@ class ApiController { } def cleanFilename(filename) { String fname = URLDecoder.decode(filename).trim() - def notValidCharsRegExp = /[^0-9a-zA-Z_\.]/ - return fname.replaceAll(notValidCharsRegExp, '-') + + return Util.cleanPresentationFilename(fname) } def processDocumentFromRawBytes(bytes, filename, conf) { diff --git a/bigbluebutton-web/grails-app/controllers/org/bigbluebutton/web/controllers/PresentationController.groovy b/bigbluebutton-web/grails-app/controllers/org/bigbluebutton/web/controllers/PresentationController.groovy index 05e7355b9e..e2c03a0c78 100755 --- a/bigbluebutton-web/grails-app/controllers/org/bigbluebutton/web/controllers/PresentationController.groovy +++ b/bigbluebutton-web/grails-app/controllers/org/bigbluebutton/web/controllers/PresentationController.groovy @@ -21,6 +21,7 @@ package org.bigbluebutton.web.controllers import grails.converters.* import org.bigbluebutton.web.services.PresentationService import org.bigbluebutton.presentation.UploadedPresentation +import org.bigbluebutton.api.Util; class PresentationController { PresentationService presentationService @@ -67,14 +68,13 @@ class PresentationController { def file = request.getFile('fileUpload') if(file && !file.empty) { flash.message = 'Your file has been uploaded' - // Replace any character other than a (A-Z, a-z, 0-9, _ or .) with a - (dash). - def notValidCharsRegExp = /[^0-9a-zA-Z_\.]/ log.debug "Uploaded presentation name : $params.presentation_name" - def presentationName = params.presentation_name.replaceAll(notValidCharsRegExp, '-') + def presentationName = Util.cleanPresentationFilename(params.presentation_name) + log.debug "Uploaded presentation name : $presentationName" File uploadDir = presentationService.uploadedPresentationDirectory(params.conference, params.room, presentationName) - def newFilename = file.getOriginalFilename().replaceAll(notValidCharsRegExp, '-') + def newFilename = Util.cleanPresentationFilename(file.getOriginalFilename()) def pres = new File( uploadDir.absolutePath + File.separatorChar + newFilename ) file.transferTo(pres) diff --git a/bigbluebutton-web/src/groovy/org/bigbluebutton/api/RecordingServiceHelperImp.groovy b/bigbluebutton-web/src/groovy/org/bigbluebutton/api/RecordingServiceHelperImp.groovy index 0b1611d02e..ba766ebde0 100755 --- a/bigbluebutton-web/src/groovy/org/bigbluebutton/api/RecordingServiceHelperImp.groovy +++ b/bigbluebutton-web/src/groovy/org/bigbluebutton/api/RecordingServiceHelperImp.groovy @@ -64,6 +64,7 @@ public class RecordingServiceHelperImp implements RecordingServiceHelper { builder.playback { builder.format(info.getPlaybackFormat()) builder.link(info.getPlaybackLink()) + builder.duration(info.getPlaybackDuration()) } Map metainfo = info.getMetadata(); builder.meta{ @@ -97,6 +98,7 @@ public class RecordingServiceHelperImp implements RecordingServiceHelper { r.setEndTime(rec.end_time.text()); r.setPlaybackFormat(rec.playback.format.text()); r.setPlaybackLink(rec.playback.link.text()); + r.setPlaybackDuration(rec.playback.duration.text()); Map meta = new HashMap(); rec.meta.children().each { anode -> @@ -107,4 +109,4 @@ public class RecordingServiceHelperImp implements RecordingServiceHelper { return r; } -} \ No newline at end of file +} diff --git a/bigbluebutton-web/src/java/org/bigbluebutton/api/MeetingService.java b/bigbluebutton-web/src/java/org/bigbluebutton/api/MeetingService.java index e1622e09a4..6ff2a5c46e 100755 --- a/bigbluebutton-web/src/java/org/bigbluebutton/api/MeetingService.java +++ b/bigbluebutton-web/src/java/org/bigbluebutton/api/MeetingService.java @@ -177,23 +177,27 @@ public class MeetingService { ArrayList plays=new ArrayList(); - plays.add(new Playback(r.getPlaybackFormat(), r.getPlaybackLink(), getDurationRecording(r.getEndTime(), r.getStartTime()))); + plays.add(new Playback(r.getPlaybackFormat(), r.getPlaybackLink(), getDurationRecording(r.getPlaybackDuration(), r.getEndTime(), r.getStartTime()))); r.setPlaybacks(plays); map.put(r.getId(), r); } else{ Recording rec=map.get(r.getId()); - rec.getPlaybacks().add(new Playback(r.getPlaybackFormat(), r.getPlaybackLink(), getDurationRecording(r.getEndTime(), r.getStartTime()))); + rec.getPlaybacks().add(new Playback(r.getPlaybackFormat(), r.getPlaybackLink(), getDurationRecording(r.getPlaybackDuration(), r.getEndTime(), r.getStartTime()))); } } return map; } - private int getDurationRecording(String end, String start){ + private int getDurationRecording(String playbackDuration, String end, String start) { int duration; try{ - duration = (int)Math.ceil((Long.parseLong(end) - Long.parseLong(start))/60000.0); + if (!playbackDuration.equals("")) { + duration = (int)Math.ceil((Long.parseLong(playbackDuration))/60000.0); + } else { + duration = (int)Math.ceil((Long.parseLong(end) - Long.parseLong(start))/60000.0); + } }catch(Exception e){ log.debug(e.getMessage()); duration = 0; diff --git a/bigbluebutton-web/src/java/org/bigbluebutton/api/Util.java b/bigbluebutton-web/src/java/org/bigbluebutton/api/Util.java new file mode 100755 index 0000000000..9b28112001 --- /dev/null +++ b/bigbluebutton-web/src/java/org/bigbluebutton/api/Util.java @@ -0,0 +1,15 @@ +package org.bigbluebutton.api; + +import java.util.regex.Pattern; + +public final class Util { + + public static String cleanPresentationFilename(String name) { + String cleanFilename = Pattern.compile("[^0-9a-zA-Z_.]").matcher(name).replaceAll("-"); + if (cleanFilename.startsWith(".")) { + return cleanFilename.substring(1); + } else { + return cleanFilename; + } + } +} diff --git a/bigbluebutton-web/src/java/org/bigbluebutton/api/domain/Meeting.java b/bigbluebutton-web/src/java/org/bigbluebutton/api/domain/Meeting.java index 04bc41fa64..3c65890234 100755 --- a/bigbluebutton-web/src/java/org/bigbluebutton/api/domain/Meeting.java +++ b/bigbluebutton-web/src/java/org/bigbluebutton/api/domain/Meeting.java @@ -29,12 +29,12 @@ import java.util.concurrent.ConcurrentMap; import org.apache.commons.lang.RandomStringUtils; public class Meeting { - private static final int MILLIS_IN_A_MINUTE = 60000; + private static final long MILLIS_IN_A_MINUTE = 60000; private String name; private String extMeetingId; private String intMeetingId; - private int duration = 0; + private long duration = 0; private long createdTime = 0; private long startTime = 0; private long endTime = 0; diff --git a/bigbluebutton-web/src/java/org/bigbluebutton/api/domain/Recording.java b/bigbluebutton-web/src/java/org/bigbluebutton/api/domain/Recording.java index 2fbc50737c..e3c8817c2e 100755 --- a/bigbluebutton-web/src/java/org/bigbluebutton/api/domain/Recording.java +++ b/bigbluebutton-web/src/java/org/bigbluebutton/api/domain/Recording.java @@ -40,6 +40,7 @@ public class Recording { private String state; private String playbackLink; private String playbackFormat; + private String playbackDuration; public String getId() { @@ -98,6 +99,14 @@ public class Recording { this.playbackFormat = playbackFormat; } + public String getPlaybackDuration() { + return playbackDuration; + } + + public void setPlaybackDuration(String playbackDuration) { + this.playbackDuration = playbackDuration; + } + public Map getMetadata() { return metadata; } diff --git a/bigbluebutton-web/test/unit/org/bigbluebutton/api/UtilTest.groovy b/bigbluebutton-web/test/unit/org/bigbluebutton/api/UtilTest.groovy new file mode 100755 index 0000000000..d6facaeffd --- /dev/null +++ b/bigbluebutton-web/test/unit/org/bigbluebutton/api/UtilTest.groovy @@ -0,0 +1,19 @@ +package org.bigbluebutton.api; + +class UtilTest extends GroovyTestCase { + + void testPresentationFilename() { + String filename = Util.cleanPresentationFilename("mypresentation%#@foo.txt"); + assertTrue(filename.equals("mypresentation---foo.txt")) + } + + void testPresentationFilenameThatBeginsWithDot() { + String filename = Util.cleanPresentationFilename(".mypresentation%#@foo.txt"); + assertTrue(filename.equals("mypresentation---foo.txt")) + } + + void testPresentationFilenameWithMultipleDot() { + String filename = Util.cleanPresentationFilename(".mypresentation%#@foo.txt.png"); + assertTrue(filename.equals("mypresentation---foo.txt.png")) + } +} \ No newline at end of file diff --git a/deskshare/app/src/main/scala/org/bigbluebutton/deskshare/server/sessions/SessionSVC.scala b/deskshare/app/src/main/scala/org/bigbluebutton/deskshare/server/sessions/SessionSVC.scala index 2f501aa366..51ed1eb021 100755 --- a/deskshare/app/src/main/scala/org/bigbluebutton/deskshare/server/sessions/SessionSVC.scala +++ b/deskshare/app/src/main/scala/org/bigbluebutton/deskshare/server/sessions/SessionSVC.scala @@ -45,17 +45,22 @@ class SessionSVC(sessionManager:SessionManagerSVC, room: String, screenDim: Dime private var mouseLoc:Point = new Point(100,100) private var pendingGenKeyFrameRequest = false private var timestamp = 0L; + private var lastUserKeyFrameRequest = 0L + private var sentInitialKeyFrame = false; /* * Schedule to generate a key frame after 30seconds of a request. * This prevents us from generating unnecessary key frames when * users join within seconds of each other. */ - def scheduleGenerateKeyFrame() { - val mainActor = self - actor { - Thread.sleep(keyFrameInterval) - mainActor ! "GenerateAKeyFrame" + def scheduleGenerateKeyFrame(waitSec:Int) { + if (!pendingGenKeyFrameRequest) { + pendingGenKeyFrameRequest = true + val mainActor = self + actor { + Thread.sleep(waitSec) + mainActor ! "GenerateAKeyFrame" + } } } @@ -82,11 +87,16 @@ class SessionSVC(sessionManager:SessionManagerSVC, room: String, screenDim: Dime } } case GenerateKeyFrame => { - if (!pendingGenKeyFrameRequest) { - pendingGenKeyFrameRequest = true - scheduleGenerateKeyFrame() - } + val now = System.currentTimeMillis() + // Wait 30sec between keyframe request from the users. This prevents + // creating many keyframes when users join the session close to one + // another. + if (now - lastUserKeyFrameRequest > 30000) { + lastUserKeyFrameRequest = now + scheduleGenerateKeyFrame(keyFrameInterval) } + + } case "GenerateAKeyFrame" => { pendingGenKeyFrameRequest = false log.debug("Session: Generating Key Frame for room %s", room) @@ -124,7 +134,17 @@ class SessionSVC(sessionManager:SessionManagerSVC, room: String, screenDim: Dime private def updateBlock(position: Int, videoData: Array[Byte], keyFrame: Boolean, seqNum: Int): Unit = { lastUpdate = System.currentTimeMillis() - blockManager.updateBlock(position, videoData, keyFrame, seqNum) + blockManager.updateBlock(position, videoData, keyFrame, seqNum) + + if (!sentInitialKeyFrame) { + // We have received all the blocks from the applet. Force sending a key frame + // to all clients so they won't see the trickle effect. + if (blockManager.hasReceivedAllBlocks) { + log.debug("Session: Received all blocks. Generating key frame for session %s", room) + scheduleGenerateKeyFrame(1) + sentInitialKeyFrame = true; + } + } } private def generateFrame(keyframe:Boolean) { diff --git a/deskshare/app/src/main/scala/org/bigbluebutton/deskshare/server/stream/DeskshareService.scala b/deskshare/app/src/main/scala/org/bigbluebutton/deskshare/server/stream/DeskshareService.scala index 005541a705..cdb749544e 100755 --- a/deskshare/app/src/main/scala/org/bigbluebutton/deskshare/server/stream/DeskshareService.scala +++ b/deskshare/app/src/main/scala/org/bigbluebutton/deskshare/server/stream/DeskshareService.scala @@ -34,7 +34,7 @@ class DeskshareService(streamManager: StreamManager, sessionGateway: SessionMana var height = 0 streamManager !? (3000, IsStreamPublishing(room)) match { - case None => log.warning("Timeout waiting for reply to IsStreamPublishing for room %s", room) + case None => log.warning("DeskshareService: Timeout waiting for reply to IsStreamPublishing for room %s", room) case Some(rep) => { val reply = rep.asInstanceOf[StreamPublishingReply] publishing = reply.publishing @@ -51,9 +51,8 @@ class DeskshareService(streamManager: StreamManager, sessionGateway: SessionMana return stream; } - def startedToViewStream(): Unit = { - val room: String = Red5.getConnectionLocal().getScope().getName(); - log.debug("Started viewing stream for room %s", room) - sessionGateway.sendKeyFrame(room) + def startedToViewStream(stream: String): Unit = { + log.debug("DeskshareService: Started viewing stream for room %s", stream) + sessionGateway.sendKeyFrame(stream) } } diff --git a/deskshare/app/src/main/scala/org/bigbluebutton/deskshare/server/svc1/Block.scala b/deskshare/app/src/main/scala/org/bigbluebutton/deskshare/server/svc1/Block.scala index 5e47dfc0f0..8c0e890dee 100755 --- a/deskshare/app/src/main/scala/org/bigbluebutton/deskshare/server/svc1/Block.scala +++ b/deskshare/app/src/main/scala/org/bigbluebutton/deskshare/server/svc1/Block.scala @@ -18,6 +18,7 @@ */ package org.bigbluebutton.deskshare.server.svc1 +import java.awt.Color; import java.util.Random import net.lag.logging.Logger import org.bigbluebutton.deskshare.common.ScreenVideoEncoder @@ -41,8 +42,14 @@ class Block(val dim: Dimension, val position: Int) { // Initialize a blank block. private var blankPixels = new Array[Int](dim.width * dim.height) for (i: Int <- 0 until blankPixels.length) { - blankPixels(i) = 0xCECECE; + blankPixels(i) = randomColor } + + private def randomColor():Int = { + val color = new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)) + color.getRGB() + } + val encodedBlankPixels = ScreenVideoEncoder.encodePixels(blankPixels, dim.width, dim.height, false) def update(videoData: Array[Byte], isKeyFrame: Boolean, seqNum: Int): Unit = { diff --git a/deskshare/app/src/main/scala/org/bigbluebutton/deskshare/server/svc1/BlockManager.scala b/deskshare/app/src/main/scala/org/bigbluebutton/deskshare/server/svc1/BlockManager.scala index 00e5ef6d52..96199a4e57 100755 --- a/deskshare/app/src/main/scala/org/bigbluebutton/deskshare/server/svc1/BlockManager.scala +++ b/deskshare/app/src/main/scala/org/bigbluebutton/deskshare/server/svc1/BlockManager.scala @@ -34,7 +34,7 @@ class BlockManager(room: String, screenDim: Dimension, blockDim: Dimension, wait private var lastFrameTime = 0L private var lastKeyFrameTime = 0L private val KEYFRAME_INTERVAL = 20000 - private var blockToUpdate = 1 + private var rowToUpdate = 1 private var startTime = 0L private var gotAllBlocksTime = 0L private var gotAllBlocks = false; @@ -60,6 +60,15 @@ class BlockManager(room: String, screenDim: Dimension, blockDim: Dimension, wait def updateBlock(position: Int, videoData: Array[Byte], keyFrame: Boolean, seqNum: Int): Unit = { val block: Block = blocksMap.get(position) block.update(videoData, keyFrame, seqNum) + + if (! gotAllBlocks ) { + val numberOfBlocks = numberOfRows * numberOfColumns + gotAllBlocks = allBlocksReceived(numberOfBlocks) + } + } + + def hasReceivedAllBlocks():Boolean = { + gotAllBlocks; } private def allBlocksReceived(numberOfBlocks: Int):Boolean = { @@ -88,11 +97,7 @@ class BlockManager(room: String, screenDim: Dimension, blockDim: Dimension, wait val flags : Byte = 0; // 6 bits reserved (0); HasIFrameImage=0; HasPaletteInfo=0 screenVideoFrame.write(flags); } - - if (! gotAllBlocks ) { - gotAllBlocks = allBlocksReceived(numberOfBlocks) - } - + for (position: Int <- 1 to numberOfBlocks) { var block: Block = blocksMap.get(position) var encodedBlock: Array[Byte] = ScreenVideoEncoder.encodeBlockUnchanged() @@ -100,7 +105,7 @@ class BlockManager(room: String, screenDim: Dimension, blockDim: Dimension, wait // We need to wait for all the blocks. Just encode a blank block. encodedBlock = block.getEncodedBlock(true); } else { - if (block.hasChanged || (position == blockToUpdate) || genKeyFrame) { + if (block.hasChanged || (position/numberOfColumns == rowToUpdate) || genKeyFrame) { encodedBlock = block.getEncodedBlock(false); // println("Encoded block length[" + position + "] = " + encodedBlock.length) } @@ -109,8 +114,8 @@ class BlockManager(room: String, screenDim: Dimension, blockDim: Dimension, wait screenVideoFrame.write(encodedBlock, 0, encodedBlock.length) } - blockToUpdate += 1; - if (blockToUpdate > numberOfBlocks) blockToUpdate = 1; + rowToUpdate += 1; + if (rowToUpdate > numberOfRows) rowToUpdate = 1; // println("Key=" + genKeyFrame + " frame length=" + screenVideoFrame.toByteArray.length) diff --git a/deskshare/applet/build.gradle b/deskshare/applet/build.gradle index 249e944abd..4a16d096cd 100755 --- a/deskshare/applet/build.gradle +++ b/deskshare/applet/build.gradle @@ -30,6 +30,10 @@ jar.doFirst { } jar { - manifest.mainAttributes("Trusted-library": "true") - + manifest.mainAttributes("Permissions": "all-permissions") + manifest.mainAttributes("Codebase": "*") + manifest.mainAttributes("Application-Name": "BigBlueButton Deskshare Applet") + manifest.mainAttributes("Application-Library-Allowable-Codebase": "*") + manifest.mainAttributes("Caller-Allowable-Codebase": "*") + manifest.mainAttributes("Trusted-Only": "true") } diff --git a/deskshare/applet/src/main/java/org/bigbluebutton/deskshare/client/DeskShareApplet.java b/deskshare/applet/src/main/java/org/bigbluebutton/deskshare/client/DeskShareApplet.java index e1be0dfd24..36fa122109 100755 --- a/deskshare/applet/src/main/java/org/bigbluebutton/deskshare/client/DeskShareApplet.java +++ b/deskshare/applet/src/main/java/org/bigbluebutton/deskshare/client/DeskShareApplet.java @@ -22,10 +22,11 @@ import javax.imageio.ImageIO; import javax.swing.JApplet; import javax.swing.JFrame; import javax.swing.JOptionPane; - import java.io.IOException; import java.net.URL; import java.security.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import java.awt.Image; public class DeskShareApplet extends JApplet implements ClientListener { @@ -40,6 +41,7 @@ public class DeskShareApplet extends JApplet implements ClientListener { Integer cHeightValue = new Integer(600); Integer sWidthValue = new Integer(800); Integer sHeightValue = new Integer(600); + Double scale = new Double(0.8); Boolean qualityValue = false; Boolean aspectRatioValue = false; Integer xValue = new Integer(0); @@ -51,11 +53,17 @@ public class DeskShareApplet extends JApplet implements ClientListener { Image icon; public boolean isSharing = false; - + private volatile boolean clientStarted = false; + private static final String JAVA_VERSION_PATTERN = "1.7.0_([0-9]+)"; + private final int MIN_JRE_VERSION = 45; + private final static String VERSION_ERROR_MSG = "Desktop sharing requires Java 7 update 45 (or later) to run."; + private class DestroyJob implements PrivilegedExceptionAction { public Object run() throws Exception { System.out.println("Desktop Sharing Applet Destroy"); - client.stop(); + if (clientStarted) { + client.stop(); + } return null; } } @@ -69,6 +77,10 @@ public class DeskShareApplet extends JApplet implements ClientListener { if (port != null) portValue = Integer.parseInt(port); roomValue = getParameter("ROOM"); + String scaleValue = getParameter("SCALE"); + if (scaleValue != null) scale = Double.parseDouble(scaleValue); + + String captureFullScreen = getParameter("FULL_SCREEN"); if (captureFullScreen != null) fullScreenValue = Boolean.parseBoolean(captureFullScreen); @@ -83,21 +95,70 @@ public class DeskShareApplet extends JApplet implements ClientListener { } catch (IOException e) { } } + + private String getJavaVersionRuntime() { + return System.getProperty("java.version"); + } + + /** + * Create the GUI and show it. For thread safety, + * this method should be invoked from the + * event-dispatching thread. + */ + private void createAndShowGUI(final String warning) { + JOptionPane.showMessageDialog(null, + warning, + "Java Version Error", + JOptionPane.ERROR_MESSAGE); + stop(); + } + + private void displayJavaWarning(final String warning) { + //Schedule a job for the event-dispatching thread: + //creating and showing this application's GUI. + javax.swing.SwingUtilities.invokeLater(new Runnable() { + public void run() { + createAndShowGUI(warning); + } + }); + } @Override public void start() { System.out.println("Desktop Sharing Applet Starting"); super.start(); - client = new DeskshareClient.NewBuilder().host(hostValue).port(portValue) - .room(roomValue).captureWidth(cWidthValue) - .captureHeight(cHeightValue).scaleWidth(sWidthValue).scaleHeight(sHeightValue) - .quality(qualityValue).autoScale(0.8) - .x(xValue).y(yValue).fullScreen(fullScreenValue).useSVC2(useSVC2Value) - .httpTunnel(tunnelValue).trayIcon(icon).enableTrayIconActions(false).build(); - client.addClientListener(this); - client.start(); + + System.out.println("**** JAVA VERSION = [" + getJavaVersionRuntime() + "]"); + + Pattern p = Pattern.compile(JAVA_VERSION_PATTERN); + Matcher matcher = p.matcher(getJavaVersionRuntime()); + if (matcher.matches()) { + int jreVersion = Integer.valueOf(matcher.group(1).trim()).intValue(); + if (jreVersion < MIN_JRE_VERSION) { + displayJavaWarning(VERSION_ERROR_MSG); + } else { + allowDesktopSharing(); + } + } else { + displayJavaWarning(VERSION_ERROR_MSG); + } } - + + private void allowDesktopSharing() { + client = new DeskshareClient.NewBuilder().host(hostValue).port(portValue) + .room(roomValue).captureWidth(cWidthValue) + .captureHeight(cHeightValue).scaleWidth(sWidthValue).scaleHeight(sHeightValue) + .quality(qualityValue).autoScale(scale) + .x(xValue).y(yValue).fullScreen(fullScreenValue).useSVC2(useSVC2Value) + .httpTunnel(tunnelValue).trayIcon(icon).enableTrayIconActions(false).build(); + client.addClientListener(this); + + clientStarted = true; + + client.start(); + } + + @Override public void destroy() { /* We make this a privileged job. @@ -121,7 +182,10 @@ public class DeskShareApplet extends JApplet implements ClientListener { @Override public void stop() { System.out.println("Desktop Sharing Applet Stopping"); - client.stop(); + if (clientStarted) { + client.stop(); + } + super.stop(); } diff --git a/deskshare/applet/src/main/java/org/bigbluebutton/deskshare/client/DeskshareClient.java b/deskshare/applet/src/main/java/org/bigbluebutton/deskshare/client/DeskshareClient.java index 10fe34310a..74c6e99bb0 100755 --- a/deskshare/applet/src/main/java/org/bigbluebutton/deskshare/client/DeskshareClient.java +++ b/deskshare/applet/src/main/java/org/bigbluebutton/deskshare/client/DeskshareClient.java @@ -215,21 +215,11 @@ public class DeskshareClient { y = ((int) fullScreenSize.getHeight() - captureHeight) / 2; System.out.println("Info[" + captureWidth + "," + captureHeight + "][" + x + "," + y +"]" + "[" + fullScreenSize.getWidth() + "," + fullScreenSize.getHeight() + "]"); - calculateDimensionsToMaintainAspectRatio(); + scaleWidth = captureWidth; + scaleHeight = captureHeight; } } - - private void calculateDimensionsToMaintainAspectRatio() { - if (scaleWidth > 0 && scaleHeight > 0) { -// if (aspectRatio) { -// recalculateScaleDimensionsToMaintainAspectRatio(); -// } - } else { - scaleWidth = captureWidth; - scaleHeight = captureHeight; - } - } - + private void setupFullScreen() { java.awt.Dimension fullScreenSize = Toolkit.getDefaultToolkit().getScreenSize(); captureWidth = (int) fullScreenSize.getWidth(); @@ -246,12 +236,18 @@ public class DeskshareClient { System.out.println("Check for scaling[" + captureWidth + "," + captureHeight +"][" + scaleWidth + "," + scaleHeight + "]"); - if (scaleWidth > 1280) { - scaleWidth = 1280; - double ratio = (double)captureHeight/(double)captureWidth; - scaleHeight = (int)((double)scaleWidth * ratio); - System.out.println("Scaling[" + captureWidth + "," + captureHeight +"][" + scaleWidth + "," + scaleHeight + "]"); + if (scale == 1) { + scaleWidth = captureWidth; + scaleHeight = captureHeight; + } else { + if (scaleWidth > 1280) { + scaleWidth = 1280; + double ratio = (double)captureHeight/(double)captureWidth; + scaleHeight = (int)((double)scaleWidth * ratio); + System.out.println("Scaling[" + captureWidth + "," + captureHeight +"][" + scaleWidth + "," + scaleHeight + "]"); + } } + } } diff --git a/deskshare/applet/src/main/java/org/bigbluebutton/deskshare/client/ScreenRegionSharer.java b/deskshare/applet/src/main/java/org/bigbluebutton/deskshare/client/ScreenRegionSharer.java index d7924de8fe..beb20b3950 100755 --- a/deskshare/applet/src/main/java/org/bigbluebutton/deskshare/client/ScreenRegionSharer.java +++ b/deskshare/applet/src/main/java/org/bigbluebutton/deskshare/client/ScreenRegionSharer.java @@ -81,6 +81,8 @@ public class ScreenRegionSharer implements ScreenSharer { ssi.y = y; ssi.captureWidth = width; ssi.captureHeight = height; + ssi.scaleWidth = width; + ssi.scaleHeight = height; sharer = new ScreenSharerRunner(ssi); sharer.addClientListener(listener); sharer.startSharing(); diff --git a/deskshare/applet/src/main/java/org/bigbluebutton/deskshare/client/ScreenSharerRunner.java b/deskshare/applet/src/main/java/org/bigbluebutton/deskshare/client/ScreenSharerRunner.java index 2e7bbcfe6c..2f051ebb6f 100755 --- a/deskshare/applet/src/main/java/org/bigbluebutton/deskshare/client/ScreenSharerRunner.java +++ b/deskshare/applet/src/main/java/org/bigbluebutton/deskshare/client/ScreenSharerRunner.java @@ -203,7 +203,7 @@ public class ScreenSharerRunner { System.out.println("-----------------------------------------------------------------------"); System.out.println(LICENSE_HEADER); System.out.println("-----------------------------------------------------------------------\n\n"); - System.out.println("Desktop Sharing v0.8"); + System.out.println("Desktop Sharing v0.81"); System.out.println("Start"); System.out.println("Connecting to " + ssi.host + ":" + ssi.port + " room " + ssi.room); System.out.println("Sharing " + ssi.captureWidth + "x" + ssi.captureHeight + " at " + ssi.x + "," + ssi.y); diff --git a/deskshare/applet/test-applet.sh b/deskshare/applet/test-applet.sh new file mode 100755 index 0000000000..8cf97d4029 --- /dev/null +++ b/deskshare/applet/test-applet.sh @@ -0,0 +1,7 @@ +cd ../common +gradle clean +cd ../applet +gradle jar +ant sign-certificate-jar +cp /home/firstuser/dev/bigbluebutton/deskshare/applet/build/libs/bbb-deskshare-applet-0.8.1.jar /home/firstuser/dev/bigbluebutton/bigbluebutton-client/client/ + diff --git a/labs/stress-testing/bbb-test b/labs/stress-testing/bbb-test index aaa23b964a..29da034e47 100755 --- a/labs/stress-testing/bbb-test +++ b/labs/stress-testing/bbb-test @@ -57,7 +57,7 @@ fi # http://192.168.0.104/bigbluebutton/demo/demo1.jsp?username=Fred2&action=create # HOST="http://$HOST/bigbluebutton/demo/demo1.jsp?action=create&username=user" -HOST="http://$HOST/bigbluebutton" +HOST="http://$HOST" if ! wget $HOST/api -O - --quiet | grep -q SUCCESS; then diff --git a/record-and-playback/core/lib/recordandplayback.rb b/record-and-playback/core/lib/recordandplayback.rb index a1289cfc19..9d922c69b0 100755 --- a/record-and-playback/core/lib/recordandplayback.rb +++ b/record-and-playback/core/lib/recordandplayback.rb @@ -35,6 +35,7 @@ require 'recordandplayback/generators/matterhorn_processor' require 'recordandplayback/generators/audio_processor' require 'recordandplayback/generators/presentation' require 'open4' +require 'pp' module BigBlueButton class MissingDirectoryException < RuntimeError @@ -137,4 +138,8 @@ module BigBlueButton return $?.exitstatus end end + + def self.hash_to_str(hash) + return PP.pp(hash, "") + end end diff --git a/record-and-playback/core/lib/recordandplayback/edl.rb b/record-and-playback/core/lib/recordandplayback/edl.rb index edd0054389..57ae515214 100644 --- a/record-and-playback/core/lib/recordandplayback/edl.rb +++ b/record-and-playback/core/lib/recordandplayback/edl.rb @@ -23,7 +23,7 @@ require File.expand_path('../edl/audio', __FILE__) module BigBlueButton module EDL FFMPEG = ['ffmpeg', '-y', '-v', 'warning', '-nostats'] - FFPROBE = ['ffprobe', '-v', 'warning', '-print_format', 'json', '-show_format', '-show_streams'] + FFPROBE = ['ffprobe', '-v', 'warning', '-print_format', 'json', '-show_format', '-show_streams', '-count_frames'] def self.encode(audio, video, format, output_basename, audio_offset = 0) output = "#{output_basename}.#{format[:extension]}" diff --git a/record-and-playback/core/lib/recordandplayback/edl/audio.rb b/record-and-playback/core/lib/recordandplayback/edl/audio.rb index b972bbb04b..374eee03a4 100644 --- a/record-and-playback/core/lib/recordandplayback/edl/audio.rb +++ b/record-and-playback/core/lib/recordandplayback/edl/audio.rb @@ -44,6 +44,8 @@ module BigBlueButton sections = [] audioinfo = {} + corrupt_audios = Set.new + BigBlueButton.logger.info "Pre-processing EDL" for i in 0...(edl.length - 1) # The render scripts use this to calculate cut lengths @@ -60,9 +62,25 @@ module BigBlueButton info = audio_info(audiofile) BigBlueButton.logger.debug " sample rate: #{info[:sample_rate]}, duration: #{info[:duration]}" + if !info[:audio] || !info[:duration] + BigBlueButton.logger.warn " This audio file is corrupt! It will be removed from the output." + corrupt_audios << audiofile + end + audioinfo[audiofile] = info end + if corrupt_audios.length > 0 + BigBlueButton.logger.info "Removing corrupt audio files from EDL" + edl.each do |event| + if event[:audio] && corrupt_audios.include?(event[:audio][:filename]) + event[:audio] = nil + end + end + + dump(edl) + end + BigBlueButton.logger.info "Generating sections" for i in 0...(edl.length - 1) @@ -89,14 +107,15 @@ module BigBlueButton # adjust the speed to match up timing. # TODO: This should be part of the import logic somehow, since # render can be run after cutting. - if ((duration - audioinfo[audio[:filename]][:duration]).to_f / duration).abs < 0.05 - speed = audioinfo[audio[:filename]][:duration].to_f / duration + # calculate the speed based on the original event duration + if ((entry[:original_duration] - audioinfo[audio[:filename]][:duration]).to_f / entry[:original_duration]).abs < 0.05 + speed = audioinfo[audio[:filename]][:duration].to_f / entry[:original_duration] BigBlueButton.logger.warn " Audio file length mismatch, adjusting speed to #{speed}" sox_cmd += ['speed', speed.to_s, 'rate', '-h', audioinfo[audio[:filename]][:sample_rate].to_s] end - BigBlueButton.logger.info " Trimming from #{audio[:timestamp]} to #{audio[:timestamp] + duration}" - sox_cmd += ['trim', "#{ms_to_s(audio[:timestamp])}", "#{ms_to_s(audio[:timestamp] + duration)}"] + BigBlueButton.logger.info " Trimming from #{audio[:timestamp]} to #{audio[:timestamp] + duration}, duration #{duration}" + sox_cmd += ['trim', "#{ms_to_s(audio[:timestamp])}", "#{ms_to_s(duration)}"] else BigBlueButton.logger.info " Trimming to #{duration}" sox_cmd += ['trim', '0.000', "#{ms_to_s(duration)}"] diff --git a/record-and-playback/core/lib/recordandplayback/edl/video.rb b/record-and-playback/core/lib/recordandplayback/edl/video.rb index be1ef98f32..0668da23a9 100644 --- a/record-and-playback/core/lib/recordandplayback/edl/video.rb +++ b/record-and-playback/core/lib/recordandplayback/edl/video.rb @@ -18,6 +18,7 @@ # along with BigBlueButton. If not, see . require 'json' +require 'set' module BigBlueButton module EDL @@ -155,6 +156,8 @@ module BigBlueButton def self.render(edl, layout, output_basename) videoinfo = {} + corrupt_videos = Set.new + BigBlueButton.logger.info "Pre-processing EDL" for i in 0...(edl.length - 1) # The render scripts need this to calculate cut lengths @@ -174,9 +177,23 @@ module BigBlueButton info = video_info(videofile) BigBlueButton.logger.debug " width: #{info[:width]}, height: #{info[:height]}, duration: #{info[:duration]}" + if !info[:video] || !info[:video][:nb_read_frames] + BigBlueButton.logger.warn " This video file is corrupt! It will be removed from the output." + corrupt_videos << videofile + end + videoinfo[videofile] = info end + if corrupt_videos.length > 0 + BigBlueButton.logger.info "Removing corrupt video files from EDL" + edl.each do |event| + event[:areas].each do |area, videos| + videos.delete_if { |video| corrupt_videos.include?(video[:filename]) } + end + end + end + BigBlueButton.logger.info "Generating missing video end events" videoinfo.each do |filename, info| @@ -280,8 +297,8 @@ module BigBlueButton end def self.composite_cut(output, cut, layout, videoinfo) - stop_ts = cut[:next_timestamp] - cut[:timestamp] - BigBlueButton.logger.info " Cut start time #{cut[:timestamp]}, duration #{stop_ts}" + duration = cut[:next_timestamp] - cut[:timestamp] + BigBlueButton.logger.info " Cut start time #{cut[:timestamp]}, duration #{duration}" ffmpeg_inputs = [] ffmpeg_filter = "color=c=white:s=#{layout[:width]}x#{layout[:height]}:r=24" @@ -379,7 +396,7 @@ module BigBlueButton ffmpeg_inputs.each do |input| ffmpeg_cmd += ['-ss', ms_to_s(input[:seek]), '-itsoffset', ms_to_s(input[:seek]), '-i', input[:filename]] end - ffmpeg_cmd += ['-to', ms_to_s(stop_ts), '-filter_complex', ffmpeg_filter, *FFMPEG_WF_ARGS, '-'] + ffmpeg_cmd += ['-t', ms_to_s(duration), '-filter_complex', ffmpeg_filter, *FFMPEG_WF_ARGS, '-'] File.open(output, 'a') do |outio| exitstatus = BigBlueButton.exec_redirect_ret(outio, *ffmpeg_cmd) diff --git a/record-and-playback/core/lib/recordandplayback/generators/audio.rb b/record-and-playback/core/lib/recordandplayback/generators/audio.rb index f11385e0dc..0b066bc819 100755 --- a/record-and-playback/core/lib/recordandplayback/generators/audio.rb +++ b/record-and-playback/core/lib/recordandplayback/generators/audio.rb @@ -155,6 +155,10 @@ module BigBlueButton if not audio_event.matched determine_start_stop_timestamps_for_unmatched_event!(audio_event) end + + if audio_event.audio_length.nil? + audio_event.audio_length = determine_length_of_audio_from_file(audio_event.file) + end end if audio_events.length > 0 @@ -171,7 +175,30 @@ module BigBlueButton audio_paddings = generate_audio_paddings(unique_events, events_xml) unique_events.concat(audio_paddings) - return unique_events.sort! {|a,b| a.start_event_timestamp.to_i <=> b.start_event_timestamp.to_i} + unique_events.sort! {|a,b| a.start_event_timestamp.to_i <=> b.start_event_timestamp.to_i} + + #Slice audio events list + record_events = BigBlueButton::Events.match_start_and_stop_rec_events( + BigBlueButton::Events.get_start_and_stop_rec_events(events_xml)) + + BigBlueButton.logger.debug ("Audio Events") + unique_events.each do |evt| + BigBlueButton.logger.info (evt) + end + + BigBlueButton.logger.debug ("Record Events") + record_events.each do |evt| + BigBlueButton.logger.debug ("[start_event = #{evt[:start_timestamp]}, stop_event = #{evt[:stop_timestamp]}]") + end + + sliced_audio_events = slice_audio_events(unique_events, record_events) + + BigBlueButton.logger.debug ("Sliced Events") + sliced_audio_events.each do |evt| + BigBlueButton.logger.debug (evt) + end + + return sliced_audio_events else first_event = BigBlueButton::Events.first_event_timestamp(events_xml).to_i last_event = BigBlueButton::Events.last_event_timestamp(events_xml).to_i @@ -223,7 +250,7 @@ module BigBlueButton :audio => nil } - return audio_edl + return BigBlueButton::Events.edl_match_recording_marks_audio(audio_edl, archive_dir) end @@ -325,18 +352,27 @@ module BigBlueButton end # Trim audio file - def self.trim_audio_file(file, length) - audio_length = determine_length_of_audio_from_file(file) + def self.trim_audio_file(input_file, output_file, start_in_millis, length_in_millis) + audio_length = determine_length_of_audio_from_file(input_file) if (audio_length == 0) - BigBlueButton.logger.error("Can't trim #{file} as it's length is zero\n") + BigBlueButton.logger.error("Can't trim #{input_file}: file lenght is zero\n") + return + elsif (start_in_millis + length_in_millis > audio_length) + BigBlueButton.logger.error("Can't trim #{input_file}: file length exceeded\n") return else - temp_wav_file = "#{file}.temp.wav" - command = "sox #{file} #{temp_wav_file} trim 0 #{audio_length - length}" - BigBlueButton.logger.info("Task: Trimming audio") + temp_wav_file = output_file.sub(/(.+)\.wav/, '\1-temp.wav') + start_in_seconds = start_in_millis.to_f/1000 + length_in_seconds = length_in_millis.to_f/1000 + + command = "sox #{input_file} #{temp_wav_file} trim #{start_in_seconds} #{length_in_seconds}" + BigBlueButton.logger.info("Task: Trimming audio: start = #{start_in_seconds}s, duration = #{length_in_seconds}s") BigBlueButton.execute(command) - File.delete(file) - File.rename(temp_wav_file, file) + + if(output_file.eql?(input_file)) + File.delete(input_file) + end + File.rename(temp_wav_file, output_file) end end @@ -352,7 +388,7 @@ module BigBlueButton # recording. This prevents us from generating a veeeerrryyy looonnngggg silence maxing disk space. if (length_of_gap < 3600000) if (length_of_gap < 0) - trim_audio_file(events[0].file, length_of_gap.abs) + trim_audio_file(events[0].file, events[0].file, 0, events[0].audio_length - length_of_gap.abs) else paddings << create_gap_audio_event(length_of_gap, BigBlueButton::Events.first_event_timestamp(events_xml), events[0].start_event_timestamp.to_i - 1) end @@ -372,7 +408,7 @@ module BigBlueButton # recording. This prevents us from generating a veeeerrryyy looonnngggg silence maxing disk space. if (length_of_gap < 3600000) if (length_of_gap < 0) - trim_audio_file(ar_prev.file, length_of_gap.abs) + trim_audio_file(ar_prev.file, ar_prev.file, 0, ar_prev.audio_length - length_of_gap.abs) else paddings << create_gap_audio_event(length_of_gap, ar_prev.stop_event_timestamp.to_i + 1, ar_next.start_event_timestamp.to_i - 1) end @@ -389,7 +425,7 @@ module BigBlueButton # recording. This prevents us from generating a veeeerrryyy looonnngggg silence maxing disk space. if (length_of_gap < 7200000) if (length_of_gap < 0) - trim_audio_file(events[-1].file, length_of_gap.abs) + trim_audio_file(events[-1].file, events[-1].file, 0, events[-1].audio_length - length_of_gap.abs) else paddings << create_gap_audio_event(length_of_gap, events[-1].stop_event_timestamp.to_i + 1, BigBlueButton::Events.last_event_timestamp(events_xml)) end @@ -401,16 +437,15 @@ module BigBlueButton # Check if the silence is greater that 10 minutes long. If it is, assume something went wrong with the # recording. This prevents us from generating a veeeerrryyy looonnngggg silence maxing disk space. -# -# DO NOT pad the end of the recording for now. Running issues when audio file is longer than the last event timestamp. -# length_of_gap = BigBlueButton::Events.last_event_timestamp(events_xml).to_i - events[-1].stop_event_timestamp.to_i -# if ((length_of_gap > 0) and (length_of_gap < 600000)) -# paddings << create_gap_audio_event(length_of_gap, events[-1].stop_event_timestamp.to_i + 1, BigBlueButton::Events.last_event_timestamp(events_xml)) -# else -# BigBlueButton.logger.error("Length of silence is too long #{length_of_gap}.\n") -# raise Exception, "Length of silence is too long #{length_of_gap}." -# end - + # + # DO NOT pad the end of the recording for now. Running issues when audio file is longer than the last event timestamp. + #length_of_gap = BigBlueButton::Events.last_event_timestamp(events_xml).to_i - events[-1].stop_event_timestamp.to_i + #if ((length_of_gap > 0) and (length_of_gap < 600000)) + # paddings << create_gap_audio_event(length_of_gap, events[-1].stop_event_timestamp.to_i + 1, BigBlueButton::Events.last_event_timestamp(events_xml)) + #else + # BigBlueButton.logger.error("Length of silence is too long #{length_of_gap}.\n") + # raise Exception, "Length of silence is too long #{length_of_gap}." + #end paddings end @@ -422,6 +457,55 @@ module BigBlueButton end File.exist?(recording_event.file) end + + # + # Slice the audio events according to recording events + # + def self.slice_audio_events(audio_events, rec_events) + BigBlueButton.logger.info("Task: Slicing audio events") + sliced_events = [] + rec_events.each do |re| + audio_events.each do |ae| + # Deep copy using serialization. Review this later. + ae_copy = Marshal.load(Marshal.dump(ae)) + ae_copy.offset = 0 + + # Start recording mark cuts the audio event + if (re[:start_timestamp] > ae.start_event_timestamp.to_i and re[:start_timestamp] < ae.stop_event_timestamp.to_i) + ae_copy.offset = re[:start_timestamp] - ae_copy.start_event_timestamp.to_i + if ae_copy.padding + ae_copy.length_of_gap -= ae_copy.offset + else + ae_copy.audio_length -= ae_copy.offset + end + ae_copy.start_event_timestamp = re[:start_timestamp].to_s + ae_copy.trimmed = true + end + + # Stop recording mark cuts the audio event + if (re[:stop_timestamp] > ae.start_event_timestamp.to_i and re[:stop_timestamp] < ae.stop_event_timestamp.to_i) + if ae_copy.padding + ae_copy.length_of_gap -= ae_copy.stop_event_timestamp.to_i - re[:stop_timestamp] + else + ae_copy.audio_length -= ae_copy.stop_event_timestamp.to_i - re[:stop_timestamp] + end + ae_copy.stop_event_timestamp = re[:stop_timestamp].to_s + ae_copy.trimmed = true + end + + if (ae_copy.trimmed) + sliced_events << ae_copy + end + + # Audio event is between start/stop recording marks + if (re[:start_timestamp] <= ae.start_event_timestamp.to_i and re[:stop_timestamp] >= ae.stop_event_timestamp.to_i) + sliced_events << ae_copy + end + end + end + return sliced_events + end + end class AudioRecordingEvent @@ -435,7 +519,13 @@ module BigBlueButton attr_accessor :matched # True if the event has matching start/stop events attr_accessor :audio_length attr_accessor :padding, :length_of_gap # If this is padding and the length of it + attr_accessor :trimmed # True if audio file must be trimmed to match the event + attr_accessor :offset # Offset used when trimming the audio file + #def to_s + # "[start_event=#{start_event_timestamp}, stop_event=#{stop_event_timestamp}, padding=#{padding}]" + #end + def to_s "[startEvent=#{start_event_timestamp}, startRecord=#{start_record_timestamp}, stopRecord=#{stop_record_timestamp}, stopEvent=#{stop_event_timestamp}, " + "brige=#{bridge}, file=#{file}, exist=#{file_exist}, padding=#{padding}]\n" @@ -446,6 +536,5 @@ module BigBlueButton (file == other.file) and (bridge == other.bridge) end - end end diff --git a/record-and-playback/core/lib/recordandplayback/generators/events.rb b/record-and-playback/core/lib/recordandplayback/generators/events.rb index 4d26b9ae1d..c56317c4e1 100755 --- a/record-and-playback/core/lib/recordandplayback/generators/events.rb +++ b/record-and-playback/core/lib/recordandplayback/generators/events.rb @@ -269,14 +269,179 @@ module BigBlueButton return deskshare_edl end - def self.linkify( text ) - generic_URL_regexp = Regexp.new( '(^|[\n ])([\w]+?://[\w]+[^ \"\n\r\t<]*)', Regexp::MULTILINE | Regexp::IGNORECASE ) - starts_with_www_regexp = Regexp.new( '(^|[\n ])((www)\.[^ \"\t\n\r<]*)', Regexp::MULTILINE | Regexp::IGNORECASE ) - - s = text.to_s - s.gsub!( generic_URL_regexp, '\1\2' ) - s.gsub!( starts_with_www_regexp, '\1\2' ) - s - end + def self.edl_match_recording_marks_audio(edl, archive_dir) + calculate_entry_files_timestamp = Proc.new do |edl_entry, offset| + edl_entry[:audio][:timestamp] += offset if edl_entry[:audio] + end + + empty_entry = { + :timestamp => nil, + :audio => nil + } + + return edl_match_recording_marks(edl, archive_dir, calculate_entry_files_timestamp, empty_entry) + end + + def self.edl_match_recording_marks_video(edl, archive_dir) + calculate_entry_files_timestamp = Proc.new do |edl_entry, offset| + if edl_entry[:areas][:webcam] + edl_entry[:areas][:webcam].each do |webcam_entry| + webcam_entry[:timestamp] += offset + end + end + if edl_entry[:areas][:deskshare] + edl_entry[:areas][:deskshare].each do |deskshare_entry| + deskshare_entry[:timestamp] += offset + end + end + end + + empty_entry = { + :timestamp => nil, + :areas => { :webcam => [], :deskshare => [] } + } + + return edl_match_recording_marks(edl, archive_dir, calculate_entry_files_timestamp, empty_entry) + end + + def self.edl_match_recording_marks_deskshare(edl, archive_dir) + calculate_entry_files_timestamp = Proc.new do |edl_entry, offset| + edl_entry[:areas][:deskshare].each do |webcam_entry| + webcam_entry[:timestamp] += offset + end + end + + empty_entry = { + :timestamp => nil, + :areas => { :deskshare => [] } + } + + return edl_match_recording_marks(edl, archive_dir, calculate_entry_files_timestamp, empty_entry) + end + + def self.edl_match_recording_marks(edl, archive_dir, calculate_entry_files_timestamp, empty_entry) + events = Nokogiri::XML(File.open("#{archive_dir}/events.xml")) + event = events.at_xpath('/recording/event[position()=1]') + initial_timestamp = event['timestamp'].to_i + + start_stop_events = BigBlueButton::Events.match_start_and_stop_rec_events(BigBlueButton::Events.get_start_and_stop_rec_events("#{archive_dir}/events.xml")) + # translated the timestamps to the recording timestamp + start_stop_events.each do |record_event| + record_event[:start_timestamp] -= initial_timestamp + record_event[:stop_timestamp] -= initial_timestamp + end + BigBlueButton.logger.debug "start_stop_events:\n#{BigBlueButton.hash_to_str(start_stop_events)}" + + # add duration to EDL + edl.each_with_index do |edl_entry, i| + if i == edl.length-1 + edl_entry[:duration] = 0 + else + edl_entry[:duration] = edl[i+1][:timestamp] - edl_entry[:timestamp] + end + # the original_duration is used to calculate the speed of the output file + edl_entry[:original_duration] = edl_entry[:duration] + end + + BigBlueButton.logger.debug "edl with duration:\n#{BigBlueButton.hash_to_str(edl)}" + + edl_postprocessed = [] + start_stop_events.each do |record_event| + edl.each do |edl_entry| + edl_copy = Marshal.load(Marshal.dump(edl_entry)) + + edl_start = edl_entry[:timestamp] + edl_stop = edl_entry[:timestamp] + edl_entry[:duration] + rec_start = record_event[:start_timestamp] + rec_stop = record_event[:stop_timestamp] + + # edl doesn't match with the recording marks + if (edl_start < rec_start and edl_stop < rec_start) or (edl_start > rec_stop and edl_stop > rec_stop) + next + end + + # adjust the beginning timestamp + if edl_start < rec_start + edl_copy[:timestamp] = rec_start + edl_copy[:duration] -= rec_start - edl_start + calculate_entry_files_timestamp.call(edl_copy, rec_start - edl_start) + # edl_copy[:audio][:timestamp] = rec_start - edl_start + end + + # adjust the duration + if edl_stop > rec_stop + edl_copy[:duration] -= edl_stop - rec_stop + end + + edl_postprocessed << edl_copy + end + end + + # trim the intervals + next_timestamp = 0 + edl_postprocessed.each do |edl_entry| + edl_entry[:timestamp] = next_timestamp + next_timestamp += edl_entry[:duration] + end + empty_entry[:timestamp] = next_timestamp + edl_postprocessed << empty_entry +# edl_postprocessed << { +# :timestamp => next_timestamp, +# media_symbol => nil +# } + BigBlueButton.logger.debug "edl_postprocessed:\n#{BigBlueButton.hash_to_str(edl_postprocessed)}" + return edl_postprocessed + end + + def self.linkify( text ) + generic_URL_regexp = Regexp.new( '(^|[\n ])([\w]+?://[\w]+[^ \"\n\r\t<]*)', Regexp::MULTILINE | Regexp::IGNORECASE ) + starts_with_www_regexp = Regexp.new( '(^|[\n ])((www)\.[^ \"\t\n\r<]*)', Regexp::MULTILINE | Regexp::IGNORECASE ) + + s = text.to_s + s.gsub!( generic_URL_regexp, '\1\2' ) + s.gsub!( starts_with_www_regexp, '\1\2' ) + s + end + + def self.get_record_status_events(events_xml) + BigBlueButton.logger.info "Getting record status events" + doc = Nokogiri::XML(File.open(events_xml)) + rec_events = [] + doc.xpath("//event[@eventname='RecordStatusEvent']").each do |event| + s = { :timestamp => event['timestamp'].to_i } + rec_events << s + end + rec_events.sort_by {|a| a[:timestamp]} + end + + # Get events when the moderator wants the recording to start or stop + def self.get_start_and_stop_rec_events(events_xml) + BigBlueButton.logger.info "Getting start and stop rec button events" + rec_events = BigBlueButton::Events.get_record_status_events(events_xml) + if rec_events.empty? + # old recording generated in a version without the record button + rec_events << { :timestamp => BigBlueButton::Events.first_event_timestamp(events_xml) } + end + if rec_events.size.odd? + # user did not click on the record button to stop the recording + rec_events << { :timestamp => BigBlueButton::Events.last_event_timestamp(events_xml) } + end + rec_events.sort_by {|a| a[:timestamp]} + end + + # Match recording start and stop events + def self.match_start_and_stop_rec_events(rec_events) + BigBlueButton.logger.info ("Matching record events") + matched_rec_events = [] + rec_events.each_with_index do |evt,i| + if i.even? + matched_rec_events << { + :start_timestamp => evt[:timestamp], + :stop_timestamp => rec_events[i + 1][:timestamp] + } + end + end + matched_rec_events + end end end diff --git a/record-and-playback/core/lib/recordandplayback/generators/video.rb b/record-and-playback/core/lib/recordandplayback/generators/video.rb index 036e7ed87b..ec429479c2 100755 --- a/record-and-playback/core/lib/recordandplayback/generators/video.rb +++ b/record-and-playback/core/lib/recordandplayback/generators/video.rb @@ -498,7 +498,8 @@ module BigBlueButton "#{temp_dir}/#{meeting_id}") deskshare_edl = BigBlueButton::Events.create_deskshare_edl( "#{temp_dir}/#{meeting_id}") - video_edl = BigBlueButton::EDL::Video.merge(webcam_edl, deskshare_edl) + temporary_video_edl = BigBlueButton::EDL::Video.merge(webcam_edl, deskshare_edl) + video_edl = BigBlueButton::Events.edl_match_recording_marks_video(temporary_video_edl, "#{temp_dir}/#{meeting_id}") BigBlueButton::EDL::Video.dump(video_edl) layout = { diff --git a/record-and-playback/core/scripts/archive/archive.rb b/record-and-playback/core/scripts/archive/archive.rb index 2a8bb2ec56..8e059d1b1c 100755 --- a/record-and-playback/core/scripts/archive/archive.rb +++ b/record-and-playback/core/scripts/archive/archive.rb @@ -81,6 +81,19 @@ def archive_presentation(meeting_id, presentation_dir, raw_archive_dir) end end +def archive_has_recording_marks?(meeting_id, raw_archive_dir) + BigBlueButton.logger.info("Fetching the recording marks for #{meeting_id}.") + has_recording_marks = true + begin + record_events = BigBlueButton::Events.get_record_status_events("#{raw_archive_dir}/#{meeting_id}/events.xml") + BigBlueButton.logger.info("record_events:\n#{BigBlueButton.hash_to_str(record_events)}") + has_recording_marks = (not record_events.empty?) + rescue => e + BigBlueButton.logger.warn("Failed to fetch the recording marks for #{meeting_id}. " + e.to_s) + end + has_recording_marks +end + ################## START ################################ @@ -109,13 +122,22 @@ target_dir = "#{raw_archive_dir}/#{meeting_id}" if not FileTest.directory?(target_dir) FileUtils.mkdir_p target_dir archive_events(meeting_id, redis_host, redis_port, raw_archive_dir) - archive_audio(meeting_id, audio_dir, raw_archive_dir) - archive_presentation(meeting_id, presentation_dir, raw_archive_dir) - archive_deskshare(meeting_id, deskshare_dir, raw_archive_dir) - archive_video(meeting_id, video_dir, raw_archive_dir) - archive_done = File.new("#{recording_dir}/status/archived/#{meeting_id}.done", "w") - archive_done.write("Archived #{meeting_id}") - archive_done.close + # we will abort the archiving if there's no marks to start and stop the recording + if not archive_has_recording_marks?(meeting_id, raw_archive_dir) + BigBlueButton.logger.info("There's no recording marks for #{meeting_id}, aborting the archive process") + BigBlueButton.logger.info("Removing events.xml") + FileUtils.rm_r target_dir + BigBlueButton.logger.info("Removing the recorded flag") + FileUtils.rm("#{recording_dir}/status/recorded/#{meeting_id}.done") + else + archive_audio(meeting_id, audio_dir, raw_archive_dir) + archive_presentation(meeting_id, presentation_dir, raw_archive_dir) + archive_deskshare(meeting_id, deskshare_dir, raw_archive_dir) + archive_video(meeting_id, video_dir, raw_archive_dir) + archive_done = File.new("#{recording_dir}/status/archived/#{meeting_id}.done", "w") + archive_done.write("Archived #{meeting_id}") + archive_done.close + end #else # BigBlueButton.logger.debug("Skipping #{meeting_id} as it has already been archived.") end diff --git a/record-and-playback/core/scripts/bigbluebutton.yml b/record-and-playback/core/scripts/bigbluebutton.yml index 6b9eec70f5..1881997586 100755 --- a/record-and-playback/core/scripts/bigbluebutton.yml +++ b/record-and-playback/core/scripts/bigbluebutton.yml @@ -7,5 +7,5 @@ raw_deskshare_src: /var/bigbluebutton/deskshare raw_presentation_src: /var/bigbluebutton redis_host: 127.0.0.1 redis_port: 6379 -playback_host: 192.168.0.166 +playback_host: 10.0.3.203 diff --git a/record-and-playback/core/scripts/sanity/sanity.rb b/record-and-playback/core/scripts/sanity/sanity.rb index 0b125b45ae..71e0c847f6 100755 --- a/record-and-playback/core/scripts/sanity/sanity.rb +++ b/record-and-playback/core/scripts/sanity/sanity.rb @@ -41,10 +41,10 @@ def check_audio_files(raw_dir,meeting_id) audioname = fs_audio_file.content.split("/").last raw_audio_file = "#{raw_dir}/#{meeting_id}/audio/#{audioname}" #checking that the audio file exists in raw directory - raise Exception, "Audio file doesn't exists in raw directory." if not File.exists?(raw_audio_file) + raise Exception, "Audio file #{raw_audio_file} doesn't exist in raw directory." if not File.exists?(raw_audio_file) #checking length - raise Exception, "Audio file length is zero." if BigBlueButton::AudioEvents.determine_length_of_audio_from_file(raw_audio_file) <= 0 + raise Exception, "Audio file #{raw_audio_file} length is zero." if BigBlueButton::AudioEvents.determine_length_of_audio_from_file(raw_audio_file) <= 0 } end diff --git a/record-and-playback/presentation/playback/presentation/lib/writing.js b/record-and-playback/presentation/playback/presentation/lib/writing.js index 596cab85de..029c2e187b 100755 --- a/record-and-playback/presentation/playback/presentation/lib/writing.js +++ b/record-and-playback/presentation/playback/presentation/lib/writing.js @@ -144,9 +144,22 @@ function runPopcorn() { }); var images = shapeelements[0].getElementsByTagName("image"); + + //create a map from timestamp to id list + var timestampToId = {}; + for (var j = 0; j < array.length; j++) { + shapeTime = array[j].getAttribute("timestamp"); + shapeId = array[j].getAttribute("id"); + + if (timestampToId[shapeTime] == undefined) { + timestampToId[shapeTime] = new Array(0); + } + timestampToId[shapeTime].push(shapeId); + } + //fill the times array with the times of the svg images. for (var j = 0; j < array.length; j++) { - times[j] = array[j].getAttribute("id").substr(4); + times[j] = array[j].getAttribute("timestamp"); } var times_length = times.length; //get the length of the times array. @@ -222,19 +235,38 @@ function runPopcorn() { svgobj.style.top = "8px"; var next_shape; var shape; - for (var i = 0, len = times_length; i < len-1; i++) { //iterate through all the shapes and pick out the main ones - var time = times[i]; - shape = svgobj.contentDocument.getElementById("draw" + time).getAttribute("shape"); - next_shape = svgobj.contentDocument.getElementById("draw" + times[i+1]).getAttribute("shape"); + for (var j = 0; j < array.length - 1; j++) { //iterate through all the shapes and pick out the main ones + var time = array[j].getAttribute("timestamp"); + shape = array[j].getAttribute("shape"); + next_shape = array[j+1].getAttribute("shape"); if(shape !== next_shape) { - main_shapes_times[main_shapes_times.length] = time; + main_shapes_ids.push(array[j].getAttribute("id")); } } - if(times.length !== 0) { - main_shapes_times[main_shapes_times.length] = times[times.length-1]; //put last value into this array always! + if (array.length !== 0) { + main_shapes_ids.push(array[array.length-1].getAttribute("id")); //put last value into this array always! } - + + var get_shapes_in_time = function(t) { + var shapes_in_time = timestampToId[t]; + var shapes = []; + if (shapes_in_time != undefined) { + var shape = null; + for (var i = 0; i < shapes_in_time.length; i++) { + var id = shapes_in_time[i]; + if(svgobj.contentDocument) shape = svgobj.contentDocument.getElementById(id); + else shape = svgobj.getSVGDocument('svgfile').getElementById(id); + + if (shape !== null) { //if there is actually a new shape to be displayed + shape = shape.getAttribute("shape"); //get actual shape tag for this specific time of playback + shapes.push(shape); + } + } + } + return shapes; + } + var p = new Popcorn("#video"); //update 60x / second the position of the next value. p.code({ @@ -243,42 +275,46 @@ function runPopcorn() { onFrame: function(options) { if(!((p.paused() === true) && (p.seeking() === false))) { var t = p.currentTime().toFixed(1); //get the time and round to 1 decimal place - - if(svgobj.contentDocument) current_shape = svgobj.contentDocument.getElementById("draw" + t); - else current_shape = svgobj.getSVGDocument('svgfile').getElementById("draw" + t); - if(current_shape !== null) { //if there is actually a new shape to be displayed - current_shape = current_shape.getAttribute("shape"); //get actual shape tag for this specific time of playback - } + current_shapes = get_shapes_in_time(t); + //redraw everything (only way to make everything elegant) - for (var i = 0, len = times_length; i < len; i++) { - var time_s = times[i]; + for (var i = 0; i < array.length; i++) { + var time_s = array[i].getAttribute("timestamp"); var time_f = parseFloat(time_s); - if(svgobj.contentDocument) shape = svgobj.contentDocument.getElementById("draw" + time_s); - else shape = svgobj.getSVGDocument('svgfile').getElementById("draw" + time_s); + if(svgobj.contentDocument) shape = svgobj.contentDocument.getElementById(array[i].getAttribute("id")); + else shape = svgobj.getSVGDocument('svgfile').getElementById(array[i].getAttribute("id")); var shape_i = shape.getAttribute("shape"); if (time_f < t) { - if(shape_i === current_shape) { //currently drawing the same shape so don't draw the older steps + if(current_shapes.indexOf(shape_i) > -1) { //currently drawing the same shape so don't draw the older steps shape.style.visibility = "hidden"; //hide older steps to shape - } - else if(main_shapes_times.indexOf(time_s) !== -1) { //as long as it is a main shape, it can be drawn... no intermediate steps. + } else if(main_shapes_ids.indexOf(shape.getAttribute("id")) > -1) { //as long as it is a main shape, it can be drawn... no intermediate steps. if(parseFloat(shape.getAttribute("undo")) === -1) { //As long as the undo event hasn't happened yet... shape.style.visibility = "visible"; - } - else if (parseFloat(shape.getAttribute("undo")) > t) { + } else if (parseFloat(shape.getAttribute("undo")) > t) { shape.style.visibility = "visible"; - } - else { + } else { shape.style.visibility = "hidden"; } } - } - else if(time_s === t) { //for the shape with the time specific to the current time - shape.style.visibility = "visible"; - } - else { //for shapes that shouldn't be drawn yet (larger time than current time), don't draw them. + } else if(time_s === t) { //for the shapes with the time specific to the current time + // only makes visible the last drawing of a given shape + var idx = current_shapes.indexOf(shape_i); + if (idx > -1) { + current_shapes.splice(idx, 1); + idx = current_shapes.indexOf(shape_i); + if (idx > -1) { + shape.style.visibility = "hidden"; + } else { + shape.style.visibility = "visible"; + } + } else { + // this is an inconsistent state, since current_shapes should have at least one drawing of this shape + shape.style.visibility = "hidden"; + } + } else { //for shapes that shouldn't be drawn yet (larger time than current time), don't draw them. shape.style.visibility = "hidden"; } } @@ -395,14 +431,17 @@ var svgfile; //current time var t; var len; -var current_shape; +var current_shapes = []; //coordinates for x and y for each second var panAndZoomTimes = []; var viewBoxes = []; var coords = []; var times = []; +// timestamp and id for drawings +var shapeTime; +var shapeId; var clearTimes = []; -var main_shapes_times = []; +var main_shapes_ids = []; var vboxValues = {}; var cursorValues = {}; var imageAtTime = {}; diff --git a/record-and-playback/presentation/playback/presentation/playback.js b/record-and-playback/presentation/playback/presentation/playback.js index 3d9f29224f..e101c78927 100755 --- a/record-and-playback/presentation/playback/presentation/playback.js +++ b/record-and-playback/presentation/playback/presentation/playback.js @@ -78,6 +78,7 @@ secondsToYouTubeFormat = function(secs) { if (hours > 0) {time += hours+"h";} if (minutes > 0) {time += minutes+"m";} if (seconds > 0) {time += seconds+"s";} + if (secs == 0) {time = "0s";} return time; } @@ -258,7 +259,6 @@ generateThumbnails = function() { hiddenDesc.attr("id", img.attr("id") + "description"); hiddenDesc.attr("class", "visually-hidden"); hiddenDesc.html("Slide " + ++slideCount + " " + secondsToHHMMSSText(timeIn)); - // a wrapper around the img and label var div = $(document.createElement('div')); @@ -269,6 +269,11 @@ generateThumbnails = function() { div.append(label); div.append(hiddenDesc); + if (parseFloat(timeIn) == 0 ) { + div.addClass("active"); + $(".thumbnail-label", div).show(); + } + imagesList.push(timeIn); elementsMap[timeIn] = div; @@ -341,13 +346,21 @@ load_audio = function() { var webmsource = document.createElement("source"); webmsource.setAttribute('src', RECORDINGS + '/audio/audio.webm'); webmsource.setAttribute('type', 'audio/webm; codecs="vorbis"'); - audio.appendChild(webmsource); // Need to keep the ogg source around for compat with old recordings var oggsource = document.createElement("source"); oggsource.setAttribute('src', RECORDINGS + '/audio/audio.ogg'); oggsource.setAttribute('type', 'audio/ogg; codecs="vorbis"'); - audio.appendChild(oggsource); + + // Browser Bug Workaround: The ogg file should be preferred in Firefox, + // since it can't seek in audio-only webm files. + if (navigator.userAgent.indexOf("Firefox") != -1) { + audio.appendChild(oggsource); + audio.appendChild(webmsource); + } else { + audio.appendChild(webmsource); + audio.appendChild(oggsource); + } audio.setAttribute('data-timeline-sources', SLIDES_XML); //audio.setAttribute('controls',''); diff --git a/record-and-playback/presentation/scripts/process/presentation.rb b/record-and-playback/presentation/scripts/process/presentation.rb index a930133ae0..cc2c7e1f09 100755 --- a/record-and-playback/presentation/scripts/process/presentation.rb +++ b/record-and-playback/presentation/scripts/process/presentation.rb @@ -1,5 +1,3 @@ -#!/usr/bin/ruby1.9.1 - # Set encoding to utf-8 # encoding: UTF-8 @@ -76,21 +74,30 @@ if not FileTest.directory?(target_dir) FileUtils.mkdir_p target_pres_dir FileUtils.mkdir_p "#{target_pres_dir}/textfiles" - images=Dir.glob("#{pres_dir}/#{pres}.{jpg,png,gif,JPG,PNG,GIF}") - if images.empty? - pres_pdf = "#{pres_dir}/#{pres}.pdf" - if !File.exists?(pres_pdf) - BigBlueButton.logger.info("Falling back to old presentation filename") - pres_pdf = "#{pres_dir}/#{pres}" + images=Dir.glob("#{pres_dir}/#{pres}.{jpg,jpeg,png,gif,JPG,JPEG,PNG,GIF}") + if images.empty? + pres_name = "#{pres_dir}/#{pres}" + if File.exists?("#{pres_name}.pdf") + pres_pdf = "#{pres_name}.pdf" + BigBlueButton.logger.info("Found pdf file for presentation #{pres_pdf}") + elsif File.exists?("#{pres_name}.PDF") + pres_pdf = "#{pres_name}.PDF" + BigBlueButton.logger.info("Found PDF file for presentation #{pres_pdf}") + elsif File.exists?("#{pres_name}") + pres_pdf = pres_name + BigBlueButton.logger.info("Falling back to old presentation filename #{pres_pdf}") + else + pres_pdf = "" + BigBlueButton.logger.warn("Could not find pdf file for presentation #{pres}") end - if !File.exists?(pres_pdf) - BigBlueButton.logger.warning("Could not find pdf file for presentation #{pres}") - end - 1.upto(num_pages) do |page| - BigBlueButton::Presentation.extract_png_page_from_pdf( - page, pres_pdf, "#{target_pres_dir}/slide-#{page}.png", '1600x1200') - if File.exist?("#{pres_dir}/textfiles/slide-#{page}.txt") then - FileUtils.cp("#{pres_dir}/textfiles/slide-#{page}.txt", "#{target_pres_dir}/textfiles") + + if !pres_pdf.empty? + 1.upto(num_pages) do |page| + BigBlueButton::Presentation.extract_png_page_from_pdf( + page, pres_pdf, "#{target_pres_dir}/slide-#{page}.png", '1600x1200') + if File.exist?("#{pres_dir}/textfiles/slide-#{page}.txt") then + FileUtils.cp("#{pres_dir}/textfiles/slide-#{page}.txt", "#{target_pres_dir}/textfiles") + end end end else @@ -99,7 +106,6 @@ if not FileTest.directory?(target_dir) command="convert #{images[0]} -resize 1600x1200 -background white -flatten #{target_pres_dir}/slide-1.png" BigBlueButton.execute(command) end - end if !Dir["#{raw_archive_dir}/video/*"].empty? or (presentation_props['include_deskshare'] and !Dir["#{raw_archive_dir}/deskshare/*"].empty?) diff --git a/record-and-playback/presentation/scripts/publish/presentation.rb b/record-and-playback/presentation/scripts/publish/presentation.rb index e0b4206e1d..2fd2c5f923 100644 --- a/record-and-playback/presentation/scripts/publish/presentation.rb +++ b/record-and-playback/presentation/scripts/publish/presentation.rb @@ -1,5 +1,3 @@ -#!/usr/bin/ruby1.9.1 - # Set encoding to utf-8 # encoding: UTF-8 @@ -49,34 +47,35 @@ def processPanAndZooms y_prev = nil timestamp_orig_prev = nil timestamp_prev = nil - if $panzoom_events.empty? - BigBlueButton.logger.info("No panzoom events; old recording?") - BigBlueButton.logger.info("Synthesizing a panzoom event") - if !$slides_events.empty? - timestamp_orig = $slides_events.first[:timestamp].to_f - # make sure this is scheduled *after* the slide is shown. Dunno if needed. - timestamp_orig += 1000 - timestamp = ((timestamp_orig - $join_time) / 1000).round(1) - $xml.event(:timestamp => timestamp, :orig => timestamp_orig) do - $xml.viewBox "0 0 #{$vbox_width} #{$vbox_height}" - end - timestamp_orig_prev = timestamp_orig - timestamp_prev = timestamp - h_ratio_prev = 100 - w_ratio_prev = 100 - x_prev = 0 - y_prev = 0 - else - BigBlueButton.logger.info("Couldn't find any slides! panzooms will be empty.") - end - else - last_time = $panzoom_events.last[:timestamp].to_f - end + last_time = nil + if $panzoom_events.empty? + BigBlueButton.logger.info("No panzoom events; old recording?") + BigBlueButton.logger.info("Synthesizing a panzoom event") + if !$slides_events.empty? + timestamp_orig = $slides_events.first[:timestamp].to_f + # make sure this is scheduled *after* the slide is shown. Dunno if needed. + timestamp_orig += 1000 + timestamp = ( translateTimestamp(timestamp_orig) / 1000 ).round(1) + $xml.event(:timestamp => timestamp, :orig => timestamp_orig) do + $xml.viewBox "0 0 #{$vbox_width} #{$vbox_height}" + end + timestamp_orig_prev = timestamp_orig + timestamp_prev = timestamp + h_ratio_prev = 100 + w_ratio_prev = 100 + x_prev = 0 + y_prev = 0 + else + BigBlueButton.logger.info("Couldn't find any slides! panzooms will be empty.") + end + else + last_time = $panzoom_events.last[:timestamp].to_f + end $panzoom_events.each do |panZoomEvent| # Get variables timestamp_orig = panZoomEvent[:timestamp].to_f - timestamp = ((timestamp_orig-$join_time)/1000).round(1) + timestamp = ( translateTimestamp(timestamp_orig) / 1000 ).round(1) h_ratio = panZoomEvent.xpath(".//heightRatio")[0].text() w_ratio = panZoomEvent.xpath(".//widthRatio")[0].text() x = panZoomEvent.xpath(".//xOffset")[0].text() @@ -148,7 +147,7 @@ def processCursorEvents last_time = $cursor_events.last[:timestamp].to_f $cursor_events.each do |cursorEvent| timestamp_orig = cursorEvent[:timestamp].to_f - timestamp = ((timestamp_orig-$join_time)/1000).round(1) + timestamp = ( translateTimestamp(timestamp_orig) / 1000 ).round(1) x = cursorEvent.xpath(".//xOffset")[0].text() y = cursorEvent.xpath(".//yOffset")[0].text() @@ -186,7 +185,9 @@ end def processClearEvents # process all the cleared pages events. $clear_page_events.each do |clearEvent| - clearTime = ((clearEvent[:timestamp].to_f - $join_time)/1000).round(1) + #Retrieve time, page and presentation. + clearTime = clearEvent[:timestamp].to_f + #clearTime = ( clearEvent[:timestamp].to_f / 1000 ).round(1) $pageCleared = clearEvent.xpath(".//pageNumber")[0].text() slideFolder = clearEvent.xpath(".//presentation")[0].text() #$clearPageTimes[clearTime] = [$pageCleared, $canvas_number, "presentation/#{slideFolder}/slide-#{$pageCleared.to_i+1}.png", nil] @@ -239,13 +240,13 @@ def processUndoEvents end end if(closest_shape != nil) - $undos[closest_shape] = ((undo[:timestamp].to_f - $join_time)/1000).round(1) + $undos[closest_shape] = undo[:timestamp] end end $undos_temp = {} $undos.each do |un, val| - $undos_temp[((un[:timestamp].to_f - $join_time)/1000).round(1)] = val + $undos_temp[ un[:timestamp] ] = val end $undos = $undos_temp BigBlueButton.logger.info("Undos: #{$undos}") @@ -266,7 +267,8 @@ end def storePencilShape $pencil_count = $pencil_count + 1 # always update the line count! - $xml.g(:class => :shape, :id=>"draw#{$shapeCreationTime}", :undo => $shapeUndoTime, :shape =>"line#{$pencil_count}", :style => "stroke:\##{$colour_hex}; stroke-width:#{$shapeThickness}; visibility:hidden; stroke-linecap: round; ") do + $global_shape_count += 1 + $xml.g(:class => :shape, :id=>"draw#{$global_shape_count}", :timestamp => $shapeCreationTime, :undo => $shapeUndoTime, :shape =>"line#{$pencil_count}", :style => "stroke:\##{$colour_hex}; stroke-width:#{$shapeThickness}; visibility:hidden; stroke-linecap: round; ") do for i in (0...($shapeDataPoints.length/2)-1) do $xml.line(:x1 => (($shapeDataPoints[i*2].to_f)/100)*$vbox_width, :y1 => (($shapeDataPoints[(i*2)+1].to_f)/100)*$vbox_height, :x2 => (($shapeDataPoints[(i*2)+2].to_f)/100)*$vbox_width, :y2 => (($shapeDataPoints[(i*2)+3].to_f)/100)*$vbox_height) end @@ -274,200 +276,312 @@ def storePencilShape end def storeLineShape - if($shapeCreationTime != $prev_time) - if(($originalOriginX == (($shapeDataPoints[0].to_f)/100)*$vbox_width) && ($originalOriginY == (($shapeDataPoints[1].to_f)/100)*$vbox_height)) - # do not update the line count - else - $line_count = $line_count + 1 - end - $xml.g(:class => :shape, :id => "draw#{$shapeCreationTime}", :undo => $shapeUndoTime, :shape => "line#{$line_count}", :style => "stroke:\##{$colour_hex}; stroke-width:#{$shapeThickness}; visibility:hidden; fill:none") do + if(($originalOriginX == (($shapeDataPoints[0].to_f)/100)*$vbox_width) && ($originalOriginY == (($shapeDataPoints[1].to_f)/100)*$vbox_height)) + # do not update the line count + else + $line_count = $line_count + 1 + end + $global_shape_count += 1 + $xml.g(:class => :shape, :id => "draw#{$global_shape_count}", :timestamp => $shapeCreationTime, :undo => $shapeUndoTime, :shape => "line#{$line_count}", :style => "stroke:\##{$colour_hex}; stroke-width:#{$shapeThickness}; visibility:hidden; fill:none") do - $originX = (($shapeDataPoints[0].to_f)/100)*$vbox_width - $originY = (($shapeDataPoints[1].to_f)/100)*$vbox_height - endPointX = (($shapeDataPoints[2].to_f)/100)*$vbox_width - endPointY = (($shapeDataPoints[3].to_f)/100)*$vbox_height + $originX = (($shapeDataPoints[0].to_f)/100)*$vbox_width + $originY = (($shapeDataPoints[1].to_f)/100)*$vbox_height + endPointX = (($shapeDataPoints[2].to_f)/100)*$vbox_width + endPointY = (($shapeDataPoints[3].to_f)/100)*$vbox_height - $originalOriginX = $originX - $originalOriginY = $originY + $originalOriginX = $originX + $originalOriginY = $originY - $xml.line(:x1 => $originX, :y1 => $originY, :x2 => endPointX, :y2 => endPointY ) - $prev_time = $shapeCreationTime - end - end + $xml.line(:x1 => $originX, :y1 => $originY, :x2 => endPointX, :y2 => endPointY ) + $prev_time = $shapeCreationTime + end end def storeRectShape - if($shapeCreationTime != $prev_time) - if(($originalOriginX == (($shapeDataPoints[0].to_f)/100)*$vbox_width) && ($originalOriginY == (($shapeDataPoints[1].to_f)/100)*$vbox_height)) - # do not update the rectangle count - else - $rectangle_count = $rectangle_count + 1 - end - $xml.g(:class => :shape, :id => "draw#{$shapeCreationTime}", :undo => $shapeUndoTime, :shape => "rect#{$rectangle_count}", :style => "stroke:\##{$colour_hex}; stroke-width:#{$shapeThickness}; visibility:hidden; fill:none") do - $originX = (($shapeDataPoints[0].to_f)/100)*$vbox_width - $originY = (($shapeDataPoints[1].to_f)/100)*$vbox_height - $originalOriginX = $originX - $originalOriginY = $originY - rectWidth = (($shapeDataPoints[2].to_f - $shapeDataPoints[0].to_f)/100)*$vbox_width - rectHeight = (($shapeDataPoints[3].to_f - $shapeDataPoints[1].to_f)/100)*$vbox_height + if(($originalOriginX == (($shapeDataPoints[0].to_f)/100)*$vbox_width) && ($originalOriginY == (($shapeDataPoints[1].to_f)/100)*$vbox_height)) + # do not update the rectangle count + else + $rectangle_count = $rectangle_count + 1 + end + $global_shape_count += 1 + $xml.g(:class => :shape, :id => "draw#{$global_shape_count}", :timestamp => $shapeCreationTime, :undo => $shapeUndoTime, :shape => "rect#{$rectangle_count}", :style => "stroke:\##{$colour_hex}; stroke-width:#{$shapeThickness}; visibility:hidden; fill:none") do + $originX = (($shapeDataPoints[0].to_f)/100)*$vbox_width + $originY = (($shapeDataPoints[1].to_f)/100)*$vbox_height + $originalOriginX = $originX + $originalOriginY = $originY + rectWidth = (($shapeDataPoints[2].to_f - $shapeDataPoints[0].to_f)/100)*$vbox_width + rectHeight = (($shapeDataPoints[3].to_f - $shapeDataPoints[1].to_f)/100)*$vbox_height - # Cannot have a negative height or width so we adjust - if(rectHeight < 0) - $originY = $originY + rectHeight - rectHeight = rectHeight.abs - end - if(rectWidth < 0) - $originX = $originX + rectWidth - rectWidth = rectWidth.abs - end - if $is_square == "true" - #width of the square as reference - $xml.rect(:x => $originX, :y => $originY, :width => rectWidth, :height => rectWidth) - else - $xml.rect(:x => $originX, :y => $originY, :width => rectWidth, :height => rectHeight) - end - $prev_time = $shapeCreationTime + # Cannot have a negative height or width so we adjust + if(rectHeight < 0) + $originY = $originY + rectHeight + rectHeight = rectHeight.abs end + if(rectWidth < 0) + $originX = $originX + rectWidth + rectWidth = rectWidth.abs + end + if $is_square == "true" + #width of the square as reference + $xml.rect(:x => $originX, :y => $originY, :width => rectWidth, :height => rectWidth) + else + $xml.rect(:x => $originX, :y => $originY, :width => rectWidth, :height => rectHeight) + end + $prev_time = $shapeCreationTime end end def storeTriangleShape - if($shapeCreationTime != $prev_time) - if(($originalOriginX == (($shapeDataPoints[0].to_f)/100)*$vbox_width) && ($originalOriginY == (($shapeDataPoints[1].to_f)/100)*$vbox_height)) - # do not update the triangle count - else - $triangle_count = $triangle_count + 1 - end - $xml.g(:class => :shape, :id => "draw#{$shapeCreationTime}", :undo => $shapeUndoTime, :shape => "triangle#{$triangle_count}", :style => "stroke:\##{$colour_hex}; stroke-width:#{$shapeThickness}; visibility:hidden; fill:none") do + if(($originalOriginX == (($shapeDataPoints[0].to_f)/100)*$vbox_width) && ($originalOriginY == (($shapeDataPoints[1].to_f)/100)*$vbox_height)) + # do not update the triangle count + else + $triangle_count = $triangle_count + 1 + end + $global_shape_count += 1 + $xml.g(:class => :shape, :id => "draw#{$global_shape_count}", :timestamp => $shapeCreationTime, :undo => $shapeUndoTime, :shape => "triangle#{$triangle_count}", :style => "stroke:\##{$colour_hex}; stroke-width:#{$shapeThickness}; visibility:hidden; fill:none") do - $originX = (($shapeDataPoints[0].to_f)/100)*$vbox_width - $originY = (($shapeDataPoints[1].to_f)/100)*$vbox_height + $originX = (($shapeDataPoints[0].to_f)/100)*$vbox_width + $originY = (($shapeDataPoints[1].to_f)/100)*$vbox_height - #3 points (p0, p1 and p2) to draw a triangle + #3 points (p0, p1 and p2) to draw a triangle - base = (($shapeDataPoints[2].to_f - $shapeDataPoints[0].to_f)/100)*$vbox_width + base = (($shapeDataPoints[2].to_f - $shapeDataPoints[0].to_f)/100)*$vbox_width - x0 = $originX + (base.to_f / 2.0) - x1 = $originX - x2 = $originX + base.to_f + x0 = $originX + (base.to_f / 2.0) + x1 = $originX + x2 = $originX + base.to_f - height = (($shapeDataPoints[3].to_f - $shapeDataPoints[1].to_f)/100)*$vbox_height + height = (($shapeDataPoints[3].to_f - $shapeDataPoints[1].to_f)/100)*$vbox_height - y0 = $originY - y1 = $originY + height - y2 = y1 + y0 = $originY + y1 = $originY + height + y2 = y1 - p0 = "#{x0},#{y0}" - p1 = "#{x1},#{y1}" - p2 = "#{x2},#{y2}" + p0 = "#{x0},#{y0}" + p1 = "#{x1},#{y1}" + p2 = "#{x2},#{y2}" - $originalOriginX = $originX - $originalOriginY = $originY + $originalOriginX = $originX + $originalOriginY = $originY - $xml.polyline(:points => "#{p0} #{p1} #{p2} #{p0}") - $prev_time = $shapeCreationTime - end - end + $xml.polyline(:points => "#{p0} #{p1} #{p2} #{p0}") + $prev_time = $shapeCreationTime + end end def storeEllipseShape - if($shapeCreationTime != $prev_time) - if(($originalOriginX == (($shapeDataPoints[0].to_f)/100)*$vbox_width) && ($originalOriginY == (($shapeDataPoints[1].to_f)/100)*$vbox_height)) - # do not update the rectangle count - else - $ellipse_count = $ellipse_count + 1 - end # end (($originalOriginX == (($shapeDataPoints[0].to_f)/100)*$vbox_width) && ($originalOriginY == (($shapeDataPoints[1].to_f)/100)*$vbox_height)) - $xml.g(:class => :shape, :id => "draw#{$shapeCreationTime}", :undo => $shapeUndoTime, :shape => "ellipse#{$ellipse_count}", :style =>"stroke:\##{$colour_hex}; stroke-width:#{$shapeThickness}; visibility:hidden; fill:none") do - $originX = (($shapeDataPoints[0].to_f)/100)*$vbox_width - $originY = (($shapeDataPoints[1].to_f)/100)*$vbox_height - $originalOriginX = $originX - $originalOriginY = $originY - ellipseWidth = (($shapeDataPoints[2].to_f - $shapeDataPoints[0].to_f)/100)*$vbox_width - ellipseHeight = (($shapeDataPoints[3].to_f - $shapeDataPoints[1].to_f)/100)*$vbox_height - if(ellipseHeight < 0) - $originY = $originY + ellipseHeight - ellipseHeight = ellipseHeight.abs - end - if(ellipseWidth < 0) - $originX = $originX + ellipseWidth - ellipseWidth = ellipseWidth.abs - end - if $is_circle == "true" - #Use width as reference - $xml.circle(:cx => $originX+(ellipseWidth/2), :cy => $originY+(ellipseWidth/2), :r => ellipseWidth/2) - else - $xml.ellipse(:cx => $originX+(ellipseWidth/2), :cy => $originY+(ellipseHeight/2), :rx => ellipseWidth/2, :ry => ellipseHeight/2) - end - $prev_time = $shapeCreationTime - end # end xml.g - end # end if($shapeCreationTime != $prev_time) -end - -def storeTextShape - if($shapeCreationTime != $prev_time) + if(($originalOriginX == (($shapeDataPoints[0].to_f)/100)*$vbox_width) && ($originalOriginY == (($shapeDataPoints[1].to_f)/100)*$vbox_height)) + # do not update the rectangle count + else + $ellipse_count = $ellipse_count + 1 + end # end (($originalOriginX == (($shapeDataPoints[0].to_f)/100)*$vbox_width) && ($originalOriginY == (($shapeDataPoints[1].to_f)/100)*$vbox_height)) + $global_shape_count += 1 + $xml.g(:class => :shape, :id => "draw#{$global_shape_count}", :timestamp => $shapeCreationTime, :undo => $shapeUndoTime, :shape => "ellipse#{$ellipse_count}", :style =>"stroke:\##{$colour_hex}; stroke-width:#{$shapeThickness}; visibility:hidden; fill:none") do $originX = (($shapeDataPoints[0].to_f)/100)*$vbox_width $originY = (($shapeDataPoints[1].to_f)/100)*$vbox_height - if(($originalOriginX == $originX) && ($originalOriginY == $originY)) - # do not update the text count - else - $text_count = $text_count + 1 + $originalOriginX = $originX + $originalOriginY = $originY + ellipseWidth = (($shapeDataPoints[2].to_f - $shapeDataPoints[0].to_f)/100)*$vbox_width + ellipseHeight = (($shapeDataPoints[3].to_f - $shapeDataPoints[1].to_f)/100)*$vbox_height + if(ellipseHeight < 0) + $originY = $originY + ellipseHeight + ellipseHeight = ellipseHeight.abs end - font_size_factor = 1.7 - width_extra_percent = -0.7 - height_extra_percent = 1 - width = ( ($textBoxWidth.to_f + width_extra_percent) / 100.0) * $vbox_width - height = ( ($textBoxHeight.to_f + height_extra_percent ) / 100.0) * $vbox_height - y_gap = -30.0 - x_gap = 5.0 - $textFontSize_pixels = $textFontSize.to_f * font_size_factor - $xml.g(:class => :shape, :id => "draw#{$shapeCreationTime}", :undo => $shapeUndoTime, :shape => "text#{$text_count}", :style => "word-wrap: break-word; visibility:hidden; font-family: #{$textFontType}; font-size: #{$textFontSize_pixels}px;") do - $xml.switch do - $xml.foreignObject( :color => "##{$colour_hex}", :width => width, :height => height, :x => "#{((($shapeDataPoints[0].to_f)/100)*$vbox_width) + x_gap}", :y => "#{((($shapeDataPoints[1].to_f)/100) *$vbox_height ) + y_gap.to_f }") do - $xml.p( :xmlns => "http://www.w3.org/1999/xhtml" ) do - $xml.text($textValue) - end + if(ellipseWidth < 0) + $originX = $originX + ellipseWidth + ellipseWidth = ellipseWidth.abs + end + if $is_circle == "true" + #Use width as reference + $xml.circle(:cx => $originX+(ellipseWidth/2), :cy => $originY+(ellipseWidth/2), :r => ellipseWidth/2) + else + $xml.ellipse(:cx => $originX+(ellipseWidth/2), :cy => $originY+(ellipseHeight/2), :rx => ellipseWidth/2, :ry => ellipseHeight/2) + end + $prev_time = $shapeCreationTime + end # end xml.g +end + +def storeTextShape + $originX = (($shapeDataPoints[0].to_f)/100)*$vbox_width + $originY = (($shapeDataPoints[1].to_f)/100)*$vbox_height + if(($originalOriginX == $originX) && ($originalOriginY == $originY)) + # do not update the text count + else + $text_count = $text_count + 1 + end + font_size_factor = 1.7 + width_extra_percent = -0.7 + height_extra_percent = 1 + width = ( ($textBoxWidth.to_f + width_extra_percent) / 100.0) * $vbox_width + height = ( ($textBoxHeight.to_f + height_extra_percent ) / 100.0) * $vbox_height + y_gap = -30.0 + x_gap = 5.0 + $textFontSize_pixels = $textFontSize.to_f * font_size_factor + $global_shape_count += 1 + $xml.g(:class => :shape, :id => "draw#{$global_shape_count}", :timestamp => $shapeCreationTime, :undo => $shapeUndoTime, :shape => "text#{$text_count}", :style => "word-wrap: break-word; visibility:hidden; font-family: #{$textFontType}; font-size: #{$textFontSize_pixels}px;") do + $xml.switch do + $xml.foreignObject( :color => "##{$colour_hex}", :width => width, :height => height, :x => "#{((($shapeDataPoints[0].to_f)/100)*$vbox_width) + x_gap}", :y => "#{((($shapeDataPoints[1].to_f)/100) *$vbox_height ) + y_gap.to_f }") do + $xml.p( :xmlns => "http://www.w3.org/1999/xhtml" ) do + $xml.text($textValue) end end - $prev_time = $shapeCreationTime - end # end xml.g - $originalOriginX = $originX - $originalOriginY = $originY - end # end if($shapeCreationTime != $prev_time) + end + $prev_time = $shapeCreationTime + end # end xml.g + $originalOriginX = $originX + $originalOriginY = $originY +end + +# +# Calculate the offsets based on the start and stop recording events, so it's easier +# to translate the timestamps later based on these offsets +# +def calculateRecordEventsOffset + accumulated_duration = 0 + previous_stop_recording = $meeting_start.to_f + $rec_events.each do |event| + event[:offset] = event[:start_timestamp] - accumulated_duration + event[:duration] = event[:stop_timestamp] - event[:start_timestamp] + event[:accumulated_duration] = accumulated_duration + + previous_stop_recording = event[:stop_timestamp] + accumulated_duration += event[:duration] + end +end + +# +# Translated an arbitrary Unix timestamp to the recording timestamp. This is the +# function that others will call +# +def translateTimestamp(timestamp) + new_timestamp = translateTimestamp_helper(timestamp.to_f).to_f +# BigBlueButton.logger.info("Translating #{timestamp}, old value=#{timestamp.to_f-$meeting_start.to_f}, new value=#{new_timestamp}") + new_timestamp +end + +# +# Translated an arbitrary Unix timestamp to the recording timestamp +# +def translateTimestamp_helper(timestamp) + $rec_events.each do |event| + # if the timestamp comes before the start recording event, then the timestamp is translated to the moment it starts recording + if timestamp <= event[:start_timestamp] + return event[:start_timestamp] - event[:offset] + # if the timestamp is during the recording period, it is just translated to the new one using the offset + elsif timestamp > event[:start_timestamp] and timestamp <= event[:stop_timestamp] + return timestamp - event[:offset] + end + end + # if the timestamp comes after the last stop recording event, then the timestamp is translated to the last stop recording event timestamp + return timestamp - $rec_events.last()[:offset] + $rec_events.last()[:duration] +end +# +# Given an event timestamp, says whether it occurs during a recording period or not. +# +def occursDuringRecording(timestamp) + $rec_events.each do |event| + if timestamp >= event[:start_timestamp] and timestamp <= event[:stop_timestamp] + return true + end + end + return false +end + +# +# Calculates the length of a recording +# +def computeRecordingLength() + recordingLength = 0 + $rec_events.each do |event| + recordingLength += event[:stop_timestamp] - event[:start_timestamp] + end + recordingLength +end + +def preprocessSlideEvents + new_slides_events = [] + $slides_events.each do |slide_event| + new_slide_event = slide_event.clone + $rec_events.each do |rec_event| + if new_slide_event[:timestamp] <= rec_event[:start_timestamp] + new_slide_event[:timestamp] = rec_event[:start_timestamp] + if not new_slides_events.empty? and new_slides_events.last()[:timestamp] == rec_event[:start_timestamp] + new_slides_events.pop() + end + new_slides_events << new_slide_event + break + elsif new_slide_event[:timestamp] > rec_event[:start_timestamp] and new_slide_event[:timestamp] <= rec_event[:stop_timestamp] + new_slides_events << new_slide_event + end + end + end + return new_slides_events end def processSlideEvents BigBlueButton.logger.info("Slide events processing") # For each slide (there is only one image per slide) $slides_events.each do |node| + # Ignore slide events that happened after the last recording period. + if(node[:timestamp].to_f > $rec_events.last[:stop_timestamp].to_f) + next + end eventname = node['eventname'] if eventname == "SharePresentationEvent" $presentation_name = node.xpath(".//presentationName")[0].text() else slide_timestamp = node[:timestamp] - slide_start = ((slide_timestamp.to_f - $meeting_start.to_f) / 1000).round(1) + slide_start = ( translateTimestamp(slide_timestamp) / 1000 ).round(1) + orig_slide_start = ( slide_timestamp.to_f / 1000 ).round(1) slide_number = node.xpath(".//slide")[0].text() + slide_number = slide_number.to_i < 0 ? "0" : slide_number slide_src = "presentation/#{$presentation_name}/slide-#{slide_number.to_i + 1}.png" txt_file_path = "presentation/#{$presentation_name}/textfiles/slide-#{slide_number.to_i + 1}.txt" slide_text = File.exist?("#{$process_dir}/#{txt_file_path}") ? txt_file_path : nil image_url = "#{$process_dir}/#{slide_src}" + + if !File.exist?(image_url) + BigBlueButton.logger.warn("Missing image file #{slide_src}!") + # Emergency last-ditch blank image creation + FileUtils.mkdir_p("#{$process_dir}/presentation/#{$presentation_name}") + command = "convert -size 1600x1200 xc:white -quality 90 +dither -depth 8 -colors 256 #{image_url}" + BigBlueButton.execute(command) + end + slide_size = FastImage.size(image_url) current_index = $slides_events.index(node) if(current_index + 1 < $slides_events.length) - slide_end = (( $slides_events[current_index + 1][:timestamp].to_f - $meeting_start.to_f ) / 1000).round(1) + slide_end = ( translateTimestamp($slides_events[current_index + 1][:timestamp]) / 1000 ).round(1) + orig_slide_end = ( $slides_events[current_index + 1][:timestamp].to_f / 1000 ).round(1) else - slide_end = (( $meeting_end.to_f - $meeting_start.to_f ) / 1000).round(1) + slide_end = ( translateTimestamp($meeting_end) / 1000 ).round(1) + orig_slide_end = ( $meeting_end.to_f / 1000 ).round(1) + end + + if slide_start == slide_end + BigBlueButton.logger.info("#{slide_src} is never displayed (slide_start = slide_end), so it won't be included in the svg") + next end BigBlueButton.logger.info("Processing slide image") # Is this a new image or one previously viewed? if($slides_compiled[[slide_src, slide_size[1], slide_size[0]]] == nil) # If it is, add it to the list with all the data. - $slides_compiled[[slide_src, slide_size[1], slide_size[0]]] = [[slide_start], [slide_end], $global_slide_count, slide_text] + $slides_compiled[[slide_src, slide_size[1], slide_size[0]]] = [[slide_start], [slide_end], $global_slide_count, slide_text, [orig_slide_start], [orig_slide_end]] $global_slide_count = $global_slide_count + 1 - elsif + else # If not, append new in and out times to the old entry - $slides_compiled[[slide_src, slide_size[1], slide_size[0]]][0] << slide_start - $slides_compiled[[slide_src, slide_size[1], slide_size[0]]][1] << slide_end + # But if the previous slide_end is equal to the current slide_start, we just pop the previous slide_end and push the current one + # It will avoid the duplication of the thumbnails on the playback + if($slides_compiled[[slide_src, slide_size[1], slide_size[0]]][1].last == slide_start) + $slides_compiled[[slide_src, slide_size[1], slide_size[0]]][1].pop + $slides_compiled[[slide_src, slide_size[1], slide_size[0]]][1] << slide_end + else + $slides_compiled[[slide_src, slide_size[1], slide_size[0]]][0] << slide_start + $slides_compiled[[slide_src, slide_size[1], slide_size[0]]][1] << slide_end + end + $slides_compiled[[slide_src, slide_size[1], slide_size[0]]][4] << orig_slide_start + $slides_compiled[[slide_src, slide_size[1], slide_size[0]]][5] << orig_slide_end end $ss[(slide_start..slide_end)] = slide_size # store the size of the slide at that range of time @@ -486,7 +600,8 @@ def processShapesAndClears processUndoEvents() # Put in the last clear events numbers (previous clear to the end of the slideshow) - endPresentationTime = (($end_time - $join_time)/1000).round(1) + #endPresentationTime = ( $end_time.to_f / 1000 ).round(1) + endPresentationTime = $end_time.to_f $clearPageTimes[($prev_clear_time..endPresentationTime)] = [$pageCleared, $canvas_number, nil, nil] # Put the headers on the svg xml file. @@ -509,26 +624,27 @@ def processShapesAndClears $canvas_number+=1 $xml.g(:class => :canvas, :id => "canvas#{$val[2].to_i}", :image => "image#{$val[2].to_i}", :display => :none) do - BigBlueButton.logger.info("Processing shapes within the image") + BigBlueButton.logger.info("Processing shapes within the image #{$val[2].to_i}") # Select and print the shapes within the current image $shape_events.each do |shape| $shapeTimestamp = shape[:timestamp].to_f - $shapeCreationTime = (($shapeTimestamp-$join_time)/1000).round(1) + $shapeCreationTime = ( translateTimestamp($shapeTimestamp) / 1000 ).round(1) + orig_shapeCreationTime = ( $shapeTimestamp.to_f / 1000 ).round(1) in_this_image = false index = 0 numOfTimes = $val[0].length - # Checks to see if the current shapes are to be drawn in this particular image + # Check if the current shape is to be drawn in this particular image while((in_this_image == false) && (index < numOfTimes)) do - if((($val[0][index].to_f)..($val[1][index].to_f)) === $shapeCreationTime) # is the shape within the certain time of the image + if((($val[4][index].to_f)..($val[5][index].to_f)) === orig_shapeCreationTime) # is the shape within the certain time of the image in_this_image = true end index+=1 end - + if(in_this_image) # Get variables - BigBlueButton.logger.info shape + BigBlueButton.logger.info shape.to_xml(:indent => 2) $shapeType = shape.xpath(".//type")[0].text() $pageNumber = shape.xpath(".//pageNumber")[0].text() $shapeDataPoints = shape.xpath(".//dataPoints")[0].text().split(",") @@ -545,8 +661,8 @@ def processShapesAndClears # figure out undo time BigBlueButton.logger.info("Figuring out undo time") - if($undos.has_key? ((shape[:timestamp].to_f - $join_time)/1000).round(1)) - $shapeUndoTime = $undos[((shape[:timestamp].to_f - $join_time)/1000).round(1)] + if($undos.has_key? ( shape[:timestamp] )) + $shapeUndoTime = ( translateTimestamp( $undos[ shape[:timestamp] ] ) / 1000).round(1) else $shapeUndoTime = -1 end @@ -555,9 +671,9 @@ def processShapesAndClears $clearPageTimes.each do |clearTimeInstance, pageAndCanvasNumbers| $clearTimeInstance = clearTimeInstance $pageAndCanvasNumbers = pageAndCanvasNumbers - if(($clearTimeInstance.last > $shapeCreationTime) && ($pageAndCanvasNumbers[3] == "image#{$val[2].to_i}")) - if((clear_time > $clearTimeInstance.last) || (clear_time == -1)) - clear_time = $clearTimeInstance.last + if(($clearTimeInstance.last > $shapeTimestamp) && ($pageAndCanvasNumbers[3] == "image#{$val[2].to_i}")) + if((clear_time > ( translateTimestamp($clearTimeInstance.last) / 1000 ).round(1)) || (clear_time == -1)) + clear_time = ( translateTimestamp($clearTimeInstance.last) / 1000 ).round(1) end end end @@ -629,7 +745,7 @@ def processShapesAndClears $textBoxHeight = shape.xpath(".//textBoxHeight")[0].text() storeTextShape() end # end if pencil (and other shapes) - end # end if((in_this_image) && (in_this_canvas)) + end # end if(in_this_image) end # end shape_events.each do |shape| end end @@ -644,12 +760,18 @@ def processChatMessages $xml = xml $xml.popcorn { # Process chat events. - $chat_events.each do |node| - chat_timestamp = node[:timestamp] - chat_sender = node.xpath(".//sender")[0].text() - chat_message = BigBlueButton::Events.linkify(node.xpath(".//message")[0].text()) - chat_start = (chat_timestamp.to_i - $meeting_start.to_i) / 1000 - $xml.chattimeline(:in => chat_start, :direction => :down, :name => chat_sender, :message => chat_message.to_s.gsub("event:",""), :target => :chat ) + current_time = 0 + $rec_events.each do |re| + $chat_events.each do |node| + if (node[:timestamp].to_i >= re[:start_timestamp] and node[:timestamp].to_i <= re[:stop_timestamp]) + chat_timestamp = node[:timestamp] + chat_sender = node.xpath(".//sender")[0].text() + chat_message = BigBlueButton::Events.linkify(node.xpath(".//message")[0].text()) + chat_start = ( translateTimestamp(chat_timestamp) / 1000).to_i + $xml.chattimeline(:in => chat_start, :direction => :down, :name => chat_sender, :message => chat_message, :target => :chat ) + end + end + current_time += re[:stop_timestamp] - re[:start_timestamp] end } end @@ -674,6 +796,7 @@ $pencil_count = 0 $line_count = 0 $ellipse_count = 0 $text_count = 0 +$global_shape_count = -1 $global_slide_count = 1 $global_page_count = 0 $canvas_number = 0 @@ -687,6 +810,7 @@ $prev_time = "NaN" $ss = {} $clearPageTimes = {} $slides_compiled = {} +$slides_raw = {} $undos = {} opts = Trollop::options do @@ -728,26 +852,35 @@ if ($playback == "presentation") begin if File.exist?("#{$process_dir}/webcams.webm") - BigBlueButton.logger.info("Making video dir") - video_dir = "#{package_dir}/video" - FileUtils.mkdir_p video_dir - BigBlueButton.logger.info("Made video dir - copying: #{$process_dir}/webcams.webm to -> #{video_dir}") - FileUtils.cp("#{$process_dir}/webcams.webm", video_dir) - BigBlueButton.logger.info("Copied .webm file") + BigBlueButton.logger.info("Making video dir") + video_dir = "#{package_dir}/video" + FileUtils.mkdir_p video_dir + BigBlueButton.logger.info("Made video dir - copying: #{$process_dir}/webcams.webm to -> #{video_dir}") + FileUtils.cp("#{$process_dir}/webcams.webm", video_dir) + BigBlueButton.logger.info("Copied .webm file") else - audio_dir = "#{package_dir}/audio" - BigBlueButton.logger.info("Making audio dir") - FileUtils.mkdir_p audio_dir - BigBlueButton.logger.info("Made audio dir - copying: #{$process_dir}/audio.webm to -> #{audio_dir}") - FileUtils.cp("#{$process_dir}/audio.webm", audio_dir) - BigBlueButton.logger.info("Copied audio.webm file - copying: #{$process_dir}/audio.ogg to -> #{audio_dir}") - FileUtils.cp("#{$process_dir}/audio.ogg", audio_dir) - BigBlueButton.logger.info("Copied audio.ogg file") + audio_dir = "#{package_dir}/audio" + BigBlueButton.logger.info("Making audio dir") + FileUtils.mkdir_p audio_dir + BigBlueButton.logger.info("Made audio dir - copying: #{$process_dir}/audio.webm to -> #{audio_dir}") + FileUtils.cp("#{$process_dir}/audio.webm", audio_dir) + BigBlueButton.logger.info("Copied audio.webm file - copying: #{$process_dir}/audio.ogg to -> #{audio_dir}") + FileUtils.cp("#{$process_dir}/audio.ogg", audio_dir) + BigBlueButton.logger.info("Copied audio.ogg file") end BigBlueButton.logger.info("Copying files to package dir") FileUtils.cp_r("#{$process_dir}/presentation", package_dir) BigBlueButton.logger.info("Copied files to package dir") + + processing_time = File.read("#{$process_dir}/processing_time") + + # Retrieve record events and calculate total recording duration. + $rec_events = BigBlueButton::Events.match_start_and_stop_rec_events( + BigBlueButton::Events.get_start_and_stop_rec_events("#{$process_dir}/events.xml")) + + recording_time = computeRecordingLength() + BigBlueButton.logger.info("Creating metadata.xml") # Create metadata.xml b = Builder::XmlMarkup.new(:indent => 2) @@ -762,6 +895,8 @@ if ($playback == "presentation") b.playback { b.format("presentation") b.link("http://#{playback_host}/playback/presentation/playback.html?meetingId=#{$meeting_id}") + b.processing_time("#{processing_time}") + b.duration("#{recording_time}") } b.meta { BigBlueButton::Events.get_meeting_metadata("#{$process_dir}/events.xml").each { |k,v| b.method_missing(k,v) } @@ -779,13 +914,6 @@ if ($playback == "presentation") $meeting_start = @doc.xpath("//event[@eventname='ParticipantJoinEvent']")[0][:timestamp] $meeting_end = @doc.xpath("//event[@eventname='EndAndKickAllEvent']").last()[:timestamp] - first_presentation_start_node = @doc.xpath("//event[@eventname='SharePresentationEvent']") - first_presentation_start = $meeting_end - if not first_presentation_start_node.empty? - first_presentation_start = first_presentation_start_node[0][:timestamp] - end - $first_slide_start = ((first_presentation_start.to_f - $meeting_start.to_f) / 1000).round(1) - # Gathering all the events from the events.xml $slides_events = @doc.xpath("//event[@eventname='GotoSlideEvent' or @eventname='SharePresentationEvent']") $chat_events = @doc.xpath("//event[@eventname='PublicChatEvent']") @@ -796,7 +924,16 @@ if ($playback == "presentation") $undo_events = @doc.xpath("//event[@eventname='UndoShapeEvent']") # for undoing shapes. $join_time = @doc.xpath("//event[@eventname='ParticipantJoinEvent']")[0][:timestamp].to_f $end_time = @doc.xpath("//event[@eventname='EndAndKickAllEvent']")[0][:timestamp].to_f - + + calculateRecordEventsOffset() + + first_presentation_start_node = @doc.xpath("//event[@eventname='SharePresentationEvent']") + first_presentation_start = $meeting_end + if not first_presentation_start_node.empty? + first_presentation_start = first_presentation_start_node[0][:timestamp] + end + $first_slide_start = ( translateTimestamp(first_presentation_start) / 1000 ).round(1) + processChatMessages() processShapesAndClears()