Merge branch 'v2.6.x-release' of github.com:bigbluebutton/bigbluebutton into develop
This commit is contained in:
commit
7286853f4a
@ -113,11 +113,11 @@ case class EjectUserFromBreakoutInternalMsg(parentId: String, breakoutId: String
|
||||
case class CapturePresentationReqInternalMsg(userId: String, parentMeetingId: String, allPages: Boolean = true) extends InMessage
|
||||
|
||||
/**
|
||||
* Sent by parent meeting to breakout room to import shared notes.
|
||||
* @param parentMeetingId
|
||||
* Sent by breakout room to parent meeting to obtain padId
|
||||
* @param breakoutId
|
||||
* @param meetingName
|
||||
*/
|
||||
case class CaptureSharedNotesReqInternalMsg(parentMeetingId: String, meetingName: String) extends InMessage
|
||||
case class CaptureSharedNotesReqInternalMsg(breakoutId: String, meetingName: String) extends InMessage
|
||||
|
||||
// DeskShare
|
||||
case class DeskShareStartedRequest(conferenceName: String, callerId: String, callerIdName: String) extends InMessage
|
||||
|
@ -40,7 +40,9 @@ trait UpdateTranscriptPubMsgHdlr {
|
||||
bus.outGW.send(msgEvent)
|
||||
}
|
||||
|
||||
if (AudioCaptions.isFloor(liveMeeting.audioCaptions, msg.header.userId)) {
|
||||
val isTranscriptionEnabled = !liveMeeting.props.meetingProp.disabledFeatures.contains("liveTranscription")
|
||||
|
||||
if (AudioCaptions.isFloor(liveMeeting.audioCaptions, msg.header.userId) && isTranscriptionEnabled) {
|
||||
val (start, end, text) = AudioCaptions.editTranscript(
|
||||
liveMeeting.audioCaptions,
|
||||
msg.body.transcriptId,
|
||||
|
@ -12,7 +12,6 @@ trait EndBreakoutRoomInternalMsgHdlr extends HandlerHelpers {
|
||||
val eventBus: InternalEventBus
|
||||
|
||||
def handleEndBreakoutRoomInternalMsg(msg: EndBreakoutRoomInternalMsg): Unit = {
|
||||
|
||||
if (liveMeeting.props.breakoutProps.captureSlides) {
|
||||
val captureSlidesEvent = BigBlueButtonEvent(msg.breakoutId, CapturePresentationReqInternalMsg("system", msg.parentId))
|
||||
eventBus.publish(captureSlidesEvent)
|
||||
@ -20,7 +19,7 @@ trait EndBreakoutRoomInternalMsgHdlr extends HandlerHelpers {
|
||||
|
||||
if (liveMeeting.props.breakoutProps.captureNotes) {
|
||||
val meetingName: String = liveMeeting.props.meetingProp.name
|
||||
val captureNotesEvent = BigBlueButtonEvent(msg.breakoutId, CaptureSharedNotesReqInternalMsg(msg.parentId, meetingName))
|
||||
val captureNotesEvent = BigBlueButtonEvent(msg.parentId, CaptureSharedNotesReqInternalMsg(msg.breakoutId, meetingName))
|
||||
eventBus.publish(captureNotesEvent)
|
||||
}
|
||||
|
||||
|
@ -151,7 +151,7 @@ trait PresentationWithAnnotationsMsgHdlr extends RightsManagementTrait {
|
||||
log.error(s"No presentation set in meeting ${meetingId}")
|
||||
} else {
|
||||
|
||||
val jobId: String = RandomStringGenerator.randomAlphanumericString(16);
|
||||
val jobId: String = s"${meetingId}-slides" // Used as the temporaryPresentationId upon upload
|
||||
val allPages: Boolean = m.allPages
|
||||
val pageCount = currentPres.get.pages.size
|
||||
|
||||
@ -163,15 +163,7 @@ trait PresentationWithAnnotationsMsgHdlr extends RightsManagementTrait {
|
||||
val pagesRange: List[Int] = if (allPages) (1 to pageCount).toList else List(currentPage.num)
|
||||
|
||||
val presentationUploadToken: String = PresentationPodsApp.generateToken("DEFAULT_PRESENTATION_POD", userId)
|
||||
|
||||
// Set filename, checking if it is already in use
|
||||
val meetingName: String = liveMeeting.props.meetingProp.name
|
||||
val duplicatedCount = presentationPods.flatMap(_.getPresentationsByFilename(meetingName)).size
|
||||
|
||||
val filename = duplicatedCount match {
|
||||
case 0 => meetingName
|
||||
case _ => s"${meetingName}(${duplicatedCount})"
|
||||
}
|
||||
val filename: String = liveMeeting.props.meetingProp.name
|
||||
|
||||
// Informs bbb-web about the token so that when we use it to upload the presentation, it is able to look it up in the list of tokens
|
||||
bus.outGW.send(buildPresentationUploadTokenSysPubMsg(parentMeetingId, userId, presentationUploadToken, filename))
|
||||
@ -191,16 +183,15 @@ trait PresentationWithAnnotationsMsgHdlr extends RightsManagementTrait {
|
||||
|
||||
def handle(m: NewPresAnnFileAvailableMsg, liveMeeting: LiveMeeting, bus: MessageBus): Unit = {
|
||||
log.info("Received NewPresAnnFileAvailableMsg meetingId={} presId={} fileUrl={}", liveMeeting.props.meetingProp.intId, m.body.presId, m.body.fileURI)
|
||||
|
||||
bus.outGW.send(buildBroadcastNewPresAnnFileAvailable(m, liveMeeting))
|
||||
}
|
||||
|
||||
def handle(m: CaptureSharedNotesReqInternalMsg, liveMeeting: LiveMeeting, bus: MessageBus): Unit = {
|
||||
val meetingId = liveMeeting.props.meetingProp.intId
|
||||
val routing = Routing.addMsgToClientRouting(MessageTypes.BROADCAST_TO_MEETING, meetingId, "not-used")
|
||||
val parentMeetingId = liveMeeting.props.meetingProp.intId
|
||||
val routing = Routing.addMsgToClientRouting(MessageTypes.BROADCAST_TO_MEETING, parentMeetingId, "not-used")
|
||||
val envelope = BbbCoreEnvelope(PresentationPageConversionStartedEventMsg.NAME, routing)
|
||||
val header = BbbClientMsgHeader(CaptureSharedNotesReqEvtMsg.NAME, meetingId, "not-used")
|
||||
val body = CaptureSharedNotesReqEvtMsgBody(m.parentMeetingId, m.meetingName)
|
||||
val header = BbbClientMsgHeader(CaptureSharedNotesReqEvtMsg.NAME, parentMeetingId, "not-used")
|
||||
val body = CaptureSharedNotesReqEvtMsgBody(m.breakoutId)
|
||||
val event = CaptureSharedNotesReqEvtMsg(header, body)
|
||||
|
||||
bus.outGW.send(BbbCommonEnvCoreMsg(envelope, event))
|
||||
|
@ -47,6 +47,6 @@ case class PresAnnStatusEvtMsgBody(presId: String, pageNumber: Int, totalPages:
|
||||
|
||||
object CaptureSharedNotesReqEvtMsg { val NAME = "CaptureSharedNotesReqEvtMsg" }
|
||||
case class CaptureSharedNotesReqEvtMsg(header: BbbClientMsgHeader, body: CaptureSharedNotesReqEvtMsgBody) extends BbbCoreMsg
|
||||
case class CaptureSharedNotesReqEvtMsgBody(parentMeetingId: String, meetingName: String)
|
||||
case class CaptureSharedNotesReqEvtMsgBody(breakoutId: String)
|
||||
|
||||
// ------------ akka-apps to client ------------
|
||||
|
37
bbb-learning-dashboard/package-lock.json
generated
37
bbb-learning-dashboard/package-lock.json
generated
@ -7400,6 +7400,19 @@
|
||||
"version": "1.0.0",
|
||||
"license": "ISC"
|
||||
},
|
||||
"node_modules/fsevents": {
|
||||
"version": "2.3.2",
|
||||
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
|
||||
"integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
|
||||
"hasInstallScript": true,
|
||||
"optional": true,
|
||||
"os": [
|
||||
"darwin"
|
||||
],
|
||||
"engines": {
|
||||
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/function-bind": {
|
||||
"version": "1.1.1",
|
||||
"license": "MIT"
|
||||
@ -10278,8 +10291,9 @@
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/json5": {
|
||||
"version": "2.2.1",
|
||||
"license": "MIT",
|
||||
"version": "2.2.3",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
|
||||
"integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
|
||||
"bin": {
|
||||
"json5": "lib/cli.js"
|
||||
},
|
||||
@ -14563,8 +14577,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/tsconfig-paths/node_modules/json5": {
|
||||
"version": "1.0.1",
|
||||
"license": "MIT",
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
|
||||
"integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
|
||||
"dependencies": {
|
||||
"minimist": "^1.2.0"
|
||||
},
|
||||
@ -19960,6 +19975,12 @@
|
||||
"fs.realpath": {
|
||||
"version": "1.0.0"
|
||||
},
|
||||
"fsevents": {
|
||||
"version": "2.3.2",
|
||||
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
|
||||
"integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
|
||||
"optional": true
|
||||
},
|
||||
"function-bind": {
|
||||
"version": "1.1.1"
|
||||
},
|
||||
@ -21692,7 +21713,9 @@
|
||||
"version": "1.0.1"
|
||||
},
|
||||
"json5": {
|
||||
"version": "2.2.1"
|
||||
"version": "2.2.3",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
|
||||
"integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="
|
||||
},
|
||||
"jsonfile": {
|
||||
"version": "6.1.0",
|
||||
@ -24130,7 +24153,9 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"json5": {
|
||||
"version": "1.0.1",
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
|
||||
"integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
|
||||
"requires": {
|
||||
"minimist": "^1.2.0"
|
||||
}
|
||||
|
@ -1 +1 @@
|
||||
BIGBLUEBUTTON_RELEASE=2.6.0-beta.5
|
||||
BIGBLUEBUTTON_RELEASE=2.6.0-beta.6
|
||||
|
1
bigbluebutton-html5/.gitignore
vendored
1
bigbluebutton-html5/.gitignore
vendored
@ -4,5 +4,6 @@ node_modules/
|
||||
.meteor/dev_bundle
|
||||
public/locales/de_DE.json
|
||||
public/locales/ja_JP.json
|
||||
public/files
|
||||
|
||||
|
||||
|
@ -94,6 +94,10 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
color: var(--palette-placeholder-text);
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
main {
|
||||
display: initial;
|
||||
}
|
||||
</style>
|
||||
<script>
|
||||
document.addEventListener('gesturestart', function (e) {
|
||||
|
@ -33,6 +33,7 @@ function breakouts() {
|
||||
shortName: 1,
|
||||
timeRemaining: 1,
|
||||
captureNotes: 1,
|
||||
captureSlides: 1,
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -48,7 +48,7 @@ export default function addGroupChatMsg(meetingId, chatId, msg) {
|
||||
const insertedId = GroupChatMsg.insert(msgDocument);
|
||||
|
||||
if (insertedId) {
|
||||
changeHasMessages(true, sender.id, meetingId);
|
||||
changeHasMessages(true, sender.id, meetingId, chatId);
|
||||
Logger.info(`Added group-chat-msg msgId=${msg.id} chatId=${chatId} meetingId=${meetingId}`);
|
||||
}
|
||||
} catch (err) {
|
||||
|
@ -1,6 +1,8 @@
|
||||
import { GroupChatMsg } from '/imports/api/group-chat-msg';
|
||||
import Logger from '/imports/startup/server/logger';
|
||||
import addSystemMsg from '/imports/api/group-chat-msg/server/modifiers/addSystemMsg';
|
||||
import clearChatHasMessages from '/imports/api/users-persistent-data/server/modifiers/clearChatHasMessages';
|
||||
import UsersPersistentData from '/imports/api/users-persistent-data';
|
||||
|
||||
export default function clearGroupChatMsg(meetingId, chatId) {
|
||||
const CHAT_CONFIG = Meteor.settings.public.chat;
|
||||
@ -26,6 +28,17 @@ export default function clearGroupChatMsg(meetingId, chatId) {
|
||||
message: CHAT_CLEAR_MESSAGE,
|
||||
};
|
||||
addSystemMsg(meetingId, PUBLIC_GROUP_CHAT_ID, clearMsg);
|
||||
clearChatHasMessages(meetingId, chatId);
|
||||
|
||||
//clear offline users' data
|
||||
const selector = {
|
||||
meetingId,
|
||||
'shouldPersist.hasConnectionStatus': { $ne: true },
|
||||
'shouldPersist.hasMessages.private': { $ne: true },
|
||||
loggedOut: true
|
||||
};
|
||||
|
||||
UsersPersistentData.remove(selector);
|
||||
}
|
||||
} catch (err) {
|
||||
Logger.error(`Error on clearing GroupChat (${meetingId}, ${chatId}). ${err}`);
|
||||
@ -48,6 +61,8 @@ export default function clearGroupChatMsg(meetingId, chatId) {
|
||||
const numberAffected = GroupChatMsg.remove({ chatId: { $eq: PUBLIC_GROUP_CHAT_ID } });
|
||||
|
||||
if (numberAffected) {
|
||||
clearChatHasMessages(meetingId, chatId=PUBLIC_GROUP_CHAT_ID);
|
||||
|
||||
Logger.info('Cleared GroupChatMsg (all)');
|
||||
}
|
||||
} catch (err) {
|
||||
|
@ -1,14 +1,20 @@
|
||||
import { check } from 'meteor/check';
|
||||
import padCapture from '../methods/padCapture';
|
||||
|
||||
export default function captureSharedNotes({ body }, meetingId) {
|
||||
export default function captureSharedNotes({ header, body }) {
|
||||
check(header, Object);
|
||||
check(body, Object);
|
||||
check(meetingId, String);
|
||||
|
||||
const { parentMeetingId, meetingName } = body;
|
||||
const {
|
||||
meetingId: parentMeetingId,
|
||||
} = header;
|
||||
|
||||
const {
|
||||
breakoutId,
|
||||
} = body;
|
||||
|
||||
check(breakoutId, String);
|
||||
check(parentMeetingId, String);
|
||||
check(meetingName, String);
|
||||
|
||||
padCapture(meetingId, parentMeetingId, meetingName);
|
||||
padCapture(breakoutId, parentMeetingId);
|
||||
}
|
||||
|
@ -1,21 +1,18 @@
|
||||
import { check } from 'meteor/check';
|
||||
import Pads from '/imports/api/pads';
|
||||
import Breakouts from '/imports/api/breakouts';
|
||||
import RedisPubSub from '/imports/startup/server/redis';
|
||||
import Logger from '/imports/startup/server/logger';
|
||||
|
||||
export default function padCapture(meetingId, parentMeetingId, meetingName) {
|
||||
export default function padCapture(breakoutId, parentMeetingId) {
|
||||
const REDIS_CONFIG = Meteor.settings.private.redis;
|
||||
const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
|
||||
const EVENT_NAME = 'PadCapturePubMsg';
|
||||
const EXTERNAL_ID = Meteor.settings.public.notes.id;
|
||||
try {
|
||||
check(meetingId, String);
|
||||
check(parentMeetingId, String);
|
||||
check(meetingName, String);
|
||||
|
||||
try {
|
||||
const pad = Pads.findOne(
|
||||
{
|
||||
meetingId,
|
||||
meetingId: breakoutId,
|
||||
externalId: EXTERNAL_ID,
|
||||
},
|
||||
{
|
||||
@ -25,17 +22,17 @@ export default function padCapture(meetingId, parentMeetingId, meetingName) {
|
||||
},
|
||||
);
|
||||
|
||||
const filename = `${meetingName}-notes`;
|
||||
const payload = {
|
||||
parentMeetingId,
|
||||
breakoutId: meetingId,
|
||||
padId: pad.padId,
|
||||
filename,
|
||||
};
|
||||
const breakout = Breakouts.findOne({ breakoutId });
|
||||
|
||||
Logger.info(`Sending PadCapturePubMsg for meetingId=${meetingId} parentMeetingId=${parentMeetingId} padId=${pad.padId}`);
|
||||
if (pad?.padId && breakout?.shortName) {
|
||||
const payload = {
|
||||
parentMeetingId,
|
||||
breakoutId,
|
||||
padId: pad.padId,
|
||||
filename: `${breakout.shortName}-notes`,
|
||||
};
|
||||
|
||||
if (pad && pad.padId) {
|
||||
Logger.info(`Sending PadCapturePubMsg for meetingId=${breakoutId} parentMeetingId=${parentMeetingId} padId=${pad.padId}`);
|
||||
return RedisPubSub.publishMeetingMessage(CHANNEL, EVENT_NAME, parentMeetingId, payload);
|
||||
}
|
||||
|
||||
|
@ -7,11 +7,10 @@ import AuthTokenValidation, {
|
||||
ValidationStates,
|
||||
} from '/imports/api/auth-token-validation';
|
||||
import { DDPServer } from 'meteor/ddp-server';
|
||||
import { publicationSafeGuard } from '/imports/api/common/server/helpers';
|
||||
|
||||
Meteor.server.setPublicationStrategy('polls', DDPServer.publicationStrategies.NO_MERGE);
|
||||
|
||||
const ROLE_MODERATOR = Meteor.settings.public.user.role_moderator;
|
||||
|
||||
function currentPoll(secretPoll) {
|
||||
check(secretPoll, Boolean);
|
||||
const tokenValidation = AuthTokenValidation.findOne({
|
||||
@ -111,8 +110,22 @@ function polls() {
|
||||
|
||||
if (User) {
|
||||
const poll = Polls.findOne(selector, noKeyOptions);
|
||||
if (User.presenter || poll?.pollType !== 'R-') {
|
||||
// Monitor this publication and stop it when user is not a presenter anymore or poll type has changed
|
||||
const comparisonFunc = () => {
|
||||
const user = Users.findOne({ userId, meetingId }, { fields: { role: 1, userId: 1 } });
|
||||
const currentPoll = Polls.findOne(selector, noKeyOptions);
|
||||
|
||||
if (User.role === ROLE_MODERATOR || poll?.pollType !== 'R-') {
|
||||
const condition = user.presenter || currentPoll?.pollType !== 'R-';
|
||||
|
||||
if (!condition) {
|
||||
Logger.info(`conditions aren't filled anymore in publication ${this._name}:
|
||||
user.presenter || currentPoll?.pollType !== 'R-' :${condition}, user.presenter: ${user.presenter} pollType: ${currentPoll?.pollType}`);
|
||||
}
|
||||
|
||||
return condition;
|
||||
};
|
||||
publicationSafeGuard(comparisonFunc, this);
|
||||
return Polls.find(selector, options);
|
||||
}
|
||||
}
|
||||
|
@ -1,15 +1,20 @@
|
||||
import Logger from '/imports/startup/server/logger';
|
||||
import UsersPersistentData from '/imports/api/users-persistent-data';
|
||||
|
||||
export default function changeHasMessages(hasMessages, userId, meetingId) {
|
||||
const CHAT_CONFIG = Meteor.settings.public.chat;
|
||||
const PUBLIC_GROUP_CHAT_KEY = CHAT_CONFIG.public_group_id;
|
||||
|
||||
export default function changeHasMessages(hasMessages, userId, meetingId, chatId) {
|
||||
const selector = {
|
||||
meetingId,
|
||||
userId,
|
||||
};
|
||||
|
||||
const type = chatId === PUBLIC_GROUP_CHAT_KEY ? 'public' : 'private';
|
||||
|
||||
const modifier = {
|
||||
$set: {
|
||||
'shouldPersist.hasMessages': hasMessages,
|
||||
[`shouldPersist.hasMessages.${type}`]: hasMessages,
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -0,0 +1,29 @@
|
||||
import Logger from '/imports/startup/server/logger';
|
||||
import UsersPersistentData from '/imports/api/users-persistent-data';
|
||||
|
||||
const CHAT_CONFIG = Meteor.settings.public.chat;
|
||||
const PUBLIC_GROUP_CHAT_KEY = CHAT_CONFIG.public_group_id;
|
||||
|
||||
export default function clearChatHasMessages(meetingId, chatId) {
|
||||
const selector = {
|
||||
meetingId,
|
||||
};
|
||||
|
||||
const type = chatId === PUBLIC_GROUP_CHAT_KEY ? 'public' : 'private';
|
||||
|
||||
const modifier = {
|
||||
$set: {
|
||||
[`shouldPersist.hasMessages.${type}`]: false,
|
||||
},
|
||||
};
|
||||
|
||||
try {
|
||||
const numberAffected = UsersPersistentData.update(selector, modifier, { multi: true });
|
||||
|
||||
if (numberAffected) {
|
||||
Logger.info(`Cleared hasMessages meeting=${meetingId}`);
|
||||
}
|
||||
} catch (err) {
|
||||
Logger.error(`Clear hasMessages error: ${err}`);
|
||||
}
|
||||
}
|
@ -3,6 +3,7 @@ import Users from '/imports/api/users';
|
||||
import { extractCredentials } from '/imports/api/common/server/helpers';
|
||||
import ClientConnections from '/imports/startup/server/ClientConnections';
|
||||
import { check } from 'meteor/check';
|
||||
import UsersPersistentData from '/imports/api/users-persistent-data';
|
||||
|
||||
export default function userLeftMeeting() { // TODO-- spread the code to method/modifier/handler
|
||||
try {
|
||||
@ -20,6 +21,7 @@ export default function userLeftMeeting() { // TODO-- spread the code to method/
|
||||
const numberAffected = Users.update(selector, { $set: { loggedOut: true } });
|
||||
|
||||
if (numberAffected) {
|
||||
UsersPersistentData.update(selector, { $set: { loggedOut: true } });
|
||||
Logger.info(`user left id=${requesterUserId} meeting=${meetingId}`);
|
||||
ClientConnections.removeClientConnection(this.userId, this.connection.id);
|
||||
}
|
||||
|
@ -48,7 +48,7 @@ export default function removeUser(body, meetingId) {
|
||||
clearUserInfoForRequester(meetingId, userId);
|
||||
|
||||
const currentUser = UsersPersistentData.findOne({ userId, meetingId });
|
||||
const hasMessages = currentUser?.shouldPersist?.hasMessages;
|
||||
const hasMessages = currentUser?.shouldPersist?.hasMessages?.public || currentUser?.shouldPersist?.hasMessages?.private;
|
||||
const hasConnectionStatus = currentUser?.shouldPersist?.hasConnectionStatus;
|
||||
|
||||
if (!hasMessages && !hasConnectionStatus) {
|
||||
|
@ -64,6 +64,8 @@ const Select = ({
|
||||
locale,
|
||||
voices,
|
||||
}) => {
|
||||
if (!enabled || SpeechService.useFixedLocale()) return null
|
||||
|
||||
if (voices.length === 0) {
|
||||
return (
|
||||
<div
|
||||
@ -77,8 +79,6 @@ const Select = ({
|
||||
);
|
||||
}
|
||||
|
||||
if (!enabled || SpeechService.useFixedLocale()) return null;
|
||||
|
||||
const onChange = (e) => {
|
||||
const { value } = e.target;
|
||||
SpeechService.setSpeechLocale(value);
|
||||
|
@ -7,11 +7,11 @@ import logger from '/imports/startup/client/logger';
|
||||
import Users from '/imports/api/users';
|
||||
import AudioService from '/imports/ui/components/audio/service';
|
||||
import deviceInfo from '/imports/utils/deviceInfo';
|
||||
import { isLiveTranscriptionEnabled } from '/imports/ui/services/features';
|
||||
|
||||
const THROTTLE_TIMEOUT = 1000;
|
||||
|
||||
const CONFIG = Meteor.settings.public.app.audioCaptions;
|
||||
const ENABLED = CONFIG.enabled;
|
||||
const LANGUAGES = CONFIG.language.available;
|
||||
const VALID_ENVIRONMENT = !deviceInfo.isMobile || CONFIG.mobile;
|
||||
|
||||
@ -126,7 +126,7 @@ const hasSpeechLocale = (userId = Auth.userID) => getSpeechLocale(userId) !== ''
|
||||
|
||||
const isLocaleValid = (locale) => LANGUAGES.includes(locale);
|
||||
|
||||
const isEnabled = () => ENABLED;
|
||||
const isEnabled = () => isLiveTranscriptionEnabled();
|
||||
|
||||
const isActive = () => isEnabled() && hasSpeechRecognitionSupport() && hasSpeechLocale();
|
||||
|
||||
|
@ -147,7 +147,7 @@ export default injectNotify(injectIntl(withTracker(({
|
||||
if (fromBreakoutPanel) data.bold = true;
|
||||
} else {
|
||||
clearInterval(timeRemainingInterval);
|
||||
BreakoutService.setCapturedNotesUploading();
|
||||
BreakoutService.setCapturedContentUploading();
|
||||
data.message = intl.formatMessage(timeEndedMessage || intlMessages.breakoutWillClose);
|
||||
}
|
||||
} else if (breakoutRoom) {
|
||||
|
@ -10,7 +10,7 @@ const BREAKOUT_MODAL_DELAY = 200;
|
||||
const propTypes = {
|
||||
mountModal: PropTypes.func.isRequired,
|
||||
lastBreakoutReceived: PropTypes.shape({
|
||||
breakoutUrlData: PropTypes.func.isRequired,
|
||||
breakoutUrlData: PropTypes.object.isRequired,
|
||||
}),
|
||||
breakoutRoomsUserIsIn: PropTypes.shape({
|
||||
sequence: PropTypes.number.isRequired,
|
||||
|
@ -38,35 +38,42 @@ const getBreakoutRoomUrl = (breakoutId) => {
|
||||
return breakoutUrlData;
|
||||
};
|
||||
|
||||
const setCapturedNotesUploading = () => {
|
||||
const upsertCapturedContent = (filename, temporaryPresentationId) => {
|
||||
UploadingPresentations.upsert({
|
||||
temporaryPresentationId,
|
||||
}, {
|
||||
$set: {
|
||||
id: _.uniqueId(filename),
|
||||
temporaryPresentationId,
|
||||
progress: 0,
|
||||
filename,
|
||||
lastModifiedUploader: false,
|
||||
upload: {
|
||||
done: false,
|
||||
error: false,
|
||||
},
|
||||
uploadTimestamp: new Date(),
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
const setCapturedContentUploading = () => {
|
||||
const breakoutRooms = findBreakouts();
|
||||
breakoutRooms.forEach((breakout) => {
|
||||
const filename = breakout.shortName;
|
||||
const temporaryPresentationId = breakout.breakoutId;
|
||||
if (breakout.captureNotes) {
|
||||
const filename = breakout.shortName;
|
||||
const temporaryPresentationId = `${breakout.breakoutId}-notes`;
|
||||
upsertCapturedContent(filename, `${temporaryPresentationId}-notes`);
|
||||
}
|
||||
|
||||
UploadingPresentations.upsert({
|
||||
temporaryPresentationId,
|
||||
}, {
|
||||
$set: {
|
||||
id: _.uniqueId(filename),
|
||||
temporaryPresentationId,
|
||||
progress: 0,
|
||||
filename,
|
||||
lastModifiedUploader: false,
|
||||
upload: {
|
||||
done: false,
|
||||
error: false,
|
||||
},
|
||||
uploadTimestamp: new Date(),
|
||||
},
|
||||
});
|
||||
if (breakout.captureSlides) {
|
||||
upsertCapturedContent(filename, `${temporaryPresentationId}-slides`);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
const endAllBreakouts = () => {
|
||||
setCapturedNotesUploading();
|
||||
setCapturedContentUploading();
|
||||
makeCall('endAllBreakouts');
|
||||
};
|
||||
|
||||
@ -244,5 +251,5 @@ export default {
|
||||
sortUsersByName: UserListService.sortUsersByName,
|
||||
isUserInBreakoutRoom,
|
||||
checkInviteModerators,
|
||||
setCapturedNotesUploading,
|
||||
setCapturedContentUploading,
|
||||
};
|
||||
|
@ -33,6 +33,7 @@ const CaptionsButton = ({ intl, isActive, handleOnClick }) => (
|
||||
size="lg"
|
||||
onClick={handleOnClick}
|
||||
id={isActive ? 'stop-captions-button' : 'start-captions-button'}
|
||||
data-test="startViewingClosedCaptionsBtn"
|
||||
/>
|
||||
);
|
||||
|
||||
|
@ -71,7 +71,7 @@ class LiveCaptions extends PureComponent {
|
||||
|
||||
return (
|
||||
<div>
|
||||
<div style={captionStyles}>
|
||||
<div data-test="liveCaptions" style={captionStyles}>
|
||||
{clear ? '' : data}
|
||||
</div>
|
||||
<div style={visuallyHidden}>
|
||||
|
@ -395,6 +395,7 @@ class ReaderMenu extends PureComponent {
|
||||
label={intl.formatMessage(intlMessages.start)}
|
||||
onClick={() => this.handleStart()}
|
||||
disabled={locale == null}
|
||||
data-test="startViewingClosedCaptions"
|
||||
/>
|
||||
</Styled.Actions>
|
||||
</Styled.Footer>
|
||||
|
@ -140,6 +140,7 @@ class WriterMenu extends PureComponent {
|
||||
aria-describedby="descriptionStart"
|
||||
onClick={this.handleStart}
|
||||
disabled={locale == null}
|
||||
data-test="startWritingClosedCaptions"
|
||||
/>
|
||||
<div id="descriptionStart" hidden>{intl.formatMessage(intlMessages.ariaStartDesc)}</div>
|
||||
</Styled.Content>
|
||||
|
@ -47,6 +47,10 @@ const intlMessages = defineMessages({
|
||||
id: 'app.presentation.downloadLabel',
|
||||
description: 'used as label for presentation download link',
|
||||
},
|
||||
notAccessibleWarning: {
|
||||
id: 'app.presentationUploader.export.notAccessibleWarning',
|
||||
description: 'used for indicating that a link may be not accessible',
|
||||
},
|
||||
});
|
||||
|
||||
const setUserSentMessage = (bool) => {
|
||||
@ -325,8 +329,10 @@ const removePackagedClassAttribute = (classnames, attribute) => {
|
||||
};
|
||||
|
||||
const getExportedPresentationString = (fileURI, filename, intl) => {
|
||||
const label = intl.formatMessage(intlMessages.download);
|
||||
const link = `<a href=${fileURI} type="application/pdf" rel="noopener, noreferrer" download>${label}</a>`;
|
||||
const warningIcon = `<i class="icon-bbb-warning"></i>`;
|
||||
const label = `<span>${intl.formatMessage(intlMessages.download)}</span>`;
|
||||
const notAccessibleWarning = `<span>(${warningIcon} ${intl.formatMessage(intlMessages.notAccessibleWarning)})</span>`;
|
||||
const link = `<a href=${fileURI} type="application/pdf" rel="noopener, noreferrer" download>${label} ${notAccessibleWarning}</a>`;
|
||||
const name = `<span>${filename}</span>`;
|
||||
return `${name}</br>${link}`;
|
||||
};
|
||||
|
@ -0,0 +1,66 @@
|
||||
import React, { createRef, PureComponent } from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import { findDOMNode } from 'react-dom';
|
||||
|
||||
const propTypes = {
|
||||
disabled: PropTypes.bool,
|
||||
checked: PropTypes.bool,
|
||||
onChange: PropTypes.func.isRequired,
|
||||
ariaLabelledBy: PropTypes.string,
|
||||
ariaLabel: PropTypes.string,
|
||||
ariaDescribedBy: PropTypes.string,
|
||||
ariaDesc: PropTypes.string,
|
||||
};
|
||||
|
||||
const defaultProps = {
|
||||
disabled: false,
|
||||
checked: false,
|
||||
ariaLabelledBy: null,
|
||||
ariaLabel: null,
|
||||
ariaDescribedBy: null,
|
||||
ariaDesc: null,
|
||||
};
|
||||
|
||||
export default class Base extends PureComponent {
|
||||
constructor(props) {
|
||||
super(props);
|
||||
|
||||
this.onChange = props.onChange;
|
||||
this.handleChange = this.handleChange.bind(this);
|
||||
this.handleKeyDown = this.handleKeyDown.bind(this);
|
||||
|
||||
this.element = createRef();
|
||||
}
|
||||
|
||||
componentDidMount() {
|
||||
const element = findDOMNode(this.element.current);
|
||||
if (element) element.addEventListener('keydown', this.handleKeyDown);
|
||||
}
|
||||
|
||||
componentWillUnmount() {
|
||||
const element = findDOMNode(this.element.current);
|
||||
if (element) element.removeEventListener('keydown', this.handleKeyDown);
|
||||
}
|
||||
|
||||
handleKeyDown(event) {
|
||||
const { key } = event;
|
||||
const node = findDOMNode(this.element.current);
|
||||
if (key === 'Enter' && node) {
|
||||
const input = node.getElementsByTagName('input')[0];
|
||||
input?.click();
|
||||
}
|
||||
}
|
||||
|
||||
handleChange() {
|
||||
const { disabled, keyValue } = this.props;
|
||||
if (disabled) return;
|
||||
this.onChange(keyValue);
|
||||
}
|
||||
|
||||
render() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
Base.propTypes = propTypes;
|
||||
Base.defaultProps = defaultProps;
|
@ -1,91 +1,38 @@
|
||||
import React, { PureComponent } from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import { findDOMNode } from 'react-dom';
|
||||
import KEY_CODES from '/imports/utils/keyCodes';
|
||||
import React from 'react';
|
||||
import Base from './base';
|
||||
import Styled from './styles';
|
||||
|
||||
const propTypes = {
|
||||
disabled: PropTypes.bool,
|
||||
checked: PropTypes.bool,
|
||||
onChange: PropTypes.func.isRequired,
|
||||
ariaLabelledBy: PropTypes.string,
|
||||
ariaLabel: PropTypes.string,
|
||||
ariaDescribedBy: PropTypes.string,
|
||||
ariaDesc: PropTypes.string,
|
||||
};
|
||||
|
||||
const defaultProps = {
|
||||
disabled: false,
|
||||
checked: false,
|
||||
ariaLabelledBy: null,
|
||||
ariaLabel: null,
|
||||
ariaDescribedBy: null,
|
||||
ariaDesc: null,
|
||||
};
|
||||
|
||||
export default class Checkbox extends PureComponent {
|
||||
constructor(props) {
|
||||
super(props);
|
||||
|
||||
this.onChange = props.onChange;
|
||||
this.handleChange = this.handleChange.bind(this);
|
||||
this.handleKeyDown = this.handleKeyDown.bind(this);
|
||||
}
|
||||
|
||||
componentDidMount() {
|
||||
const checkbox = findDOMNode(this.checkbox);
|
||||
if (checkbox) checkbox.addEventListener('keydown', this.handleKeyDown);
|
||||
}
|
||||
|
||||
componentWillUnmount() {
|
||||
const checkbox = findDOMNode(this.checkbox);
|
||||
if (checkbox) checkbox.removeEventListener('keydown', this.handleKeyDown);
|
||||
}
|
||||
|
||||
handleKeyDown(event) {
|
||||
const { which } = event;
|
||||
const input = findDOMNode(this.input);
|
||||
if ([KEY_CODES.ENTER].includes(which)) {
|
||||
if (input) input.click();
|
||||
}
|
||||
}
|
||||
|
||||
handleChange() {
|
||||
const { disabled, keyValue } = this.props;
|
||||
if (disabled) return;
|
||||
this.onChange(keyValue);
|
||||
}
|
||||
|
||||
export default class Checkbox extends Base {
|
||||
render() {
|
||||
const { ariaLabel, ariaDesc, ariaDescribedBy, checked, disabled } = this.props;
|
||||
const {
|
||||
ariaLabel, ariaDesc, ariaDescribedBy, ariaLabelledBy, checked, disabled, label,
|
||||
} = this.props;
|
||||
|
||||
const checkbox = (
|
||||
<Styled.Checkbox
|
||||
checked={checked}
|
||||
disabled={disabled}
|
||||
focusRipple={true}
|
||||
inputProps={{
|
||||
'aria-label': ariaLabel,
|
||||
'aria-describedby': ariaDescribedBy,
|
||||
'aria-labelledby': ariaLabelledBy,
|
||||
}}
|
||||
onChange={this.handleChange}
|
||||
ref={this.element}
|
||||
/>
|
||||
);
|
||||
|
||||
return (
|
||||
<Styled.CheckboxWrapper
|
||||
disabled={!!disabled}
|
||||
tabIndex={0}
|
||||
ref={(node) => { this.checkbox = node; }}
|
||||
>
|
||||
<Styled.CheckboxInput
|
||||
tabIndex={-1}
|
||||
type="checkbox"
|
||||
onChange={this.handleChange}
|
||||
checked={checked}
|
||||
aria-label={ariaLabel}
|
||||
aria-describedby={ariaDescribedBy}
|
||||
disabled={disabled}
|
||||
ref={(node) => { this.input = node; }}
|
||||
/>
|
||||
<div role="presentation" onClick={this.handleChange}>
|
||||
{ checked
|
||||
? <Styled.CheckboxIconChecked iconName="check" />
|
||||
: <Styled.CheckboxIcon iconName="circle" />
|
||||
}
|
||||
</div>
|
||||
<>
|
||||
{label ? (
|
||||
<Styled.Label
|
||||
label={label}
|
||||
control={checkbox}
|
||||
/>
|
||||
) : checkbox}
|
||||
<div id={ariaDescribedBy} hidden>{ariaDesc}</div>
|
||||
</Styled.CheckboxWrapper>
|
||||
</>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Checkbox.propTypes = propTypes;
|
||||
Checkbox.defaultProps = defaultProps;
|
||||
|
@ -1,43 +1,25 @@
|
||||
import styled from 'styled-components';
|
||||
import { colorGrayLight, colorSuccess } from '/imports/ui/stylesheets/styled-components/palette';
|
||||
import Icon from '/imports/ui/components/common/icon/component';
|
||||
import { colorText, colorSuccess } from '/imports/ui/stylesheets/styled-components/palette';
|
||||
import BaseCheckbox from '@material-ui/core/Checkbox';
|
||||
import FormControlLabel from '@material-ui/core/FormControlLabel';
|
||||
import { withStyles } from '@material-ui/core/styles';
|
||||
|
||||
const CheckboxWrapper = styled.div`
|
||||
opacity: 1;
|
||||
const Checkbox = withStyles({
|
||||
checked: {
|
||||
color: `${colorSuccess} !important`,
|
||||
},
|
||||
})(BaseCheckbox);
|
||||
|
||||
${({ disabled }) => disabled && `
|
||||
& > div i {
|
||||
opacity: .5;
|
||||
cursor: not-allowed;
|
||||
}
|
||||
`}
|
||||
`;
|
||||
|
||||
const CheckboxInput = styled.input`
|
||||
border: 0;
|
||||
clip: rect(0 0 0 0);
|
||||
height: 1px;
|
||||
margin: -1px;
|
||||
overflow: hidden;
|
||||
padding: 0;
|
||||
position: absolute;
|
||||
display: inline-block;
|
||||
width: 1px;
|
||||
`;
|
||||
|
||||
const CheckboxIcon = styled(Icon)`
|
||||
cursor: pointer;
|
||||
font-size: 1.35rem;
|
||||
color: ${colorGrayLight};
|
||||
`;
|
||||
|
||||
const CheckboxIconChecked = styled(CheckboxIcon)`
|
||||
color: ${colorSuccess};
|
||||
`;
|
||||
const Label = withStyles({
|
||||
label: {
|
||||
fontFamily: 'inherit !important',
|
||||
color: `${colorText} !important`,
|
||||
},
|
||||
disabled: {
|
||||
cursor: 'not-allowed !important',
|
||||
},
|
||||
})(FormControlLabel);
|
||||
|
||||
export default {
|
||||
CheckboxWrapper,
|
||||
CheckboxInput,
|
||||
CheckboxIcon,
|
||||
CheckboxIconChecked,
|
||||
Checkbox,
|
||||
Label,
|
||||
};
|
||||
|
@ -1,5 +1,6 @@
|
||||
import React, { PureComponent } from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import { injectIntl } from 'react-intl';
|
||||
|
||||
const DEFAULT_VALUE = 'select';
|
||||
const DEFAULT_KEY = -1;
|
||||
@ -46,7 +47,7 @@ class LocalesDropdown extends PureComponent {
|
||||
|
||||
render() {
|
||||
const {
|
||||
value, handleChange, elementId, selectMessage, ariaLabel,
|
||||
value, handleChange, elementId, selectMessage, ariaLabel, intl,
|
||||
} = this.props;
|
||||
const defaultLocale = value || DEFAULT_VALUE;
|
||||
|
||||
@ -62,11 +63,18 @@ class LocalesDropdown extends PureComponent {
|
||||
<option disabled key={DEFAULT_KEY} value={DEFAULT_VALUE}>
|
||||
{selectMessage}
|
||||
</option>
|
||||
{availableLocales.map((localeItem) => (
|
||||
<option key={localeItem.locale} value={localeItem.locale}>
|
||||
{localeItem.name}
|
||||
</option>
|
||||
))}
|
||||
{availableLocales.map((localeItem) => {
|
||||
const localizedName = localeItem.locale !== value && intl.formatMessage({
|
||||
id: `app.submenu.application.localeDropdown.${localeItem.locale}`,
|
||||
defaultMessage: ``,
|
||||
});
|
||||
|
||||
return (
|
||||
<option key={localeItem.locale} value={localeItem.locale}>
|
||||
{localeItem.name}{localizedName && ` - ${localizedName}`}
|
||||
</option>
|
||||
);
|
||||
})}
|
||||
</select>
|
||||
);
|
||||
}
|
||||
@ -75,4 +83,4 @@ class LocalesDropdown extends PureComponent {
|
||||
LocalesDropdown.propTypes = propTypes;
|
||||
LocalesDropdown.defaultProps = defaultProps;
|
||||
|
||||
export default LocalesDropdown;
|
||||
export default injectIntl(LocalesDropdown);
|
||||
|
@ -0,0 +1,39 @@
|
||||
import React from 'react';
|
||||
import Base from '../checkbox/base';
|
||||
import Styled from './styles';
|
||||
|
||||
export default class Radio extends Base {
|
||||
render() {
|
||||
const {
|
||||
ariaLabel, ariaDesc, ariaDescribedBy, ariaLabelledBy, checked, disabled, label,
|
||||
} = this.props;
|
||||
|
||||
const radio = (
|
||||
<Styled.Radio
|
||||
checked={checked}
|
||||
checkedIcon={<Styled.RadioIconChecked iconName="check" />}
|
||||
icon={<Styled.RadioIcon iconName="circle" />}
|
||||
disabled={disabled}
|
||||
inputProps={{
|
||||
'aria-label': ariaLabel,
|
||||
'aria-describedby': ariaDescribedBy,
|
||||
'aria-labelledby': ariaLabelledBy,
|
||||
}}
|
||||
onChange={this.handleChange}
|
||||
ref={this.element}
|
||||
/>
|
||||
);
|
||||
|
||||
return (
|
||||
<>
|
||||
{label ? (
|
||||
<Styled.Label
|
||||
label={label}
|
||||
control={radio}
|
||||
/>
|
||||
) : radio}
|
||||
<div id={ariaDescribedBy} hidden>{ariaDesc}</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
}
|
@ -0,0 +1,33 @@
|
||||
import styled from 'styled-components';
|
||||
import { colorText, colorSuccess } from '/imports/ui/stylesheets/styled-components/palette';
|
||||
import Icon from '/imports/ui/components/common/icon/component';
|
||||
import BaseRadio from '@material-ui/core/Radio';
|
||||
import FormControlLabel from '@material-ui/core/FormControlLabel';
|
||||
import { withStyles } from '@material-ui/core/styles';
|
||||
|
||||
const Radio = withStyles({
|
||||
checked: {
|
||||
color: `${colorSuccess} !important`,
|
||||
},
|
||||
})(BaseRadio);
|
||||
|
||||
const Label = withStyles({
|
||||
label: {
|
||||
fontFamily: 'inherit !important',
|
||||
color: `${colorText} !important`,
|
||||
},
|
||||
disabled: {
|
||||
cursor: 'not-allowed !important',
|
||||
},
|
||||
})(FormControlLabel);
|
||||
|
||||
const RadioIcon = styled(Icon)``;
|
||||
|
||||
const RadioIconChecked = styled(RadioIcon)``;
|
||||
|
||||
export default {
|
||||
RadioIcon,
|
||||
RadioIconChecked,
|
||||
Radio,
|
||||
Label,
|
||||
};
|
@ -338,7 +338,7 @@ class ConnectionStatusComponent extends PureComponent {
|
||||
if (isConnectionStatusEmpty(connectionStatus)) return this.renderEmpty();
|
||||
|
||||
let connections = connectionStatus;
|
||||
if (selectedTab === 2) {
|
||||
if (selectedTab === 1) {
|
||||
connections = connections.filter(conn => conn.you);
|
||||
if (isConnectionStatusEmpty(connections)) return this.renderEmpty();
|
||||
}
|
||||
|
@ -8,6 +8,7 @@ import {
|
||||
colorGrayLightest,
|
||||
colorPrimary,
|
||||
colorWhite,
|
||||
btnPrimaryActiveBg,
|
||||
} from '/imports/ui/stylesheets/styled-components/palette';
|
||||
import {
|
||||
smPaddingX,
|
||||
@ -427,7 +428,7 @@ const ConnectionTabSelector = styled(Tab)`
|
||||
color: ${colorPrimary};
|
||||
|
||||
span {
|
||||
border-bottom: 2px solid ${colorPrimary};
|
||||
border-bottom: 2px solid ${btnPrimaryActiveBg};
|
||||
}
|
||||
}
|
||||
`;
|
||||
|
@ -1,4 +1,4 @@
|
||||
import React, { Component } from 'react';
|
||||
import React, { Component, createRef } from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import _ from 'lodash';
|
||||
import { defineMessages, injectIntl } from 'react-intl';
|
||||
@ -249,6 +249,8 @@ class Poll extends Component {
|
||||
type: null,
|
||||
};
|
||||
|
||||
this.textarea = createRef();
|
||||
|
||||
this.handleBackClick = this.handleBackClick.bind(this);
|
||||
this.handleAddOption = this.handleAddOption.bind(this);
|
||||
this.handleRemoveOption = this.handleRemoveOption.bind(this);
|
||||
@ -261,11 +263,9 @@ class Poll extends Component {
|
||||
}
|
||||
|
||||
componentDidMount() {
|
||||
const { props } = this.hideBtn;
|
||||
const { className } = props;
|
||||
const hideBtn = document.getElementsByClassName(`${className}`);
|
||||
|
||||
if (hideBtn[0]) hideBtn[0].focus();
|
||||
if (this.textarea.current) {
|
||||
this.textarea.current.focus();
|
||||
}
|
||||
}
|
||||
|
||||
componentDidUpdate() {
|
||||
@ -682,11 +682,12 @@ class Poll extends Component {
|
||||
onChange={this.toggleIsMultipleResponse}
|
||||
checked={isMultipleResponse}
|
||||
ariaLabelledBy="multipleResponseCheckboxLabel"
|
||||
label={intl.formatMessage(intlMessages.enableMultipleResponseLabel)}
|
||||
/>
|
||||
</Styled.PollCheckbox>
|
||||
<Styled.InstructionsLabel id="multipleResponseCheckboxLabel">
|
||||
<div id="multipleResponseCheckboxLabel" hidden>
|
||||
{intl.formatMessage(intlMessages.enableMultipleResponseLabel)}
|
||||
</Styled.InstructionsLabel>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
{defaultPoll && this.renderInputs()}
|
||||
@ -806,6 +807,7 @@ class Poll extends Component {
|
||||
{...{ MAX_INPUT_CHARS }}
|
||||
handlePollValuesText={(e) => this.handlePollValuesText(e)}
|
||||
as={customInput ? DraggableTextArea : 'textarea'}
|
||||
ref={this.textarea}
|
||||
/>
|
||||
{hasQuestionError || hasOptionError ? (
|
||||
<Styled.InputError>{error}</Styled.InputError>
|
||||
@ -998,7 +1000,6 @@ class Poll extends Component {
|
||||
value: PANELS.NONE,
|
||||
});
|
||||
},
|
||||
ref: (node) => { this.hideBtn = node; },
|
||||
}}
|
||||
rightButtonProps={{
|
||||
'aria-label': `${intl.formatMessage(intlMessages.closeLabel)} ${intl.formatMessage(intlMessages.pollPaneTitle)}`,
|
||||
|
@ -175,11 +175,6 @@ const PollCheckbox = styled.div`
|
||||
margin-bottom: ${pollMdMargin};
|
||||
`;
|
||||
|
||||
const InstructionsLabel = styled.label`
|
||||
margin-bottom: ${lgPaddingX};
|
||||
color: ${colorText};
|
||||
`;
|
||||
|
||||
const AddItemButton = styled(Button)`
|
||||
top: 1px;
|
||||
position: relative;
|
||||
@ -387,7 +382,6 @@ export default {
|
||||
PollConfigButton,
|
||||
PollParagraph,
|
||||
PollCheckbox,
|
||||
InstructionsLabel,
|
||||
AddItemButton,
|
||||
Row,
|
||||
Col,
|
||||
|
@ -14,7 +14,7 @@ import _ from 'lodash';
|
||||
import { registerTitleView, unregisterTitleView } from '/imports/utils/dom-utils';
|
||||
import Styled from './styles';
|
||||
import Settings from '/imports/ui/services/settings';
|
||||
import Checkbox from '/imports/ui/components/common/checkbox/component';
|
||||
import Radio from '/imports/ui/components/common/radio/component';
|
||||
|
||||
const { isMobile } = deviceInfo;
|
||||
|
||||
@ -291,6 +291,10 @@ const intlMessages = defineMessages({
|
||||
id: 'app.presentationUploader.exportingTimeout',
|
||||
description: 'exporting timeout label',
|
||||
},
|
||||
linkAvailable: {
|
||||
id: 'app.presentationUploader.export.linkAvailable',
|
||||
description: 'download presentation link available on public chat',
|
||||
},
|
||||
});
|
||||
|
||||
const EXPORT_STATUSES = {
|
||||
@ -686,10 +690,18 @@ class PresentationUploader extends Component {
|
||||
}
|
||||
|
||||
handleSendToChat(item) {
|
||||
const { exportPresentationToChat } = this.props;
|
||||
const {
|
||||
exportPresentationToChat,
|
||||
intl,
|
||||
} = this.props;
|
||||
|
||||
const observer = (exportation) => {
|
||||
const observer = (exportation, stopped) => {
|
||||
this.deepMergeUpdateFileKey(item.id, 'exportation', exportation);
|
||||
|
||||
if (exportation.status === EXPORT_STATUSES.EXPORTED && stopped) {
|
||||
notify(intl.formatMessage(intlMessages.linkAvailable, { 0: item.filename }), 'success');
|
||||
}
|
||||
|
||||
if ([EXPORT_STATUSES.RUNNING,
|
||||
EXPORT_STATUSES.COLLECTING,
|
||||
EXPORT_STATUSES.PROCESSING].includes(exportation.status)) {
|
||||
@ -1013,7 +1025,7 @@ class PresentationUploader extends Component {
|
||||
animations={animations}
|
||||
>
|
||||
<Styled.SetCurrentAction>
|
||||
<Checkbox
|
||||
<Radio
|
||||
animations={animations}
|
||||
ariaLabel={`${intl.formatMessage(intlMessages.setAsCurrentPresentation)} ${item.filename}`}
|
||||
checked={item.isCurrent}
|
||||
|
@ -616,7 +616,6 @@ const SetCurrentAction = styled.td`
|
||||
&, & i {
|
||||
border: 0;
|
||||
background: transparent;
|
||||
color: ${colorGrayLight};
|
||||
cursor: pointer;
|
||||
font-size: 1.35rem;
|
||||
|
||||
|
@ -141,9 +141,11 @@ const SidebarContent = (props) => {
|
||||
{sidebarContentPanel === PANELS.CAPTIONS && <CaptionsContainer />}
|
||||
{sidebarContentPanel === PANELS.BREAKOUT && <BreakoutRoomContainer />}
|
||||
{sidebarContentPanel === PANELS.WAITING_USERS && <WaitingUsersPanel />}
|
||||
<Styled.Poll style={{ minWidth, top: '0', display: pollDisplay }} id="pollPanel">
|
||||
<PollContainer smallSidebar={smallSidebar} amIPresenter={amIPresenter} />
|
||||
</Styled.Poll>
|
||||
{sidebarContentPanel === PANELS.POLL && (
|
||||
<Styled.Poll style={{ minWidth, top: '0', display: pollDisplay }} id="pollPanel">
|
||||
<PollContainer smallSidebar={smallSidebar} amIPresenter={amIPresenter} />
|
||||
</Styled.Poll>
|
||||
)}
|
||||
</Resizable>
|
||||
);
|
||||
};
|
||||
|
@ -44,13 +44,14 @@ const propTypes = {
|
||||
intl: PropTypes.shape({
|
||||
formatMessage: PropTypes.func.isRequired,
|
||||
}).isRequired,
|
||||
tabIndex: PropTypes.number.isRequired,
|
||||
tabIndex: PropTypes.number,
|
||||
isPublicChat: PropTypes.func.isRequired,
|
||||
shortcuts: PropTypes.string,
|
||||
};
|
||||
|
||||
const defaultProps = {
|
||||
shortcuts: '',
|
||||
tabIndex: 0,
|
||||
};
|
||||
|
||||
const ChatListItem = (props) => {
|
||||
@ -151,7 +152,12 @@ const ChatListItem = (props) => {
|
||||
onClick={handleClickToggleChat}
|
||||
id="chat-toggle-button"
|
||||
aria-label={isPublicChat(chat) ? intl.formatMessage(intlMessages.titlePublic) : chat.name}
|
||||
onKeyPress={() => {}}
|
||||
onKeyDown={(e) => {
|
||||
if (e.key === 'Enter') {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
}
|
||||
}}
|
||||
>
|
||||
<Styled.ChatListItemLink>
|
||||
<Styled.ChatIcon>
|
||||
|
@ -562,7 +562,6 @@ const roving = (...args) => {
|
||||
|
||||
if ([KEY_CODES.ESCAPE, KEY_CODES.TAB].includes(event.keyCode)) {
|
||||
Session.set('dropdownOpen', false);
|
||||
document.activeElement.blur();
|
||||
changeState(null);
|
||||
}
|
||||
|
||||
|
@ -53,7 +53,12 @@ const BreakoutRoomItem = ({
|
||||
onClick={toggleBreakoutPanel}
|
||||
data-test="breakoutRoomsItem"
|
||||
aria-label={intl.formatMessage(intlMessages.breakoutTitle)}
|
||||
onKeyPress={() => {}}
|
||||
onKeyDown={(e) => {
|
||||
if (e.key === 'Enter') {
|
||||
e.preventDefault();
|
||||
toggleBreakoutPanel();
|
||||
}
|
||||
}}
|
||||
>
|
||||
<Icon iconName="rooms" />
|
||||
<div aria-hidden>
|
||||
|
@ -82,7 +82,6 @@ class UserMessages extends PureComponent {
|
||||
<ChatListItemContainer
|
||||
compact={compact}
|
||||
chat={chat}
|
||||
tabIndex={-1}
|
||||
/>
|
||||
</Styled.ListTransition>
|
||||
</CSSTransition>
|
||||
@ -121,7 +120,7 @@ class UserMessages extends PureComponent {
|
||||
</Styled.Container>
|
||||
<Styled.ScrollableList
|
||||
role="tabpanel"
|
||||
tabIndex={0}
|
||||
tabIndex={-1}
|
||||
ref={(ref) => { this._msgsList = ref; }}
|
||||
>
|
||||
<Styled.List aria-live="polite">
|
||||
|
@ -107,7 +107,11 @@ class UserNotes extends Component {
|
||||
role="button"
|
||||
tabIndex={0}
|
||||
onClick={() => NotesService.toggleNotesPanel(sidebarContentPanel, layoutContextDispatch)}
|
||||
onKeyPress={() => { }}
|
||||
onKeyDown={(e) => {
|
||||
if (e.key === 'Enter') {
|
||||
NotesService.toggleNotesPanel(sidebarContentPanel, layoutContextDispatch);
|
||||
}
|
||||
}}
|
||||
as={isPinned ? 'button' : 'div'}
|
||||
disabled={isPinned}
|
||||
$disabled={isPinned}
|
||||
|
@ -53,7 +53,7 @@ class UserParticipants extends Component {
|
||||
this.state = {
|
||||
selectedUser: null,
|
||||
isOpen: false,
|
||||
scrollArea: false,
|
||||
scrollArea: null,
|
||||
};
|
||||
|
||||
this.userRefs = [];
|
||||
@ -171,7 +171,7 @@ class UserParticipants extends Component {
|
||||
handleClickSelectedUser(event) {
|
||||
let selectedUser = null;
|
||||
if (event.path) {
|
||||
selectedUser = event.path.find(p => p.className && p.className.includes('participantsList'));
|
||||
selectedUser = event.path.find(p => p.id && p.id.includes('user-'));
|
||||
}
|
||||
this.setState({ selectedUser });
|
||||
}
|
||||
@ -180,6 +180,7 @@ class UserParticipants extends Component {
|
||||
const { roving } = this.props;
|
||||
const { selectedUser, scrollArea } = this.state;
|
||||
const usersItemsRef = findDOMNode(scrollArea.firstChild);
|
||||
event.stopPropagation();
|
||||
roving(event, this.changeState, usersItemsRef, selectedUser);
|
||||
}
|
||||
|
||||
|
@ -828,7 +828,11 @@ class UserListItem extends PureComponent {
|
||||
selected={selected === true}
|
||||
tabIndex={-1}
|
||||
onClick={() => this.setState({ selected: true }, () => Session.set('dropdownOpenUserId', user.userId))}
|
||||
onKeyPress={() => { }}
|
||||
onKeyDown={(e) => {
|
||||
if (e.key === 'Enter') {
|
||||
this.setState({ selected: true }, () => Session.set('dropdownOpenUserId', user.userId));
|
||||
}
|
||||
}}
|
||||
role="button"
|
||||
>
|
||||
{contents}
|
||||
|
@ -308,6 +308,7 @@ class UserOptions extends PureComponent {
|
||||
description: intl.formatMessage(intlMessages.captionsDesc),
|
||||
key: this.captionsId,
|
||||
onClick: this.handleCaptionsClick,
|
||||
dataTest: 'writeClosedCaptions',
|
||||
});
|
||||
}
|
||||
if (amIModerator) {
|
||||
|
@ -1,5 +1,5 @@
|
||||
import React from 'react';
|
||||
import { withTracker } from 'meteor/react-meteor-data';
|
||||
import PropTypes from 'prop-types';
|
||||
import Auth from '/imports/ui/services/auth';
|
||||
import Meetings from '/imports/api/meetings';
|
||||
import ActionsBarService from '/imports/ui/components/actions-bar/service';
|
||||
@ -12,12 +12,6 @@ import { notify } from '/imports/ui/services/notification';
|
||||
import UserOptions from './component';
|
||||
import { layoutSelect } from '/imports/ui/components/layout/context';
|
||||
|
||||
const propTypes = {
|
||||
users: PropTypes.arrayOf(Object).isRequired,
|
||||
clearAllEmojiStatus: PropTypes.func.isRequired,
|
||||
intl: PropTypes.object.isRequired,
|
||||
};
|
||||
|
||||
const intlMessages = defineMessages({
|
||||
clearStatusMessage: {
|
||||
id: 'app.userList.content.participants.options.clearedStatus',
|
||||
@ -32,14 +26,26 @@ const meetingMuteDisabledLog = () => logger.info({
|
||||
extraInfo: { logType: 'moderator_action' },
|
||||
}, 'moderator disabled meeting mute');
|
||||
|
||||
const UserOptionsContainer = withTracker((props) => {
|
||||
const UserOptionsContainer = (props) => {
|
||||
const isRTL = layoutSelect((i) => i.isRTL);
|
||||
return (
|
||||
<UserOptions
|
||||
{...props}
|
||||
{...{
|
||||
isRTL
|
||||
}}
|
||||
/>
|
||||
)
|
||||
};
|
||||
|
||||
export default injectIntl(withTracker((props) => {
|
||||
const {
|
||||
users,
|
||||
clearAllEmojiStatus,
|
||||
intl,
|
||||
isMeetingMuteOnStart,
|
||||
} = props;
|
||||
|
||||
|
||||
const toggleStatus = () => {
|
||||
clearAllEmojiStatus(users);
|
||||
|
||||
@ -54,9 +60,6 @@ const UserOptionsContainer = withTracker((props) => {
|
||||
const { name } = meetingProp;
|
||||
return name;
|
||||
};
|
||||
|
||||
const isRTL = layoutSelect((i) => i.isRTL);
|
||||
|
||||
return {
|
||||
toggleMuteAllUsers: () => {
|
||||
UserListService.muteAllUsers(Auth.userID);
|
||||
@ -88,10 +91,5 @@ const UserOptionsContainer = withTracker((props) => {
|
||||
meetingName: getMeetingName(),
|
||||
openLearningDashboardUrl: LearningDashboardService.openLearningDashboardUrl,
|
||||
dynamicGuestPolicy,
|
||||
isRTL,
|
||||
};
|
||||
})(UserOptions);
|
||||
|
||||
UserOptionsContainer.propTypes = propTypes;
|
||||
|
||||
export default injectIntl(UserOptionsContainer);
|
||||
})(UserOptionsContainer));
|
||||
|
@ -50,7 +50,11 @@ const UserPolls = ({
|
||||
tabIndex={0}
|
||||
data-test="pollMenuButton"
|
||||
onClick={handleClickTogglePoll}
|
||||
onKeyPress={() => {}}
|
||||
onKeyDown={(e) => {
|
||||
if (e.key === 'Enter') {
|
||||
handleClickTogglePoll();
|
||||
}
|
||||
}}
|
||||
>
|
||||
<Icon iconName="polling" />
|
||||
<span>{intl.formatMessage(intlMessages.pollLabel)}</span>
|
||||
|
@ -55,7 +55,11 @@ const WaitingUsers = ({
|
||||
data-test="waitingUsersBtn"
|
||||
tabIndex={0}
|
||||
onClick={toggleWaitingPanel}
|
||||
onKeyPress={() => { }}
|
||||
onKeyDown={(e) => {
|
||||
if (e.key === 'Enter') {
|
||||
toggleWaitingPanel();
|
||||
}
|
||||
}}
|
||||
>
|
||||
<Icon iconName="user" />
|
||||
<span>{intl.formatMessage(intlMessages.title)}</span>
|
||||
|
@ -862,10 +862,8 @@ class VideoPreview extends Component {
|
||||
ariaDescribedBy={'whole-image-desc'}
|
||||
ariaDesc={intl.formatMessage(intlMessages.wholeImageBrightnessDesc)}
|
||||
disabled={!isVirtualBackgroundSupported() || isStartSharingDisabled}
|
||||
label={intl.formatMessage(intlMessages.wholeImageBrightnessLabel)}
|
||||
/>
|
||||
<div aria-hidden style={{ margin: '0 .5rem' }}>
|
||||
{intl.formatMessage(intlMessages.wholeImageBrightnessLabel)}
|
||||
</div>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
|
@ -1,6 +1,6 @@
|
||||
import * as React from "react";
|
||||
import _ from "lodash";
|
||||
import { createGlobalStyle } from "styled-components";
|
||||
import styled, { createGlobalStyle } from "styled-components";
|
||||
import Cursors from "./cursors/container";
|
||||
import { TldrawApp, Tldraw } from "@tldraw/tldraw";
|
||||
import SlideCalcUtil, {HUNDRED_PERCENT} from '/imports/utils/slideCalcUtils';
|
||||
@ -57,14 +57,19 @@ const TldrawGlobalStyle = createGlobalStyle`
|
||||
display: none;
|
||||
}
|
||||
`}
|
||||
${({ hideCursor }) => hideCursor && `
|
||||
#canvas {
|
||||
cursor: none;
|
||||
}
|
||||
`}
|
||||
#TD-PrimaryTools-Image {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#slide-background-shape div {
|
||||
pointer-events: none;
|
||||
}
|
||||
`;
|
||||
|
||||
const EditableWBWrapper = styled.div`
|
||||
&, & > :first-child {
|
||||
cursor: inherit !important;
|
||||
}
|
||||
`;
|
||||
|
||||
export default function Whiteboard(props) {
|
||||
@ -119,6 +124,7 @@ export default function Whiteboard(props) {
|
||||
const prevFitToWidth = usePrevious(fitToWidth);
|
||||
const prevSvgUri = usePrevious(svgUri);
|
||||
const language = mapLanguage(Settings?.application?.locale?.toLowerCase() || 'en');
|
||||
const [currentTool, setCurrentTool] = React.useState(null);
|
||||
|
||||
const calculateZoom = (width, height) => {
|
||||
let zoom = fitToWidth
|
||||
@ -608,36 +614,30 @@ export default function Whiteboard(props) {
|
||||
}
|
||||
}
|
||||
|
||||
if (reason && reason === 'patched_shapes' && e?.session?.type === "edit" && e?.session?.initialShape?.type === "text") {
|
||||
if (reason && reason === 'patched_shapes' && e?.session?.type === 'edit') {
|
||||
const patchedShape = e?.getShape(e?.getPageState()?.editingId);
|
||||
if (!shapes[patchedShape.id]) {
|
||||
|
||||
if (e?.session?.initialShape?.type === 'sticky' && patchedShape?.text?.length > maxStickyNoteLength) {
|
||||
patchedShape.text = patchedShape.text.substring(0, maxStickyNoteLength);
|
||||
}
|
||||
|
||||
if (e?.session?.initialShape?.type === 'text' && !shapes[patchedShape.id]) {
|
||||
patchedShape.userId = currentUser?.userId;
|
||||
persistShape(patchedShape, whiteboardId);
|
||||
} else {
|
||||
const diff = {
|
||||
id: patchedShape.id,
|
||||
point: patchedShape.point,
|
||||
text: patchedShape.text
|
||||
}
|
||||
text: patchedShape.text,
|
||||
};
|
||||
persistShape(diff, whiteboardId);
|
||||
}
|
||||
}
|
||||
|
||||
if (reason && reason === 'patched_shapes') {
|
||||
const patchedShape = e?.getShape(e?.getPageState()?.editingId);
|
||||
if (reason && reason.includes('selected_tool')) {
|
||||
const tool = reason.split(':')[1];
|
||||
|
||||
if (e?.session?.initialShape?.type === "sticky" && patchedShape?.text?.length > maxStickyNoteLength) {
|
||||
patchedShape.text = patchedShape.text.substring(0, maxStickyNoteLength);
|
||||
}
|
||||
|
||||
if (patchedShape) {
|
||||
const diff = {
|
||||
id: patchedShape.id,
|
||||
point: patchedShape.point,
|
||||
text: patchedShape.text
|
||||
}
|
||||
persistShape(diff, whiteboardId);
|
||||
}
|
||||
setCurrentTool(tool);
|
||||
}
|
||||
};
|
||||
|
||||
@ -719,7 +719,7 @@ export default function Whiteboard(props) {
|
||||
const webcams = document.getElementById('cameraDock');
|
||||
const dockPos = webcams?.getAttribute("data-position");
|
||||
const editableWB = (
|
||||
<div onPaste={onPaste}>
|
||||
<EditableWBWrapper onPaste={onPaste}>
|
||||
<Tldraw
|
||||
key={`wb-${isRTL}-${dockPos}-${forcePanning}`}
|
||||
document={doc}
|
||||
@ -741,7 +741,7 @@ export default function Whiteboard(props) {
|
||||
onRedo={onRedo}
|
||||
onCommand={onCommand}
|
||||
/>
|
||||
</div>
|
||||
</EditableWBWrapper>
|
||||
);
|
||||
|
||||
const readOnlyWB = (
|
||||
@ -775,11 +775,11 @@ export default function Whiteboard(props) {
|
||||
isViewersCursorLocked={isViewersCursorLocked}
|
||||
isMultiUserActive={isMultiUserActive}
|
||||
isPanning={isPanning}
|
||||
currentTool={currentTool}
|
||||
>
|
||||
{hasWBAccess || isPresenter ? editableWB : readOnlyWB}
|
||||
<TldrawGlobalStyle
|
||||
hideContextMenu={!hasWBAccess && !isPresenter}
|
||||
hideCursor={!isPanning && (isPresenter || hasWBAccess)}
|
||||
/>
|
||||
</Cursors>
|
||||
</>
|
||||
|
@ -1,4 +1,5 @@
|
||||
import * as React from 'react';
|
||||
import { Meteor } from 'meteor/meteor';
|
||||
|
||||
const XS_OFFSET = 8;
|
||||
const SMALL_OFFSET = 18;
|
||||
@ -6,6 +7,23 @@ const XL_OFFSET = 85;
|
||||
const BOTTOM_CAM_HANDLE_HEIGHT = 10;
|
||||
const PRES_TOOLBAR_HEIGHT = 35;
|
||||
|
||||
const baseName = Meteor.settings.public.app.cdn + Meteor.settings.public.app.basename;
|
||||
const makeCursorUrl = (filename) => `${baseName}/resources/images/whiteboard-cursor/${filename}`;
|
||||
|
||||
const TOOL_CURSORS = {
|
||||
select: 'none',
|
||||
erase: 'none',
|
||||
arrow: 'none',
|
||||
draw: `url('${makeCursorUrl('pencil.png')}') 2 22, default`,
|
||||
rectangle: `url('${makeCursorUrl('square.png')}'), default`,
|
||||
ellipse: `url('${makeCursorUrl('ellipse.png')}'), default`,
|
||||
triangle: `url('${makeCursorUrl('triangle.png')}'), default`,
|
||||
line: `url('${makeCursorUrl('line.png')}'), default`,
|
||||
text: `url('${makeCursorUrl('text.png')}'), default`,
|
||||
sticky: `url('${makeCursorUrl('square.png')}'), default`,
|
||||
pan: `url('${makeCursorUrl('pan.png')}'), default`,
|
||||
};
|
||||
|
||||
const Cursor = (props) => {
|
||||
const {
|
||||
name,
|
||||
@ -130,6 +148,7 @@ export default function Cursors(props) {
|
||||
hasMultiUserAccess,
|
||||
isMultiUserActive,
|
||||
isPanning,
|
||||
currentTool,
|
||||
} = props;
|
||||
|
||||
const start = () => setActive(true);
|
||||
@ -311,8 +330,8 @@ export default function Cursors(props) {
|
||||
});
|
||||
|
||||
const multiUserAccess = hasMultiUserAccess(whiteboardId, currentUser?.userId);
|
||||
let cursorType = multiUserAccess || currentUser?.presenter ? 'none' : 'default';
|
||||
if (isPanning) cursorType = 'grab';
|
||||
let cursorType = multiUserAccess || currentUser?.presenter ? TOOL_CURSORS[currentTool] || 'none' : 'default';
|
||||
if (isPanning) cursorType = TOOL_CURSORS.pan;
|
||||
|
||||
return (
|
||||
<span ref={(r) => { cursorWrapper = r; }}>
|
||||
|
@ -40,6 +40,10 @@ export function isCaptionsEnabled() {
|
||||
return getDisabledFeatures().indexOf('captions') === -1 && Meteor.settings.public.captions.enabled;
|
||||
}
|
||||
|
||||
export function isLiveTranscriptionEnabled() {
|
||||
return getDisabledFeatures().indexOf('liveTranscription') === -1 && Meteor.settings.public.app.audioCaptions.enabled;
|
||||
}
|
||||
|
||||
export function isBreakoutRoomsEnabled() {
|
||||
return getDisabledFeatures().indexOf('breakoutRooms') === -1;
|
||||
}
|
||||
|
@ -13,7 +13,8 @@
|
||||
"test-visual-regression:recording": "export WITH_RECORD=true;export REGRESSION_TESTING=true;env $(cat ../bigbluebutton-tests/puppeteer/.env | xargs) jest all.test.js --color --detectOpenHandles --forceExit",
|
||||
"lint": "eslint . --ext .jsx,.js",
|
||||
"lint:file": "eslint",
|
||||
"preinstall": "npx npm-force-resolutions"
|
||||
"preinstall": "npx npm-force-resolutions",
|
||||
"postinstall": "mkdir -p public/files; cp node_modules/@fontsource/*/files/*.woff public/files/; cp node_modules/@fontsource/*/files/*.woff2 public/files/"
|
||||
},
|
||||
"meteor": {
|
||||
"mainModule": {
|
||||
|
@ -246,6 +246,8 @@
|
||||
"app.presentationUploader.sent": "Sent",
|
||||
"app.presentationUploader.exportingTimeout": "The export is taking too long...",
|
||||
"app.presentationUploader.export": "Send to chat",
|
||||
"app.presentationUploader.export.linkAvailable": "Link for downloading {0} available on the public chat.",
|
||||
"app.presentationUploader.export.notAccessibleWarning": "may be not accessible",
|
||||
"app.presentationUploader.currentPresentationLabel": "Current presentation",
|
||||
"app.presentationUploder.extraHint": "IMPORTANT: each file may not exceed {0} MB and {1} pages.",
|
||||
"app.presentationUploder.uploadLabel": "Upload",
|
||||
@ -454,6 +456,68 @@
|
||||
"app.submenu.application.paginationEnabledLabel": "Video pagination",
|
||||
"app.submenu.application.layoutOptionLabel": "Layout type",
|
||||
"app.submenu.application.pushLayoutLabel": "Push layout",
|
||||
"app.submenu.application.localeDropdown.af": "Afrikaans",
|
||||
"app.submenu.application.localeDropdown.ar": "Arabic",
|
||||
"app.submenu.application.localeDropdown.az": "Azerbaijani",
|
||||
"app.submenu.application.localeDropdown.bg-BG": "Bulgarian",
|
||||
"app.submenu.application.localeDropdown.bn": "Bengali",
|
||||
"app.submenu.application.localeDropdown.ca": "Catalan",
|
||||
"app.submenu.application.localeDropdown.cs-CZ": "Czech",
|
||||
"app.submenu.application.localeDropdown.da": "Danish",
|
||||
"app.submenu.application.localeDropdown.de": "German",
|
||||
"app.submenu.application.localeDropdown.dv": "Dhivehi",
|
||||
"app.submenu.application.localeDropdown.el-GR": "Greek (Greece)",
|
||||
"app.submenu.application.localeDropdown.en": "English",
|
||||
"app.submenu.application.localeDropdown.eo": "Esperanto",
|
||||
"app.submenu.application.localeDropdown.es": "Spanish",
|
||||
"app.submenu.application.localeDropdown.es-419": "Spanish (Latin America)",
|
||||
"app.submenu.application.localeDropdown.es-ES": "Spanish (Spain)",
|
||||
"app.submenu.application.localeDropdown.es-MX": "Spanish (Mexico)",
|
||||
"app.submenu.application.localeDropdown.et": "Estonian",
|
||||
"app.submenu.application.localeDropdown.eu": "Basque",
|
||||
"app.submenu.application.localeDropdown.fa-IR": "Persian",
|
||||
"app.submenu.application.localeDropdown.fi": "Finnish",
|
||||
"app.submenu.application.localeDropdown.fr": "French",
|
||||
"app.submenu.application.localeDropdown.gl": "Galician",
|
||||
"app.submenu.application.localeDropdown.he": "Hebrew",
|
||||
"app.submenu.application.localeDropdown.hi-IN": "Hindi",
|
||||
"app.submenu.application.localeDropdown.hr": "Croatian",
|
||||
"app.submenu.application.localeDropdown.hu-HU": "Hungarian",
|
||||
"app.submenu.application.localeDropdown.hy": "Armenian",
|
||||
"app.submenu.application.localeDropdown.id": "Indonesian",
|
||||
"app.submenu.application.localeDropdown.it-IT": "Italian",
|
||||
"app.submenu.application.localeDropdown.ja": "Japanese",
|
||||
"app.submenu.application.localeDropdown.ka": "Georgian",
|
||||
"app.submenu.application.localeDropdown.km": "Khmer",
|
||||
"app.submenu.application.localeDropdown.kn": "Kannada",
|
||||
"app.submenu.application.localeDropdown.ko-KR": "Korean (Korea)",
|
||||
"app.submenu.application.localeDropdown.lo-LA": "Lao",
|
||||
"app.submenu.application.localeDropdown.lt-LT": "Lithuanian",
|
||||
"app.submenu.application.localeDropdown.lv": "Latvian",
|
||||
"app.submenu.application.localeDropdown.ml": "Malayalam",
|
||||
"app.submenu.application.localeDropdown.mn-MN": "Mongolian",
|
||||
"app.submenu.application.localeDropdown.nb-NO": "Norwegian (bokmal)",
|
||||
"app.submenu.application.localeDropdown.nl": "Dutch",
|
||||
"app.submenu.application.localeDropdown.oc": "Occitan",
|
||||
"app.submenu.application.localeDropdown.pl-PL": "Polish",
|
||||
"app.submenu.application.localeDropdown.pt": "Portuguese",
|
||||
"app.submenu.application.localeDropdown.pt-BR": "Portuguese (Brazil)",
|
||||
"app.submenu.application.localeDropdown.ro-RO": "Romanian",
|
||||
"app.submenu.application.localeDropdown.ru": "Russian",
|
||||
"app.submenu.application.localeDropdown.sk-SK": "Slovak (Slovakia)",
|
||||
"app.submenu.application.localeDropdown.sl": "Slovenian",
|
||||
"app.submenu.application.localeDropdown.sr": "Serbian",
|
||||
"app.submenu.application.localeDropdown.sv-SE": "Swedish",
|
||||
"app.submenu.application.localeDropdown.ta": "Tamil",
|
||||
"app.submenu.application.localeDropdown.te": "Telugu",
|
||||
"app.submenu.application.localeDropdown.th": "Thai",
|
||||
"app.submenu.application.localeDropdown.tr": "Turkish",
|
||||
"app.submenu.application.localeDropdown.tr-TR": "Turkish (Turkey)",
|
||||
"app.submenu.application.localeDropdown.uk-UA": "Ukrainian",
|
||||
"app.submenu.application.localeDropdown.vi": "Vietnamese",
|
||||
"app.submenu.application.localeDropdown.vi-VN": "Vietnamese (Vietnam)",
|
||||
"app.submenu.application.localeDropdown.zh-CN": "Chinese Simplified (China)",
|
||||
"app.submenu.application.localeDropdown.zh-TW": "Chinese Traditional (Taiwan)",
|
||||
"app.submenu.notification.SectionTitle": "Notifications",
|
||||
"app.submenu.notification.Desc": "Define how and what you will be notified.",
|
||||
"app.submenu.notification.audioAlertLabel": "Audio Alerts",
|
||||
|
@ -2,10 +2,11 @@
|
||||
"app.home.greeting": "Votre présentation commencera dans quelques instants...",
|
||||
"app.chat.submitLabel": "Envoyer le message",
|
||||
"app.chat.loading": "Messages de discussion chargés: {0}%",
|
||||
"app.chat.errorMaxMessageLength": "Le message est trop long de {0} caractère(s)",
|
||||
"app.chat.errorMaxMessageLength": "Le message est trop long, il excède le maximum de {0} caractères. ",
|
||||
"app.chat.disconnected": "Vous êtes déconnecté, les messages ne peuvent pas être envoyés",
|
||||
"app.chat.locked": "La discussion est verrouillée, les messages ne peuvent pas être envoyés",
|
||||
"app.chat.inputLabel": "Saisie des messages pour la discussion {0}",
|
||||
"app.chat.emojiButtonLabel": "Sélecteur d'émoticônes",
|
||||
"app.chat.inputPlaceholder": "Message {0}",
|
||||
"app.chat.titlePublic": "Discussion publique",
|
||||
"app.chat.titlePrivate": "Discussion privée avec {0}",
|
||||
@ -20,7 +21,8 @@
|
||||
"app.chat.label": "Discussion",
|
||||
"app.chat.offline": "Déconnecté",
|
||||
"app.chat.pollResult": "Résultats du sondage",
|
||||
"app.chat.breakoutDurationUpdated": "Le temps restant à la réunion privée est maintenant de {0} minutes",
|
||||
"app.chat.breakoutDurationUpdated": "Le temps restant aux groupes de travail est désormais de {0} minutes",
|
||||
"app.chat.breakoutDurationUpdatedModerator": "Le temps en groupe de travail est de {0} minutes; une notification a été envoyée",
|
||||
"app.chat.emptyLogLabel": "Journal de discussion vide",
|
||||
"app.chat.clearPublicChatMessage": "L'historique des discussions publiques a été effacé par un modérateur",
|
||||
"app.chat.multi.typing": "Plusieurs utilisateurs sont en train d'écrire",
|
||||
@ -28,11 +30,32 @@
|
||||
"app.chat.two.typing": "{0} et {1} sont en train d'écrire",
|
||||
"app.chat.copySuccess": "Historique de discussion copié",
|
||||
"app.chat.copyErr": "La copie de l'historique de discussion a échouée",
|
||||
"app.emojiPicker.search": "Rechercher",
|
||||
"app.emojiPicker.notFound": "Aucun émoticône trouvé",
|
||||
"app.emojiPicker.skintext": "Choisissez une teinte par défaut",
|
||||
"app.emojiPicker.clear": "Clair",
|
||||
"app.emojiPicker.categories.label": "Catégories d'émoticônes",
|
||||
"app.emojiPicker.categories.people": "Personnages et corps",
|
||||
"app.emojiPicker.categories.nature": "Nature et animaux",
|
||||
"app.emojiPicker.categories.foods": "Nourriture et boisson",
|
||||
"app.emojiPicker.categories.places": "Lieux et voyage",
|
||||
"app.emojiPicker.categories.activity": "Activités",
|
||||
"app.emojiPicker.categories.objects": "Objets",
|
||||
"app.emojiPicker.categories.symbols": "Symboles",
|
||||
"app.emojiPicker.categories.flags": "Drapeaux",
|
||||
"app.emojiPicker.categories.recent": "Utilisés fréquemment",
|
||||
"app.emojiPicker.categories.search": "Rechercher des résultats",
|
||||
"app.emojiPicker.skintones.1": "Teinte par défaut",
|
||||
"app.emojiPicker.skintones.2": "Teinte claire",
|
||||
"app.emojiPicker.skintones.3": "Ton mat-clair",
|
||||
"app.emojiPicker.skintones.4": "Ton mat",
|
||||
"app.emojiPicker.skintones.5": "Ton mat-foncé",
|
||||
"app.emojiPicker.skintones.6": "Ton foncé",
|
||||
"app.captions.label": "Sous-titre",
|
||||
"app.captions.menu.close": "Fermer",
|
||||
"app.captions.menu.start": "Démarrer",
|
||||
"app.captions.menu.ariaStart": "Démarrer l'écriture des sous-titres",
|
||||
"app.captions.menu.ariaStartDesc": "Ouvre l'éditeur de sous-titres et ferme la fenêtre modale",
|
||||
"app.captions.menu.ariaStartDesc": "Ouvre l'éditeur de sous-titres et ferme la fenêtre de dialogue",
|
||||
"app.captions.menu.select": "Sélectionnez une langue disponible",
|
||||
"app.captions.menu.ariaSelect": "Langue des sous-titres",
|
||||
"app.captions.menu.subtitle": "Veuillez sélectionner une langue et les styles pour les sous-titres de votre réunion.",
|
||||
@ -53,12 +76,21 @@
|
||||
"app.captions.speech.start": "Reconnaissance vocale démarrée",
|
||||
"app.captions.speech.stop": "Reconnaissance vocale arrêtée",
|
||||
"app.captions.speech.error": "Reconnaissance vocale arrêtée en raison d'une incompatibilité du navigateur ou d'une période de silence",
|
||||
"app.confirmation.skipConfirm": "Ne plus demander",
|
||||
"app.confirmation.virtualBackground.title": "Préparer un nouvel arrière-plan virtuel",
|
||||
"app.confirmation.virtualBackground.description": "{0} sera ajouté comme arrière-plan virtuel. Poursuivre?",
|
||||
"app.confirmationModal.yesLabel": "Oui",
|
||||
"app.textInput.sendLabel": "Envoyer",
|
||||
"app.title.defaultViewLabel": "Vue par défaut de la présentation",
|
||||
"app.notes.title": "Notes partagées",
|
||||
"app.notes.label": "Notes",
|
||||
"app.notes.hide": "Masquer les notes",
|
||||
"app.notes.locked": "Verrouillé",
|
||||
"app.notes.disabled": "Épinglé dans l'espace média",
|
||||
"app.notes.notesDropdown.covertAndUpload": "Retranscrire les notes en présentation à l'écran",
|
||||
"app.notes.notesDropdown.pinNotes": "Épingler les notes sur le tableau blanc",
|
||||
"app.notes.notesDropdown.unpinNotes": "Désépingler les notes",
|
||||
"app.notes.notesDropdown.notesOptions": "Options des notes",
|
||||
"app.pads.hint": "Appuyez sur Echap pour sélectionner la barre d'outils de l'éditeur",
|
||||
"app.user.activityCheck": "Vérification de l'activité de l'utilisateur",
|
||||
"app.user.activityCheck.label": "Vérifier si l'utilisateur est toujours en réunion ({0})",
|
||||
@ -160,8 +192,8 @@
|
||||
"app.meeting.endedMessage": "Vous serez redirigé vers l'écran d'accueil",
|
||||
"app.meeting.alertMeetingEndsUnderMinutesSingular": "La réunion se terminera dans une minute.",
|
||||
"app.meeting.alertMeetingEndsUnderMinutesPlural": "La conférence se fermera dans {0} minutes.",
|
||||
"app.meeting.alertBreakoutEndsUnderMinutesPlural": "La réunion privée se fermera dans {0} minutes.",
|
||||
"app.meeting.alertBreakoutEndsUnderMinutesSingular": "La réunion privée se fermera dans une minute.",
|
||||
"app.meeting.alertBreakoutEndsUnderMinutesPlural": "Les sessions en groupes de travail se terminent dans {0} minutes.",
|
||||
"app.meeting.alertBreakoutEndsUnderMinutesSingular": "Les sessions en groupes de travail se terminent dans une minute.",
|
||||
"app.presentation.hide": "Masquer la présentation",
|
||||
"app.presentation.notificationLabel": "Présentation courante",
|
||||
"app.presentation.downloadLabel": "Télécharger",
|
||||
@ -170,7 +202,7 @@
|
||||
"app.presentation.endSlideContent": "Fin du contenu de la diapositive",
|
||||
"app.presentation.changedSlideContent": "La présentation est désormais à la diapositive : {0}",
|
||||
"app.presentation.emptySlideContent": "Pas de contenu pour la diapositive actuelle",
|
||||
"app.presentation.options.fullscreen": "Plein écran",
|
||||
"app.presentation.options.fullscreen": "Présentation en plein écran",
|
||||
"app.presentation.options.exitFullscreen": "Sortir du plein écran",
|
||||
"app.presentation.options.minimize": "Réduire",
|
||||
"app.presentation.options.snapshot": "Capture de la présentation courante",
|
||||
@ -203,17 +235,32 @@
|
||||
"app.presentation.presentationToolbar.goToSlide": "Diapositive {0}",
|
||||
"app.presentation.placeholder": "Il n'y a pas de présentation active actuellement",
|
||||
"app.presentationUploder.title": "Présentation",
|
||||
"app.presentationUploder.message": "En tant que présentateur, vous avez la possibilité de télécharger n'importe quel document Office ou fichier PDF. Nous recommandons le fichier PDF pour de meilleurs résultats. Veuillez vous assurer qu'une présentation est sélectionnée à l'aide du cercle à cocher sur la droite.",
|
||||
"app.presentationUploder.message": "En tant que présentateur, vous avez la possibilité de télécharger n'importe quel document Office ou fichier PDF. Nous recommandons le fichier PDF pour de meilleurs résultats. Veuillez vous assurer qu'une présentation est sélectionnée à l'aide du cercle à cocher sur la gauche.",
|
||||
"app.presentationUploader.exportHint": "En sélectionnant \"Envoyer dans la discussion\", les utilisateurs disposeront d'un lien de téléchargement de la discussion publique.",
|
||||
"app.presentationUploader.exportToastHeader": "Envoi dans la discussion de ({0} item)",
|
||||
"app.presentationUploader.exportToastHeaderPlural": "Envoi dans la discussion de ({0} item)",
|
||||
"app.presentationUploader.exporting": "Envoi dans la discussion",
|
||||
"app.presentationUploader.sending": "En cours d'envoi...",
|
||||
"app.presentationUploader.collecting": "Extraction de la diapositive {0} sur {1}...",
|
||||
"app.presentationUploader.processing": "Annotation de la diapositive {0} sur {1}...",
|
||||
"app.presentationUploader.sent": "Envoyé",
|
||||
"app.presentationUploader.exportingTimeout": "L'export dure trop longtemps...",
|
||||
"app.presentationUploader.export": "Envoi dans la discussion",
|
||||
"app.presentationUploader.export.linkAvailable": "Le lien de téléchargement {0} est disponible dans la discussion publique",
|
||||
"app.presentationUploader.export.notAccessibleWarning": "peut ne pas être accessible",
|
||||
"app.presentationUploader.currentPresentationLabel": "Présentation courante",
|
||||
"app.presentationUploder.extraHint": "IMPORTANT: Le volume d'un fichier ne doit pas excéder {0} MB et {1} pages.",
|
||||
"app.presentationUploder.uploadLabel": "Télécharger",
|
||||
"app.presentationUploder.confirmLabel": "Confirmer",
|
||||
"app.presentationUploder.confirmDesc": "Enregistrez vos modifications et lancez la présentation",
|
||||
"app.presentationUploder.dismissLabel": "Annuler",
|
||||
"app.presentationUploder.dismissDesc": "Ferme la fenêtre d'option et supprime vos modifications",
|
||||
"app.presentationUploder.dismissDesc": "Ferme la fenêtre de dialogue et supprime vos modifications",
|
||||
"app.presentationUploder.dropzoneLabel": "Faites glisser les fichiers ici pour les charger",
|
||||
"app.presentationUploder.dropzoneImagesLabel": "Faites glisser les images ici pour les charger",
|
||||
"app.presentationUploder.browseFilesLabel": "ou recherchez dans vos fichiers",
|
||||
"app.presentationUploder.browseImagesLabel": "ou recherchez/capturez des images",
|
||||
"app.presentationUploder.externalUploadTitle": "Ajouter du contenu depuis une application tierce",
|
||||
"app.presentationUploder.externalUploadLabel": "Parcourir les fichiers",
|
||||
"app.presentationUploder.fileToUpload": "Prêt à être chargé...",
|
||||
"app.presentationUploder.currentBadge": "En cours",
|
||||
"app.presentationUploder.rejectedError": "Le(s) fichier(s) sélectionné(s) a (ont) été rejeté()s. Veuillez vérifier leur format.",
|
||||
@ -230,14 +277,14 @@
|
||||
"app.presentationUploder.conversion.generatedSlides": "Diapositives générées...",
|
||||
"app.presentationUploder.conversion.generatingSvg": "Création des images SVG en cours...",
|
||||
"app.presentationUploder.conversion.pageCountExceeded": "Le nombre de pages dépasse le maximum de {0}",
|
||||
"app.presentationUploder.conversion.invalidMimeType": "Mauvais format du fichier détecté (extension={0}, type de contenu={1})",
|
||||
"app.presentationUploder.conversion.conversionTimeout": "La diapositive {0} n'a pas pu être traitée au cours des {1} essais",
|
||||
"app.presentationUploder.conversion.officeDocConversionInvalid": "Échec du traitement du document Office. Veuillez télécharger un PDF à la place.",
|
||||
"app.presentationUploder.conversion.officeDocConversionFailed": "Échec du traitement du document office. Veuillez télécharger un PDF à la place.",
|
||||
"app.presentationUploder.conversion.pdfHasBigPage": "Nous n'avons pas pu convertir le fichier PDF, veuillez essayer de l'optimiser. Taille de page maximum {0}",
|
||||
"app.presentationUploder.conversion.timeout": "Oups, la conversion a pris trop de temps",
|
||||
"app.presentationUploder.conversion.pageCountFailed": "Impossible de déterminer le nombre de pages.",
|
||||
"app.presentationUploder.conversion.unsupportedDocument": "Extension de fichier non prise en charge",
|
||||
"app.presentationUploder.isDownloadableLabel": "Le téléchargement de la présentation n'est pas autorisé - cliquez pour autoriser le téléchargement",
|
||||
"app.presentationUploder.isNotDownloadableLabel": "Le téléchargement de la présentation est autorisé - cliquez pour ne plus autoriser le téléchargement",
|
||||
"app.presentationUploder.removePresentationLabel": "Supprimer la présentation",
|
||||
"app.presentationUploder.setAsCurrentPresentation": "Définir la présentation comme celle en cours",
|
||||
"app.presentationUploder.tableHeading.filename": "Nom de fichier",
|
||||
@ -251,6 +298,10 @@
|
||||
"app.presentationUploder.clearErrors": "Effacer les erreurs",
|
||||
"app.presentationUploder.clearErrorsDesc": "Efface les échecs de téléversement des présentations",
|
||||
"app.presentationUploder.uploadViewTitle": "Charger la présentation",
|
||||
"app.poll.questionAndoptions.label" : "Intitulé de la question à afficher\nA. Réponse *\nB. Réponse (optionnelle)\nC. Réponse (optionnelle)\nD. Réponse (optionnelle)\nE. Réponse (optionnelle)",
|
||||
"app.poll.customInput.label": "Saisie personnalisée",
|
||||
"app.poll.customInputInstructions.label": "Saisie personnalisée est activée - Ecrivez la question et la (les) réponse(s) dans le format proposé ou glissez-déposez un fichier texte dans le même format. ",
|
||||
"app.poll.maxOptionsWarning.label": "Seules le 5 premières réponses peuvent être utilisées!",
|
||||
"app.poll.pollPaneTitle": "Sondage",
|
||||
"app.poll.enableMultipleResponseLabel": "Permettre aux participants de répondre plusieurs fois ?",
|
||||
"app.poll.quickPollTitle": "Sondage rapide",
|
||||
@ -270,7 +321,7 @@
|
||||
"app.poll.clickHereToSelect": "Cliquez ici pour sélectionner",
|
||||
"app.poll.question.label" : "Écrivez votre question...",
|
||||
"app.poll.optionalQuestion.label" : "Écrivez votre question (optionnel)...",
|
||||
"app.poll.userResponse.label" : "Réponse utilisateur",
|
||||
"app.poll.userResponse.label" : "Réponse saisie",
|
||||
"app.poll.responseTypes.label" : "Types de réponses",
|
||||
"app.poll.optionDelete.label" : "Supprimer",
|
||||
"app.poll.responseChoices.label" : "Choix de réponses",
|
||||
@ -329,10 +380,10 @@
|
||||
"app.muteWarning.disableMessage": "Les alertes de micro éteint sont désactivées jusqu'à la réactivation du micro.",
|
||||
"app.muteWarning.tooltip": "Cliquez pour fermer et désactiver les alertes jusqu'à la prochaine activation du micro",
|
||||
"app.navBar.settingsDropdown.optionsLabel": "Options",
|
||||
"app.navBar.settingsDropdown.fullscreenLabel": "Plein écran",
|
||||
"app.navBar.settingsDropdown.fullscreenLabel": "Application en plein écran",
|
||||
"app.navBar.settingsDropdown.settingsLabel": "Paramètres",
|
||||
"app.navBar.settingsDropdown.aboutLabel": "À propos",
|
||||
"app.navBar.settingsDropdown.leaveSessionLabel": "Quitter la conférence",
|
||||
"app.navBar.settingsDropdown.leaveSessionLabel": "Quitter la réunion",
|
||||
"app.navBar.settingsDropdown.exitFullscreenLabel": "Quitter le plein écran",
|
||||
"app.navBar.settingsDropdown.fullscreenDesc": "Passer le menu de paramétrage en plein écran",
|
||||
"app.navBar.settingsDropdown.settingsDesc": "Modifier les paramètres généraux",
|
||||
@ -342,6 +393,7 @@
|
||||
"app.navBar.settingsDropdown.hotkeysLabel": "Raccourcis clavier",
|
||||
"app.navBar.settingsDropdown.hotkeysDesc": "Liste des raccourcis clavier disponibles",
|
||||
"app.navBar.settingsDropdown.helpLabel": "Aide",
|
||||
"app.navBar.settingsDropdown.openAppLabel": "Ouvrir dans l'application mobile de BigBlueButton ",
|
||||
"app.navBar.settingsDropdown.helpDesc": "Renvoie l'utilisateur vers des tutoriels vidéos (ouvre un nouvel onglet)",
|
||||
"app.navBar.settingsDropdown.endMeetingDesc": "Interrompt la réunion en cours",
|
||||
"app.navBar.settingsDropdown.endMeetingLabel": "Mettre fin à la réunion",
|
||||
@ -359,7 +411,7 @@
|
||||
"app.endMeeting.description": "Cette action mettra fin à la séance pour {0} utilisateurs(s) actif(s). Êtes-vous sûr de vouloir mettre fin à cette séance ?",
|
||||
"app.endMeeting.noUserDescription": "Êtes-vous sûr de vouloir mettre fin à la séance ?",
|
||||
"app.endMeeting.contentWarning": "Les messages de discussion, les notes partagées, le contenu du tableau blanc et les documents partagés lors de cette séance ne seront plus accessibles directement ",
|
||||
"app.endMeeting.yesLabel": "Oui",
|
||||
"app.endMeeting.yesLabel": "Mettre fin à la session pour tous les utilisateurs",
|
||||
"app.endMeeting.noLabel": "Non",
|
||||
"app.about.title": "À propos",
|
||||
"app.about.version": "Version du client :",
|
||||
@ -369,6 +421,15 @@
|
||||
"app.about.confirmDesc": "OK",
|
||||
"app.about.dismissLabel": "Annuler",
|
||||
"app.about.dismissDesc": "Fermer l'information client",
|
||||
"app.mobileAppModal.title": "Ouvrir l'application mobile de BigBlueButton",
|
||||
"app.mobileAppModal.description": "L'application mobile de BigBlueButton est-elle installée sur votre appareil ?",
|
||||
"app.mobileAppModal.openApp": "Oui, ouvrir l'application maintenant",
|
||||
"app.mobileAppModal.obtainUrlMsg": "Récupération de l'adresse de la réunion",
|
||||
"app.mobileAppModal.obtainUrlErrorMsg": "Une erreur est survenue lors de la récupération de l'adresse de la réunion",
|
||||
"app.mobileAppModal.openStore": "Non, télécharger l'application",
|
||||
"app.mobileAppModal.dismissLabel": "Annuler",
|
||||
"app.mobileAppModal.dismissDesc": "Fermer",
|
||||
"app.mobileAppModal.userConnectedWithSameId": "L'utilisateur {0} vient de se connecter en utilisant le même identifiant que vous",
|
||||
"app.actionsBar.changeStatusLabel": "Changer de statut",
|
||||
"app.actionsBar.muteLabel": "Rendre silencieux",
|
||||
"app.actionsBar.unmuteLabel": "Autoriser à parler",
|
||||
@ -379,10 +440,12 @@
|
||||
"app.actionsBar.actionsDropdown.restorePresentationDesc": "Bouton pour rétablir la fenêtre de présentation après qu'elle ait été réduite",
|
||||
"app.actionsBar.actionsDropdown.minimizePresentationLabel": "Réduire la fenêtre de présentation",
|
||||
"app.actionsBar.actionsDropdown.minimizePresentationDesc": "Bouton utilisé pour réduire la fenêtre de présentation",
|
||||
"app.actionsBar.actionsDropdown.layoutModal": "Fenêtre de paramétrage de la mise en page",
|
||||
"app.screenshare.screenShareLabel" : "Partage d'écran",
|
||||
"app.submenu.application.applicationSectionTitle": "Application",
|
||||
"app.submenu.application.animationsLabel": "Animations",
|
||||
"app.submenu.application.audioFilterLabel": "Filtres audios pour microphone",
|
||||
"app.submenu.application.darkThemeLabel": "Mode sombre",
|
||||
"app.submenu.application.fontSizeControlLabel": "Taille des caractères",
|
||||
"app.submenu.application.increaseFontBtnLabel": "Augmenter la taille des caractères",
|
||||
"app.submenu.application.decreaseFontBtnLabel": "Diminuer la taille des caractères",
|
||||
@ -392,6 +455,69 @@
|
||||
"app.submenu.application.noLocaleOptionLabel": "Aucune langue d'application détectée",
|
||||
"app.submenu.application.paginationEnabledLabel": "Pagination de la vidéo",
|
||||
"app.submenu.application.layoutOptionLabel": "Type de mise en page",
|
||||
"app.submenu.application.pushLayoutLabel": "Appliquer la mise en page",
|
||||
"app.submenu.application.localeDropdown.af": "Afrikaans",
|
||||
"app.submenu.application.localeDropdown.ar": "Arabe",
|
||||
"app.submenu.application.localeDropdown.az": "Azéri",
|
||||
"app.submenu.application.localeDropdown.bg-BG": "Bulgare",
|
||||
"app.submenu.application.localeDropdown.bn": "Bengali",
|
||||
"app.submenu.application.localeDropdown.ca": "Catalan",
|
||||
"app.submenu.application.localeDropdown.cs-CZ": "Tchèque",
|
||||
"app.submenu.application.localeDropdown.da": "Danois",
|
||||
"app.submenu.application.localeDropdown.de": "Allemand",
|
||||
"app.submenu.application.localeDropdown.dv": "Divehi",
|
||||
"app.submenu.application.localeDropdown.el-GR": "Grec (Grèce)",
|
||||
"app.submenu.application.localeDropdown.en": "Anglais",
|
||||
"app.submenu.application.localeDropdown.eo": "Espéranto",
|
||||
"app.submenu.application.localeDropdown.es": "Espagnol",
|
||||
"app.submenu.application.localeDropdown.es-419": "Espagnol (Amérique latine)",
|
||||
"app.submenu.application.localeDropdown.es-ES": "Espagnol (Espagne)",
|
||||
"app.submenu.application.localeDropdown.es-MX": "Espagnol (Mexique)",
|
||||
"app.submenu.application.localeDropdown.et": "Estonien",
|
||||
"app.submenu.application.localeDropdown.eu": "Basque",
|
||||
"app.submenu.application.localeDropdown.fa-IR": "Persan",
|
||||
"app.submenu.application.localeDropdown.fi": "Finnois",
|
||||
"app.submenu.application.localeDropdown.fr": "Français",
|
||||
"app.submenu.application.localeDropdown.gl": "Galicien",
|
||||
"app.submenu.application.localeDropdown.he": "Hébreu",
|
||||
"app.submenu.application.localeDropdown.hi-IN": "Hindi",
|
||||
"app.submenu.application.localeDropdown.hr": "Croate",
|
||||
"app.submenu.application.localeDropdown.hu-HU": "Hongrois",
|
||||
"app.submenu.application.localeDropdown.hy": "Arménien",
|
||||
"app.submenu.application.localeDropdown.id": "Indonésien",
|
||||
"app.submenu.application.localeDropdown.it-IT": "Italien",
|
||||
"app.submenu.application.localeDropdown.ja": "Japonais",
|
||||
"app.submenu.application.localeDropdown.ka": "Géorgien",
|
||||
"app.submenu.application.localeDropdown.km": "Khmer",
|
||||
"app.submenu.application.localeDropdown.kn": "Kannada",
|
||||
"app.submenu.application.localeDropdown.ko-KR": "Coréen (Corée)",
|
||||
"app.submenu.application.localeDropdown.lo-LA": "Lao",
|
||||
"app.submenu.application.localeDropdown.lt-LT": "Lituanien",
|
||||
"app.submenu.application.localeDropdown.lv": "Letton",
|
||||
"app.submenu.application.localeDropdown.ml": "Malayalam",
|
||||
"app.submenu.application.localeDropdown.mn-MN": "Mongol",
|
||||
"app.submenu.application.localeDropdown.nb-NO": "Norvégien (bokmal)",
|
||||
"app.submenu.application.localeDropdown.nl": "Néerlandais",
|
||||
"app.submenu.application.localeDropdown.oc": "Occitan",
|
||||
"app.submenu.application.localeDropdown.pl-PL": "Polonais",
|
||||
"app.submenu.application.localeDropdown.pt": "Portugais",
|
||||
"app.submenu.application.localeDropdown.pt-BR": "Portugais (Brésil)",
|
||||
"app.submenu.application.localeDropdown.ro-RO": "Roumain",
|
||||
"app.submenu.application.localeDropdown.ru": "Russe",
|
||||
"app.submenu.application.localeDropdown.sk-SK": "Slovaque (Slovaquie)",
|
||||
"app.submenu.application.localeDropdown.sl": "Slovène",
|
||||
"app.submenu.application.localeDropdown.sr": "Serbe",
|
||||
"app.submenu.application.localeDropdown.sv-SE": "Suédois",
|
||||
"app.submenu.application.localeDropdown.ta": "Tamoul",
|
||||
"app.submenu.application.localeDropdown.te": "Telugu",
|
||||
"app.submenu.application.localeDropdown.th": "Thaï",
|
||||
"app.submenu.application.localeDropdown.tr": "Turc",
|
||||
"app.submenu.application.localeDropdown.tr-TR": "Turc (Turquie)",
|
||||
"app.submenu.application.localeDropdown.uk-UA": "Ukrénien",
|
||||
"app.submenu.application.localeDropdown.vi": "Vietnamien",
|
||||
"app.submenu.application.localeDropdown.vi-VN": "Vietnamien (Vietnam)",
|
||||
"app.submenu.application.localeDropdown.zh-CN": "Chinois simplifié (Chine)",
|
||||
"app.submenu.application.localeDropdown.zh-TW": "Chinois Traditionnel (Taïwan)",
|
||||
"app.submenu.notification.SectionTitle": "Notifications",
|
||||
"app.submenu.notification.Desc": "Gestion des notifications",
|
||||
"app.submenu.notification.audioAlertLabel": "Alerte sonore",
|
||||
@ -420,7 +546,7 @@
|
||||
"app.settings.main.save.label.description": "Enregistre les changements et ferme le menu des paramètres",
|
||||
"app.settings.dataSavingTab.label": "Économies de données",
|
||||
"app.settings.dataSavingTab.webcam": "Activer les webcams des autres participants",
|
||||
"app.settings.dataSavingTab.screenShare": "Activer le partage d'écran",
|
||||
"app.settings.dataSavingTab.screenShare": "Activer le partage d'écran des autres participants",
|
||||
"app.settings.dataSavingTab.description": "Pour économiser votre bande passante, ajustez l'affichage actuel.",
|
||||
"app.settings.save-notification.label": "Les paramètres ont été enregistrés",
|
||||
"app.statusNotifier.lowerHands": "Mains baissées",
|
||||
@ -440,7 +566,6 @@
|
||||
"app.actionsBar.actionsDropdown.presentationLabel": "Gérer les documents de présentation",
|
||||
"app.actionsBar.actionsDropdown.initPollLabel": "Préparer un sondage",
|
||||
"app.actionsBar.actionsDropdown.desktopShareLabel": "Partager votre écran",
|
||||
"app.actionsBar.actionsDropdown.lockedDesktopShareLabel": "Partage d'écran verrouillé",
|
||||
"app.actionsBar.actionsDropdown.stopDesktopShareLabel": "Cesser le partage d'écran",
|
||||
"app.actionsBar.actionsDropdown.presentationDesc": "Charger votre présentation",
|
||||
"app.actionsBar.actionsDropdown.initPollDesc": "Préparer un sondage",
|
||||
@ -449,14 +574,15 @@
|
||||
"app.actionsBar.actionsDropdown.pollBtnLabel": "Lancer un sondage",
|
||||
"app.actionsBar.actionsDropdown.pollBtnDesc": "Affiche/cache le volet de sondage",
|
||||
"app.actionsBar.actionsDropdown.saveUserNames": "Sauvegarder les noms d'utilisateur",
|
||||
"app.actionsBar.actionsDropdown.createBreakoutRoom": "Créer des réunions privées",
|
||||
"app.actionsBar.actionsDropdown.createBreakoutRoomDesc": "Créer des réunions privées pour scinder la réunion en cours",
|
||||
"app.actionsBar.actionsDropdown.createBreakoutRoom": "Créer des salles pour les groupes de travail",
|
||||
"app.actionsBar.actionsDropdown.createBreakoutRoomDesc": "Créer des groupes de travail pour scinder la réunion en cours",
|
||||
"app.actionsBar.actionsDropdown.captionsLabel": "Écrire des sous-titres SME",
|
||||
"app.actionsBar.actionsDropdown.captionsDesc": "Affiche/cache le volet des sous-titres",
|
||||
"app.actionsBar.actionsDropdown.takePresenter": "Devenir présentateur",
|
||||
"app.actionsBar.actionsDropdown.takePresenterDesc": "S'assigner comme nouveau présentateur",
|
||||
"app.actionsBar.actionsDropdown.selectRandUserLabel": "Sélectionner un utilisateur aléatoirement",
|
||||
"app.actionsBar.actionsDropdown.selectRandUserDesc": "Sélectionne aléatoirement un utilisateur parmi les participants disponibles",
|
||||
"app.actionsBar.actionsDropdown.propagateLayoutLabel": "Diffuser la mise en page",
|
||||
"app.actionsBar.emojiMenu.statusTriggerLabel": "Définir votre statut",
|
||||
"app.actionsBar.emojiMenu.awayLabel": "Éloigné",
|
||||
"app.actionsBar.emojiMenu.awayDesc": "Passer votre statut à « éloigné »",
|
||||
@ -496,19 +622,21 @@
|
||||
"app.audioNotification.audioFailedError1012": "Connexion fermée (erreur ICE 1012)",
|
||||
"app.audioNotification.audioFailedMessage": "Votre connexion en mode audio a échoué",
|
||||
"app.audioNotification.mediaFailedMessage": "getUserMicMedia a échoué car seules les origines sécurisées sont autorisées",
|
||||
"app.audioNotification.deviceChangeFailed": "Le changement d'appareil audio a échoué. Vérifiez que l'appareil est bien installé et disponible.",
|
||||
"app.audioNotification.closeLabel": "Fermer",
|
||||
"app.audioNotificaion.reconnectingAsListenOnly": "Le microphone est verrouillé pour les participants, vous êtes connecté en mode écoute uniquement.",
|
||||
"app.breakoutJoinConfirmation.title": "Rejoindre la réunion privée",
|
||||
"app.breakoutJoinConfirmation.title": "Rejoindre le groupe de travail",
|
||||
"app.breakoutJoinConfirmation.message": "Voulez-vous rejoindre la séance",
|
||||
"app.breakoutJoinConfirmation.confirmDesc": "Rejoignez la réunion privée",
|
||||
"app.breakoutJoinConfirmation.confirmDesc": "Rejoignez le groupe de travail",
|
||||
"app.breakoutJoinConfirmation.dismissLabel": "Annuler",
|
||||
"app.breakoutJoinConfirmation.dismissDesc": "Fermer et refuser d'entrer dans la réunion privée",
|
||||
"app.breakoutJoinConfirmation.freeJoinMessage": "Choisissez une réunion privée à rejoindre",
|
||||
"app.breakoutTimeRemainingMessage": "Temps restant dans la réunion privée : {0}",
|
||||
"app.breakoutWillCloseMessage": "Le temps s'est écoulé. La réunion privée fermera bientôt",
|
||||
"app.breakoutJoinConfirmation.dismissDesc": "Fermer et refuser de rejoindre le groupe de travail",
|
||||
"app.breakoutJoinConfirmation.freeJoinMessage": "Choisissez une groupe de travail à rejoindre",
|
||||
"app.breakoutTimeRemainingMessage": "Temps restant pour le groupe de travail : {0}",
|
||||
"app.breakoutWillCloseMessage": "Le temps s'est écoulé. La groupe de travail fermera bientôt",
|
||||
"app.breakout.dropdown.manageDuration": "Changer la durée",
|
||||
"app.breakout.dropdown.destroyAll": "Clôturer les réunions privées",
|
||||
"app.breakout.dropdown.options": "Options des réunions privées",
|
||||
"app.breakout.dropdown.destroyAll": "Clôturer les groupes de travail",
|
||||
"app.breakout.dropdown.options": "Options des groupes de travail",
|
||||
"app.breakout.dropdown.manageUsers": "Gestion des utilisateurs",
|
||||
"app.calculatingBreakoutTimeRemaining": "Calcul du temps restant...",
|
||||
"app.audioModal.ariaTitle": "Fenêtre modale pour joindre la réunion en audio",
|
||||
"app.audioModal.microphoneLabel": "Microphone",
|
||||
@ -555,6 +683,7 @@
|
||||
"app.audio.changeAudioDevice": "Changer de périphérique audio",
|
||||
"app.audio.enterSessionLabel": "Rejoindre la séance",
|
||||
"app.audio.playSoundLabel": "Jouer un son",
|
||||
"app.audio.stopAudioFeedback": "Arrêter le retour audio",
|
||||
"app.audio.backLabel": "Retour",
|
||||
"app.audio.loading": "Chargement en cours",
|
||||
"app.audio.microphones": "Microphones",
|
||||
@ -567,10 +696,32 @@
|
||||
"app.audio.audioSettings.testSpeakerLabel": "Testez votre haut-parleur",
|
||||
"app.audio.audioSettings.microphoneStreamLabel": "Volume de votre flux audio",
|
||||
"app.audio.audioSettings.retryLabel": "Réessayer",
|
||||
"app.audio.audioSettings.fallbackInputLabel": "Entrée audio {0}",
|
||||
"app.audio.audioSettings.fallbackOutputLabel": "Sortie audio {0}",
|
||||
"app.audio.audioSettings.defaultOutputDeviceLabel": "Par défaut",
|
||||
"app.audio.audioSettings.findingDevicesLabel": "Recherche des appareils...",
|
||||
"app.audio.listenOnly.backLabel": "Retour",
|
||||
"app.audio.listenOnly.closeLabel": "Fermer",
|
||||
"app.audio.permissionsOverlay.title": "Autoriser BigBlueButton à utiliser votre micro",
|
||||
"app.audio.permissionsOverlay.hint": "Il est nécessaire que vous nous autorisiez à utiliser vos appareils multimédias pour que vous puissiez participer à la réunion",
|
||||
"app.audio.captions.button.start": "Initier un sous titrage SME",
|
||||
"app.audio.captions.button.stop": "Arrêter le sous titrage SME",
|
||||
"app.audio.captions.button.language": "Langue",
|
||||
"app.audio.captions.button.transcription": "Transcription",
|
||||
"app.audio.captions.button.transcriptionSettings": "Paramètres de la transcription",
|
||||
"app.audio.captions.speech.title": "Transcription automatique",
|
||||
"app.audio.captions.speech.disabled": "Desactivé",
|
||||
"app.audio.captions.speech.unsupported": "Votre navigateur n'est pas compatible avec la reconnaissance vocale. L'entrée audio ne sera pas retranscrite.",
|
||||
"app.audio.captions.select.de-DE": "Allemand",
|
||||
"app.audio.captions.select.en-US": "Anglais",
|
||||
"app.audio.captions.select.es-ES": "Espagnol",
|
||||
"app.audio.captions.select.fr-FR": "Français",
|
||||
"app.audio.captions.select.hi-ID": "Hindi",
|
||||
"app.audio.captions.select.it-IT": "Italien",
|
||||
"app.audio.captions.select.ja-JP": "Japonais",
|
||||
"app.audio.captions.select.pt-BR": "Portugais",
|
||||
"app.audio.captions.select.ru-RU": "Russe",
|
||||
"app.audio.captions.select.zh-CN": "Chinois",
|
||||
"app.error.removed": "Vous avez été écarté de la réunion",
|
||||
"app.error.meeting.ended": "Vous avez été déconnecté de la réunion",
|
||||
"app.meeting.logout.duplicateUserEjectReason": " Un compte déjà connecté tente de rejoindre la réunion",
|
||||
@ -578,6 +729,7 @@
|
||||
"app.meeting.logout.ejectedFromMeeting": "Vous avez été retiré de la réunion",
|
||||
"app.meeting.logout.validateTokenFailedEjectReason": "Le jeton d'autorisation n'a pas pu être validé",
|
||||
"app.meeting.logout.userInactivityEjectReason": "Utilisateur trop longtemps inactif ",
|
||||
"app.meeting.logout.maxParticipantsReached": "Le nombre maximum de participants pour cette réunion a été atteint.",
|
||||
"app.meeting-ended.rating.legendLabel": "Évaluation",
|
||||
"app.meeting-ended.rating.starLabel": "Favori",
|
||||
"app.modal.close": "Fermer",
|
||||
@ -599,8 +751,11 @@
|
||||
"app.error.403": "Vous avez été retiré de la réunion",
|
||||
"app.error.404": "Non trouvé",
|
||||
"app.error.408": "Échec de l'authentification",
|
||||
"app.error.409": "Conflit",
|
||||
"app.error.410": "La conférence est terminée",
|
||||
"app.error.500": "Oups, quelque chose s'est mal passé",
|
||||
"app.error.503": "Vous avez été déconnecté",
|
||||
"app.error.disconnected.rejoin": "Vous pouvez rafraichir la page pour réintégrer la réunion.",
|
||||
"app.error.userLoggedOut": "Le jeton de session est invalide car l'utilisateur est déconnecté",
|
||||
"app.error.ejectedUser": "Le jeton de session est invalide car l'utilisateur a été expulsé",
|
||||
"app.error.joinedAnotherWindow": "Il semble que cette conférence est ouverte dans une autre fenêtre de navigateur",
|
||||
@ -644,14 +799,18 @@
|
||||
"app.userList.guest.privateMessageLabel": "Message",
|
||||
"app.userList.guest.acceptLabel": "Accepter",
|
||||
"app.userList.guest.denyLabel": "Refuser",
|
||||
"app.userList.guest.feedbackMessage": "Mesure prise:",
|
||||
"app.user-info.title": "Recherche dans l'annuaire",
|
||||
"app.toast.breakoutRoomEnded": "La réunion privée s'est terminée. Veuillez rejoindre l'audio.",
|
||||
"app.toast.breakoutRoomEnded": "La session en groupe de travail est terminée. Veuillez rejoindre l'audio.",
|
||||
"app.toast.chat.public": "Nouveau message de discussion publique",
|
||||
"app.toast.chat.private": "Nouveau message de discussion privée",
|
||||
"app.toast.chat.system": "Système",
|
||||
"app.toast.chat.poll": "Résultats du sondage",
|
||||
"app.toast.chat.pollClick": "Les résultats du sondage ont été publiés. Cliquez ici pour les voir.",
|
||||
"app.toast.clearedEmoji.label": "Emoticône de statut effacé",
|
||||
"app.toast.setEmoji.label": "Emoticône de statut défini sur {0}",
|
||||
"app.toast.meetingMuteOn.label": "Tous les utilisateurs ont été rendus silencieux",
|
||||
"app.toast.meetingMuteOnViewers.label": "Les spectateurs sont en mode silencieux",
|
||||
"app.toast.meetingMuteOff.label": "Mode silencieux désactivé",
|
||||
"app.toast.setEmoji.raiseHand": "Vous avez levé la main",
|
||||
"app.toast.setEmoji.lowerHand": "Votre main a été abaissée",
|
||||
@ -688,6 +847,38 @@
|
||||
"app.shortcut-help.toggleFullscreenKey": "Entrée",
|
||||
"app.shortcut-help.nextSlideKey": "Flèche droite",
|
||||
"app.shortcut-help.previousSlideKey": "Flèche gauche",
|
||||
"app.shortcut-help.select": "Choisir un outil",
|
||||
"app.shortcut-help.pencil": "Crayon",
|
||||
"app.shortcut-help.eraser": "Gomme",
|
||||
"app.shortcut-help.rectangle": "Rectangle",
|
||||
"app.shortcut-help.elipse": "Ellipse",
|
||||
"app.shortcut-help.triangle": "Triangle",
|
||||
"app.shortcut-help.line": "Ligne",
|
||||
"app.shortcut-help.arrow": "Flèche",
|
||||
"app.shortcut-help.text": "Outil texte",
|
||||
"app.shortcut-help.note": "Note autocollante",
|
||||
"app.shortcut-help.general": "Général",
|
||||
"app.shortcut-help.presentation": "Présentation",
|
||||
"app.shortcut-help.whiteboard": "Tableau blanc",
|
||||
"app.shortcut-help.zoomIn": "Zoom avant",
|
||||
"app.shortcut-help.zoomOut": "Zoom arrière",
|
||||
"app.shortcut-help.zoomFit": "Réinitialiser le zoom",
|
||||
"app.shortcut-help.zoomSelect": "Zoomer sur la sélection",
|
||||
"app.shortcut-help.flipH": "Renversement horizontal",
|
||||
"app.shortcut-help.flipV": "Renversement vertical",
|
||||
"app.shortcut-help.lock": "Verrouiller/déverrouiller",
|
||||
"app.shortcut-help.moveToFront": "Déplacer au premier plan",
|
||||
"app.shortcut-help.moveToBack": "Déplacer à l'arrière-plan",
|
||||
"app.shortcut-help.moveForward": "Avancer",
|
||||
"app.shortcut-help.moveBackward": "Reculer",
|
||||
"app.shortcut-help.undo": "Annuler l'action",
|
||||
"app.shortcut-help.redo": "Rétablir l'action",
|
||||
"app.shortcut-help.cut": "Couper",
|
||||
"app.shortcut-help.copy": "Coller",
|
||||
"app.shortcut-help.paste": "Coller",
|
||||
"app.shortcut-help.selectAll": "Tout sélectionner",
|
||||
"app.shortcut-help.delete": "Effacer",
|
||||
"app.shortcut-help.duplicate": "Dupliquer",
|
||||
"app.lock-viewers.title": "Limiter la communication des participants",
|
||||
"app.lock-viewers.description": "Ces options vous permettent de restreindre l'utilisation de certaines fonctionnalités par les participants.",
|
||||
"app.lock-viewers.featuresLable": "Fonctionnalité",
|
||||
@ -737,13 +928,19 @@
|
||||
"app.connection-status.next": "Page suivante",
|
||||
"app.connection-status.prev": "Page précédente",
|
||||
"app.learning-dashboard.label": "Tableau de bord d'activité des participants",
|
||||
"app.learning-dashboard.description": "Ouvrir le tableau de bord avec les activités des utilisateurs",
|
||||
"app.learning-dashboard.description": "Tableau d'activité des utilisateurs",
|
||||
"app.learning-dashboard.clickHereToOpen": "Ouvrir le tableau de bord d'activité des participants",
|
||||
"app.recording.startTitle": "Commencer l'enregistrement",
|
||||
"app.recording.stopTitle": "Enregistrement en pause",
|
||||
"app.recording.resumeTitle": "Reprendre l'enregistrement",
|
||||
"app.recording.startDescription": "Vous pouvez à nouveau utiliser le bouton d'enregistrement ultérieurement pour mettre l'enregistrement en pause.",
|
||||
"app.recording.stopDescription": "Êtes-vous sûr de vouloir mettre l'enregistrement en pause ? Vous pouvez reprendre en utilisant à nouveau le bouton d'enregistrement.",
|
||||
"app.recording.notify.title": "L'enregistrement à commencé",
|
||||
"app.recording.notify.description": "La suite de cette session sera enregistrée.",
|
||||
"app.recording.notify.continue": "Poursuivre",
|
||||
"app.recording.notify.leave": "Quitter la session",
|
||||
"app.recording.notify.continueLabel" : "Accepter l'enregistrement et poursuivre",
|
||||
"app.recording.notify.leaveLabel" : "Refuser l'enregistrement et quitter la réunion",
|
||||
"app.videoPreview.cameraLabel": "Caméra",
|
||||
"app.videoPreview.profileLabel": "Qualité",
|
||||
"app.videoPreview.quality.low": "Bas",
|
||||
@ -760,13 +957,20 @@
|
||||
"app.videoPreview.webcamOptionLabel": "Sélectionner une webcam",
|
||||
"app.videoPreview.webcamPreviewLabel": "Aperçu de la webcam",
|
||||
"app.videoPreview.webcamSettingsTitle": "Paramètres de la webcam",
|
||||
"app.videoPreview.webcamEffectsTitle": "Réglages de l'image pour la webcam",
|
||||
"app.videoPreview.webcamVirtualBackgroundLabel": "Paramètres d'arrière-plan virtuel",
|
||||
"app.videoPreview.webcamVirtualBackgroundDisabledLabel": "Le périphérique ne prend pas en charge les arrière-plans virtuels",
|
||||
"app.videoPreview.webcamNotFoundLabel": "Webcam introuvable",
|
||||
"app.videoPreview.profileNotFoundLabel": "Profil de caméra non supporté",
|
||||
"app.videoPreview.brightness": "Luminosité",
|
||||
"app.videoPreview.wholeImageBrightnessLabel": "Image complète",
|
||||
"app.videoPreview.wholeImageBrightnessDesc": "Applique le réglage de la luminosité à l'image principale et à l'arrière-plan",
|
||||
"app.videoPreview.sliderDesc": "Réduit ou augmente le luminosité",
|
||||
"app.video.joinVideo": "Partager webcam",
|
||||
"app.video.connecting": "Le partage de la webcam démarre...",
|
||||
"app.video.leaveVideo": "Arrêtez le partage de la webcam",
|
||||
"app.video.videoSettings": "Réglages vidéo",
|
||||
"app.video.visualEffects": "Réglages de l'image",
|
||||
"app.video.advancedVideo": "Ouvrir les paramètres avancés",
|
||||
"app.video.iceCandidateError": "Erreur lors de l'ajout du candidat ICE",
|
||||
"app.video.iceConnectionStateError": "Échec de connexion (erreur ICE 1107)",
|
||||
@ -782,6 +986,7 @@
|
||||
"app.video.notReadableError": "Impossible d'obtenir la vidéo de la webcam. Assurez-vous qu'aucun autre programme n'utilise la webcam",
|
||||
"app.video.timeoutError": "Le navigateur n'a pas répondu à temps",
|
||||
"app.video.genericError": "Une erreur inconnue s'est produite avec l'appareil (Erreur {0})",
|
||||
"app.video.inactiveError": "Votre webcam s'est brusquement éteinte. Veuillez vérifier les autorisations données au navigateur.",
|
||||
"app.video.mediaTimedOutError": "Le flux de votre webcam a été interrompu. Essayer de le partager à nouveau",
|
||||
"app.video.mediaFlowTimeout1020": "Le média n'a pas pu atteindre le serveur (erreur 1020)",
|
||||
"app.video.suggestWebcamLock": "Appliquer le paramètre de verrouillage aux webcams des participants ?",
|
||||
@ -804,8 +1009,17 @@
|
||||
"app.video.virtualBackground.board": "Tableau",
|
||||
"app.video.virtualBackground.coffeeshop": "Café",
|
||||
"app.video.virtualBackground.background": "Arrière-plan",
|
||||
"app.video.virtualBackground.backgroundWithIndex": "Arrière-plan {0}",
|
||||
"app.video.virtualBackground.custom": "Téléverser depuis votre ordinateur",
|
||||
"app.video.virtualBackground.remove": "Supprimer l'image qui a été ajoutée",
|
||||
"app.video.virtualBackground.genericError": "Échec de l'application de l'effet de caméra. Réessayez. ",
|
||||
"app.video.virtualBackground.camBgAriaDesc": "Défini l'arrière plan virtuel de caméra à {0}",
|
||||
"app.video.virtualBackground.maximumFileSizeExceeded": "La limite de taille pour un fichier est dépassée. ({0}MB)",
|
||||
"app.video.virtualBackground.typeNotAllowed": "Ce type de fichier n'est pas autorisé",
|
||||
"app.video.virtualBackground.errorOnRead": "Une erreur s'est produite lors de la lecture du fichier.",
|
||||
"app.video.virtualBackground.uploaded": "Chargé",
|
||||
"app.video.virtualBackground.uploading": "En cours de chargement...",
|
||||
"app.video.virtualBackground.button.customDesc": "Ajoute un nouveau arrière-plan virtuel",
|
||||
"app.video.camCapReached": "Vous ne pouvez pas partager plus de caméras",
|
||||
"app.video.meetingCamCapReached": "La conférence a atteint sa limite de caméras simultanées",
|
||||
"app.video.dropZoneLabel": "Déposer ici",
|
||||
@ -826,6 +1040,7 @@
|
||||
"app.whiteboard.annotations.poll": "Les résultats du sondage ont été publiés",
|
||||
"app.whiteboard.annotations.pollResult": "Résultats du sondage",
|
||||
"app.whiteboard.annotations.noResponses": "Pas de réponses",
|
||||
"app.whiteboard.annotations.notAllowed": "Vous n'êtes pas autorisé à faire ce changement.",
|
||||
"app.whiteboard.toolbar.tools": "Outils",
|
||||
"app.whiteboard.toolbar.tools.hand": "Panoramique",
|
||||
"app.whiteboard.toolbar.tools.pencil": "Crayon",
|
||||
@ -852,6 +1067,7 @@
|
||||
"app.whiteboard.toolbar.color.silver": "Argenté",
|
||||
"app.whiteboard.toolbar.undo": "Annuler l'annotation",
|
||||
"app.whiteboard.toolbar.clear": "Effacer toutes les annotations",
|
||||
"app.whiteboard.toolbar.clearConfirmation": "Êtes-vous sûr de vouloir effacer les annotations?",
|
||||
"app.whiteboard.toolbar.multiUserOn": "Activer le mode multi-utilisateur",
|
||||
"app.whiteboard.toolbar.multiUserOff": "Désactiver le mode multi-utilisateur",
|
||||
"app.whiteboard.toolbar.palmRejectionOn": "Contacts de la paume de la main sur les écrans tactiles : Désactivés",
|
||||
@ -871,19 +1087,19 @@
|
||||
"app.videoDock.webcamUnfocusDesc": "Arrêter de centrer sur la webcam sélectionnée",
|
||||
"app.videoDock.webcamPinLabel": "Épingler",
|
||||
"app.videoDock.webcamPinDesc": "Épingler la caméra sélectionnée",
|
||||
"app.videoDock.webcamFullscreenLabel": "Webcam en plein écran",
|
||||
"app.videoDock.webcamSqueezedButtonLabel": "Options de la webcam",
|
||||
"app.videoDock.webcamUnpinLabel": "Désépingler",
|
||||
"app.videoDock.webcamUnpinLabelDisabled": "Seuls les modérateurs peuvent désépingler des utilisateurs",
|
||||
"app.videoDock.webcamUnpinDesc": "Désépingler la caméra sélectionnée",
|
||||
"app.videoDock.autoplayBlockedDesc": "Nous avons besoin de votre permission pour vous montrer les webcams des autres utilisateurs.",
|
||||
"app.videoDock.autoplayAllowLabel": "Voir les webcams",
|
||||
"app.invitation.title": "Invitation à une réunion privée",
|
||||
"app.invitation.confirm": "Inviter",
|
||||
"app.createBreakoutRoom.title": "Salle de réunion privée",
|
||||
"app.createBreakoutRoom.ariaTitle": "Masquer les salles de réunion privées",
|
||||
"app.createBreakoutRoom.breakoutRoomLabel": "Réunions privées {0}",
|
||||
"app.createBreakoutRoom.title": "Salles pour les groupes de travail",
|
||||
"app.createBreakoutRoom.ariaTitle": "Masquer les salles pour les groupes de travail",
|
||||
"app.createBreakoutRoom.breakoutRoomLabel": "Salles pour les groupes de travail {0}",
|
||||
"app.createBreakoutRoom.askToJoin": "Demander à rejoindre une réunion",
|
||||
"app.createBreakoutRoom.generatingURL": "Générer l'URL",
|
||||
"app.createBreakoutRoom.generatingURLMessage": "Nous sommes en train de générer une URL pour rejoindre le salon du groupe sélectionné. Cela peut prendre quelques secondes...",
|
||||
"app.createBreakoutRoom.generatingURLMessage": "Nous sommes en train de générer une URL pour rejoindre le groupe de travail sélectionné. Cela peut prendre quelques secondes...",
|
||||
"app.createBreakoutRoom.duration": "Durée {0}",
|
||||
"app.createBreakoutRoom.room": "Réunion {0}",
|
||||
"app.createBreakoutRoom.notAssigned": "Non attribué ({0})",
|
||||
@ -896,22 +1112,24 @@
|
||||
"app.createBreakoutRoom.numberOfRooms": "Nombre de réunions",
|
||||
"app.createBreakoutRoom.durationInMinutes": "Durée (minutes)",
|
||||
"app.createBreakoutRoom.randomlyAssign": "Affecter aléatoirement",
|
||||
"app.createBreakoutRoom.randomlyAssignDesc": "Affecte les utilisateurs aux salles de réunion privées de manière aléatoire",
|
||||
"app.createBreakoutRoom.randomlyAssignDesc": "Affecte les utilisateurs de manière aléatoire dans les groupes de travail",
|
||||
"app.createBreakoutRoom.resetAssignments": "Réinitialiser les affectations",
|
||||
"app.createBreakoutRoom.resetAssignmentsDesc": "Réinitialiser toutes les affectations des utilisateurs aux salles",
|
||||
"app.createBreakoutRoom.endAllBreakouts": "Clore toutes les réunions privées",
|
||||
"app.createBreakoutRoom.endAllBreakouts": "Clore tous les groupes de travail",
|
||||
"app.createBreakoutRoom.chatTitleMsgAllRooms": "toutes les salles",
|
||||
"app.createBreakoutRoom.msgToBreakoutsSent": "Le message a été envoyé à {0} réunions privées",
|
||||
"app.createBreakoutRoom.msgToBreakoutsSent": "Le message a été envoyé à {0} groupes de travail",
|
||||
"app.createBreakoutRoom.roomName": "{0} (Réunion - {1})",
|
||||
"app.createBreakoutRoom.doneLabel": "Terminé",
|
||||
"app.createBreakoutRoom.nextLabel": "Suivant",
|
||||
"app.createBreakoutRoom.minusRoomTime": "Diminuer le temps de la réunion privée à",
|
||||
"app.createBreakoutRoom.addRoomTime": "Augmenter le temps de la réunion privée à",
|
||||
"app.createBreakoutRoom.minusRoomTime": "Diminuer la durée des groupes de travail à",
|
||||
"app.createBreakoutRoom.addRoomTime": "Augmenter la durée des groupes de travail à",
|
||||
"app.createBreakoutRoom.addParticipantLabel": "+ Ajouter un participant",
|
||||
"app.createBreakoutRoom.freeJoin": "Autoriser les participants à choisir la salle de réunion privée qu'ils souhaitent rejoindre",
|
||||
"app.createBreakoutRoom.leastOneWarnBreakout": "Vous devez placer au moins un participant dans une réunion privée.",
|
||||
"app.createBreakoutRoom.minimumDurationWarnBreakout": "La durée minimum d'une réunion privée est de {0} minutes.",
|
||||
"app.createBreakoutRoom.modalDesc": "Conseil : vous pouvez glisser-déposer le nom d'un utilisateur pour l'affecter à une salle de réunion spécifique.",
|
||||
"app.createBreakoutRoom.captureNotes": "Faire une capture des notes partagées lors de la fermeture des groupes de travail",
|
||||
"app.createBreakoutRoom.captureSlides": "Faire une capture du tableau blanc lors de la fermeture des groupes de travail",
|
||||
"app.createBreakoutRoom.leastOneWarnBreakout": "Vous devez placer au moins un participant dans chaque groupe de travail",
|
||||
"app.createBreakoutRoom.minimumDurationWarnBreakout": "La durée minimum d'une session en groupes de travail est de {0} minutes.",
|
||||
"app.createBreakoutRoom.modalDesc": "Conseil : vous pouvez glisser-déposer le nom d'un utilisateur pour l'affecter à un groupe de travail spécifique.",
|
||||
"app.createBreakoutRoom.roomTime": "{0} minutes",
|
||||
"app.createBreakoutRoom.numberOfRoomsError": "Le nombre de réunions n'est pas valide.",
|
||||
"app.createBreakoutRoom.duplicatedRoomNameError": "Le nom du salon ne peut être dupliqué.",
|
||||
@ -919,8 +1137,16 @@
|
||||
"app.createBreakoutRoom.setTimeInMinutes": "Fixer la durée à (minutes)",
|
||||
"app.createBreakoutRoom.setTimeLabel": "Appliquer",
|
||||
"app.createBreakoutRoom.setTimeCancel": "Annuler",
|
||||
"app.createBreakoutRoom.setTimeHigherThanMeetingTimeError": "La durée des réunions privées ne peut pas excéder le temps restant de la réunion.",
|
||||
"app.createBreakoutRoom.roomNameInputDesc": "Met à jour le nom de la salle de réunion privée",
|
||||
"app.createBreakoutRoom.setTimeHigherThanMeetingTimeError": "La durée des sessions en groupe de travail ne peut pas excéder le temps restant de la réunion.",
|
||||
"app.createBreakoutRoom.roomNameInputDesc": "Met à jour le nom du groupe de travail",
|
||||
"app.createBreakoutRoom.movedUserLabel": "Déplacé {0} dans le salon privé {1}",
|
||||
"app.updateBreakoutRoom.modalDesc": "Pour informer ou inviter un utilisateur, glisser son nom d'utilisateur dans le salon souhaité",
|
||||
"app.updateBreakoutRoom.cancelLabel": "Annuler",
|
||||
"app.updateBreakoutRoom.title": "Mettre à jour les groupes de travail",
|
||||
"app.updateBreakoutRoom.confirm": "Appliquer",
|
||||
"app.updateBreakoutRoom.userChangeRoomNotification": "Vous avez été déplacé vers la salle {0}",
|
||||
"app.smartMediaShare.externalVideo": "Vidéo(s) de source externe",
|
||||
"app.update.resetRoom": "Réinitialiser la salle de l'utilisateur",
|
||||
"app.externalVideo.start": "Partager une nouvelle vidéo",
|
||||
"app.externalVideo.title": "Partager une vidéo externe",
|
||||
"app.externalVideo.input": "URL vidéo externe",
|
||||
@ -946,14 +1172,23 @@
|
||||
"app.debugWindow.form.enableAutoarrangeLayoutDescription": "(il sera désactivé si vous faites glisser ou redimensionnez la zone des webcams)",
|
||||
"app.debugWindow.form.chatLoggerLabel": "Tester les niveaux de logs de la discussion.",
|
||||
"app.debugWindow.form.button.apply": "Appliquer",
|
||||
"app.layout.modal.title": "Mise en page",
|
||||
"app.layout.modal.confirm": "Confirmer",
|
||||
"app.layout.modal.cancel": "Annuler",
|
||||
"app.layout.modal.layoutLabel": "Choisir votre mise en page",
|
||||
"app.layout.modal.keepPushingLayoutLabel": "Appliquer la mise en page à tous",
|
||||
"app.layout.modal.pushLayoutLabel": "Appliquer la mise en page à tout le monde",
|
||||
"app.layout.modal.layoutToastLabel": "Le paramétrage de la mise en page a changé",
|
||||
"app.layout.modal.layoutSingular": "Mise en page",
|
||||
"app.layout.modal.layoutBtnDesc": "Défini la mise en page en tant qu'option sélectionnée",
|
||||
"app.layout.style.custom": "Personnalisé",
|
||||
"app.layout.style.smart": "Mise en page intelligente",
|
||||
"app.layout.style.presentationFocus": "Centrer sur la présentation",
|
||||
"app.layout.style.videoFocus": "Centrer sur la vidéo",
|
||||
"app.layout.style.customPush": "Personnalisé (applique la disposition à tous les utilisateurs)",
|
||||
"app.layout.style.smartPush": "Disposition automatique (applique la disposition à tous les utilisateurs)",
|
||||
"app.layout.style.presentationFocusPush": "Centre sur la présentation (applique la disposition à tous les utilisateurs)",
|
||||
"app.layout.style.videoFocusPush": "Centrer sur la vidéo (applique la disposition à tous les utilisateurs)",
|
||||
"app.layout.style.customPush": "Personnalisé (applique la mise en page à tous les utilisateurs)",
|
||||
"app.layout.style.smartPush": "Mise en page automatique (applique la mise en page à tous les utilisateurs)",
|
||||
"app.layout.style.presentationFocusPush": "Centre sur la présentation (applique la mise en page à tous les utilisateurs)",
|
||||
"app.layout.style.videoFocusPush": "Centrer sur la vidéo (applique la mise en page à tous les utilisateurs)",
|
||||
"playback.button.about.aria": "À propos",
|
||||
"playback.button.clear.aria": "Effacer la recherche",
|
||||
"playback.button.close.aria": "Fermer la fenêtre de dialogue",
|
||||
@ -995,6 +1230,7 @@
|
||||
"playback.player.thumbnails.wrapper.aria": "Zone des vignettes",
|
||||
"playback.player.webcams.wrapper.aria": "Zone des caméras",
|
||||
"app.learningDashboard.dashboardTitle": "Tableau de bord d'activité des participants",
|
||||
"app.learningDashboard.bigbluebuttonTitle": "BigBlueButton",
|
||||
"app.learningDashboard.downloadSessionDataLabel": "Télécharger les données de la session",
|
||||
"app.learningDashboard.lastUpdatedLabel": "Dernière mise à jour à",
|
||||
"app.learningDashboard.sessionDataDownloadedLabel": "Téléchargé !",
|
||||
@ -1019,6 +1255,12 @@
|
||||
"app.learningDashboard.userDetails.response": "Réponse",
|
||||
"app.learningDashboard.userDetails.mostCommonAnswer": "Réponse la plus fréquente",
|
||||
"app.learningDashboard.userDetails.anonymousAnswer": "Sondage anonyme",
|
||||
"app.learningDashboard.userDetails.talkTime": "Temps de parole",
|
||||
"app.learningDashboard.userDetails.messages": "Messages",
|
||||
"app.learningDashboard.userDetails.emojis": "Émoticônes",
|
||||
"app.learningDashboard.userDetails.raiseHands": "Lever la main",
|
||||
"app.learningDashboard.userDetails.pollVotes": "Sondages",
|
||||
"app.learningDashboard.userDetails.onlineIndicator": "{0} temps en ligne",
|
||||
"app.learningDashboard.usersTable.title": "Vue d'ensemble",
|
||||
"app.learningDashboard.usersTable.colOnline": "Temps en ligne",
|
||||
"app.learningDashboard.usersTable.colTalk": "Temps de conversation",
|
||||
@ -1042,8 +1284,13 @@
|
||||
"app.learningDashboard.pollsTable.anonymousRowName": "Anonyme",
|
||||
"app.learningDashboard.pollsTable.noPollsCreatedHeading": "Aucun sondage n'a été créé",
|
||||
"app.learningDashboard.pollsTable.noPollsCreatedMessage": "Une fois qu'un sondage a été envoyé aux utilisateurs, leurs résultats apparaissent dans cette liste.",
|
||||
"app.learningDashboard.pollsTable.answerTotal": "Total",
|
||||
"app.learningDashboard.pollsTable.userLabel": "Utilisateur",
|
||||
"app.learningDashboard.statusTimelineTable.title": "Chronologie",
|
||||
"app.learningDashboard.statusTimelineTable.thumbnail": "Vignette de présentation",
|
||||
"app.learningDashboard.statusTimelineTable.presentation": "Présentation",
|
||||
"app.learningDashboard.statusTimelineTable.pageNumber": "Page",
|
||||
"app.learningDashboard.statusTimelineTable.setAt": "Régler à",
|
||||
"app.learningDashboard.errors.invalidToken": "Jeton de session invalide",
|
||||
"app.learningDashboard.errors.dataUnavailable": "Les données ne sont plus disponibles",
|
||||
"mobileApp.portals.list.empty.addFirstPortal.label": "Ajoutez votre premier portail en utilisant le bouton ci-dessus,",
|
||||
@ -1057,6 +1304,4 @@
|
||||
"mobileApp.portals.addPortalPopup.validation.emptyFields": "Champs requis",
|
||||
"mobileApp.portals.addPortalPopup.validation.portalNameAlreadyExists": "Ce nom est déjà utilisé",
|
||||
"mobileApp.portals.addPortalPopup.validation.urlInvalid": "Erreur de chargement de la page - vérifiez l'URL et la connexion réseau"
|
||||
|
||||
}
|
||||
|
||||
|
@ -246,6 +246,8 @@
|
||||
"app.presentationUploader.sent": "Enviado",
|
||||
"app.presentationUploader.exportingTimeout": "A exportación está tardando demasiado...",
|
||||
"app.presentationUploader.export": "Enviar para o chat",
|
||||
"app.presentationUploader.export.linkAvailable": "Ligazón para descargar {0} dispoñible no chat público.",
|
||||
"app.presentationUploader.export.notAccessibleWarning": "pode non ser accesible",
|
||||
"app.presentationUploader.currentPresentationLabel": "Presentación actual",
|
||||
"app.presentationUploder.extraHint": "IMPORTANTE: cada ficheiro non pode exceder {0} MB e {1} páxinas.",
|
||||
"app.presentationUploder.uploadLabel": "Enviar",
|
||||
@ -454,6 +456,68 @@
|
||||
"app.submenu.application.paginationEnabledLabel": "Paxinación do vídeo",
|
||||
"app.submenu.application.layoutOptionLabel": "Tipo de disposición",
|
||||
"app.submenu.application.pushLayoutLabel": "Forzar deseño",
|
||||
"app.submenu.application.localeDropdown.af": "Afrikaans",
|
||||
"app.submenu.application.localeDropdown.ar": "Árabe",
|
||||
"app.submenu.application.localeDropdown.az": "Azerbaiyano",
|
||||
"app.submenu.application.localeDropdown.bg-BG": "Búlgaro",
|
||||
"app.submenu.application.localeDropdown.bn": "Bengalí",
|
||||
"app.submenu.application.localeDropdown.ca": "Catalán",
|
||||
"app.submenu.application.localeDropdown.cs-CZ": "Checo",
|
||||
"app.submenu.application.localeDropdown.da": "Danés",
|
||||
"app.submenu.application.localeDropdown.de": "Alemán",
|
||||
"app.submenu.application.localeDropdown.dv": "Divehi",
|
||||
"app.submenu.application.localeDropdown.el-GR": "Grego (Grecia)",
|
||||
"app.submenu.application.localeDropdown.en": "Inglés",
|
||||
"app.submenu.application.localeDropdown.eo": "Esperanto",
|
||||
"app.submenu.application.localeDropdown.es": "Español",
|
||||
"app.submenu.application.localeDropdown.es-419": "Español (América Latina)",
|
||||
"app.submenu.application.localeDropdown.es-ES": "Español (España)",
|
||||
"app.submenu.application.localeDropdown.es-MX": "Español (México)",
|
||||
"app.submenu.application.localeDropdown.et": "Estonio",
|
||||
"app.submenu.application.localeDropdown.eu": "Vasco",
|
||||
"app.submenu.application.localeDropdown.fa-IR": "Persa",
|
||||
"app.submenu.application.localeDropdown.fi": "Finés",
|
||||
"app.submenu.application.localeDropdown.fr": "Francés",
|
||||
"app.submenu.application.localeDropdown.gl": "Galego",
|
||||
"app.submenu.application.localeDropdown.he": "Hebreo",
|
||||
"app.submenu.application.localeDropdown.hi-IN": "Hindi",
|
||||
"app.submenu.application.localeDropdown.hr": "Croata",
|
||||
"app.submenu.application.localeDropdown.hu-HU": "Húngaro",
|
||||
"app.submenu.application.localeDropdown.hy": "Armenio",
|
||||
"app.submenu.application.localeDropdown.id": "Indonesio",
|
||||
"app.submenu.application.localeDropdown.it-IT": "Italiano",
|
||||
"app.submenu.application.localeDropdown.ja": "Xaponés",
|
||||
"app.submenu.application.localeDropdown.ka": "Xeorxiano",
|
||||
"app.submenu.application.localeDropdown.km": "Khmer",
|
||||
"app.submenu.application.localeDropdown.kn": "Kannada",
|
||||
"app.submenu.application.localeDropdown.ko-KR": "Coreano (Corea)",
|
||||
"app.submenu.application.localeDropdown.lo-LA": "Laosiano",
|
||||
"app.submenu.application.localeDropdown.lt-LT": "Lituano",
|
||||
"app.submenu.application.localeDropdown.lv": "Letón",
|
||||
"app.submenu.application.localeDropdown.ml": "Malayalam",
|
||||
"app.submenu.application.localeDropdown.mn-MN": "Mongol",
|
||||
"app.submenu.application.localeDropdown.nb-NO": "Noruegués (bokmal)",
|
||||
"app.submenu.application.localeDropdown.nl": "Holandés",
|
||||
"app.submenu.application.localeDropdown.oc": "Occitano",
|
||||
"app.submenu.application.localeDropdown.pl-PL": "Polaco",
|
||||
"app.submenu.application.localeDropdown.pt": "Portugués",
|
||||
"app.submenu.application.localeDropdown.pt-BR": "Portugués (Brasil)",
|
||||
"app.submenu.application.localeDropdown.ro-RO": "Romanés",
|
||||
"app.submenu.application.localeDropdown.ru": "Ruso",
|
||||
"app.submenu.application.localeDropdown.sk-SK": "Eslovaco (Eslovaquia)",
|
||||
"app.submenu.application.localeDropdown.sl": "Esloveno",
|
||||
"app.submenu.application.localeDropdown.sr": "Serbio",
|
||||
"app.submenu.application.localeDropdown.sv-SE": "Sueco",
|
||||
"app.submenu.application.localeDropdown.ta": "Támil",
|
||||
"app.submenu.application.localeDropdown.te": "Telugú",
|
||||
"app.submenu.application.localeDropdown.th": "Tailandés",
|
||||
"app.submenu.application.localeDropdown.tr": "Turco",
|
||||
"app.submenu.application.localeDropdown.tr-TR": "Turco (Turquía)",
|
||||
"app.submenu.application.localeDropdown.uk-UA": "Ucraíno",
|
||||
"app.submenu.application.localeDropdown.vi": "Vietnamita",
|
||||
"app.submenu.application.localeDropdown.vi-VN": "Vietnamita (Vietnam)",
|
||||
"app.submenu.application.localeDropdown.zh-CN": "Chinés simplificado (China)",
|
||||
"app.submenu.application.localeDropdown.zh-TW": "Chinés tradicional (Taiwán)",
|
||||
"app.submenu.notification.SectionTitle": "Notificacións",
|
||||
"app.submenu.notification.Desc": "Definir como e que se lle notificará.",
|
||||
"app.submenu.notification.audioAlertLabel": "Avisos sonoros",
|
||||
|
@ -246,6 +246,8 @@
|
||||
"app.presentationUploader.sent": "Ուղարկված է",
|
||||
"app.presentationUploader.exportingTimeout": "Արտահանումը տևում շատ երկար․․․",
|
||||
"app.presentationUploader.export": "Ուղարկել զրուցարան",
|
||||
"app.presentationUploader.export.linkAvailable": " {0}-ի բեռնելու հղումը հասանելի է ընդհանուր զրուցարանում։",
|
||||
"app.presentationUploader.export.notAccessibleWarning": "կարող է թույլատրված չլինել",
|
||||
"app.presentationUploader.currentPresentationLabel": "Ընթացիկ ներկայացումը",
|
||||
"app.presentationUploder.extraHint": "ԿԱՐԵՎՈՐ - յուրաքանչյուր ֆայլը չպետք է գերազանցի ֆայլը {0} մեգաբայթը և {1} էջերի քանակը։",
|
||||
"app.presentationUploder.uploadLabel": "Բեռնել",
|
||||
@ -454,6 +456,68 @@
|
||||
"app.submenu.application.paginationEnabledLabel": "Տեսանյութի մասնատում",
|
||||
"app.submenu.application.layoutOptionLabel": "Դասավորվածության տեսակը",
|
||||
"app.submenu.application.pushLayoutLabel": "Push դասավորվածություն",
|
||||
"app.submenu.application.localeDropdown.af": "Աֆրիկերեն",
|
||||
"app.submenu.application.localeDropdown.ar": "Արաբերեն",
|
||||
"app.submenu.application.localeDropdown.az": "Նոր հորինված լեզու",
|
||||
"app.submenu.application.localeDropdown.bg-BG": "Բուլղարերեն",
|
||||
"app.submenu.application.localeDropdown.bn": "Բենգալի",
|
||||
"app.submenu.application.localeDropdown.ca": "Կատալոներեն",
|
||||
"app.submenu.application.localeDropdown.cs-CZ": "Չեխերեն",
|
||||
"app.submenu.application.localeDropdown.da": "Դանիերեն",
|
||||
"app.submenu.application.localeDropdown.de": "Գերմաներեն",
|
||||
"app.submenu.application.localeDropdown.dv": "Դիվեհի",
|
||||
"app.submenu.application.localeDropdown.el-GR": "Հունարեն",
|
||||
"app.submenu.application.localeDropdown.en": "Անգլերեն",
|
||||
"app.submenu.application.localeDropdown.eo": "Էսպերանտո",
|
||||
"app.submenu.application.localeDropdown.es": "Իսպաներեն",
|
||||
"app.submenu.application.localeDropdown.es-419": "Իսպաներեն (Լատինամերիկյան)",
|
||||
"app.submenu.application.localeDropdown.es-ES": "Իսպաներեն (Իսպանիա)",
|
||||
"app.submenu.application.localeDropdown.es-MX": "Իսպաներեն (Մեքսիկա)",
|
||||
"app.submenu.application.localeDropdown.et": "Էստոներեն",
|
||||
"app.submenu.application.localeDropdown.eu": "Բասկերեն",
|
||||
"app.submenu.application.localeDropdown.fa-IR": "Պարսկերեն",
|
||||
"app.submenu.application.localeDropdown.fi": "Ֆիներեն",
|
||||
"app.submenu.application.localeDropdown.fr": "Ֆրանսերեն",
|
||||
"app.submenu.application.localeDropdown.gl": "Գալիչի",
|
||||
"app.submenu.application.localeDropdown.he": "Եբրայերեն",
|
||||
"app.submenu.application.localeDropdown.hi-IN": "Հնդկերեն",
|
||||
"app.submenu.application.localeDropdown.hr": "Խորվաթերեն",
|
||||
"app.submenu.application.localeDropdown.hu-HU": "Հունագարերեն",
|
||||
"app.submenu.application.localeDropdown.hy": "Հայերեն",
|
||||
"app.submenu.application.localeDropdown.id": "Ինդոնեզերեն",
|
||||
"app.submenu.application.localeDropdown.it-IT": "Իտալերեն",
|
||||
"app.submenu.application.localeDropdown.ja": "Ճապոներեն",
|
||||
"app.submenu.application.localeDropdown.ka": "Վրացերեն",
|
||||
"app.submenu.application.localeDropdown.km": "Խմերի",
|
||||
"app.submenu.application.localeDropdown.kn": "Կաննադա",
|
||||
"app.submenu.application.localeDropdown.ko-KR": "Կորերեն (Կորեա)",
|
||||
"app.submenu.application.localeDropdown.lo-LA": "Լաո",
|
||||
"app.submenu.application.localeDropdown.lt-LT": "Լիտվերեն",
|
||||
"app.submenu.application.localeDropdown.lv": "Լատվերեն",
|
||||
"app.submenu.application.localeDropdown.ml": "Մալայալամ",
|
||||
"app.submenu.application.localeDropdown.mn-MN": "Մոնղոլերեն",
|
||||
"app.submenu.application.localeDropdown.nb-NO": "Նորվեգերեն (բոկմալ)",
|
||||
"app.submenu.application.localeDropdown.nl": "Հոլանդերեն",
|
||||
"app.submenu.application.localeDropdown.oc": "Օքսիտաներեն",
|
||||
"app.submenu.application.localeDropdown.pl-PL": "Լեհերեն",
|
||||
"app.submenu.application.localeDropdown.pt": "Պորտուգալերեն",
|
||||
"app.submenu.application.localeDropdown.pt-BR": "Պորտուգալերեն (Բրազիլիա)",
|
||||
"app.submenu.application.localeDropdown.ro-RO": "Ռումիներեն",
|
||||
"app.submenu.application.localeDropdown.ru": "Ռուսերեն",
|
||||
"app.submenu.application.localeDropdown.sk-SK": "Սլովակերեն (Սլովակիա)",
|
||||
"app.submenu.application.localeDropdown.sl": "Սլովեներեն",
|
||||
"app.submenu.application.localeDropdown.sr": "Սերբերեն",
|
||||
"app.submenu.application.localeDropdown.sv-SE": "Շվեդերեն",
|
||||
"app.submenu.application.localeDropdown.ta": "Թամիլերեն",
|
||||
"app.submenu.application.localeDropdown.te": "Թելուգու",
|
||||
"app.submenu.application.localeDropdown.th": "Թայլաներեն",
|
||||
"app.submenu.application.localeDropdown.tr": "Թուրքերեն",
|
||||
"app.submenu.application.localeDropdown.tr-TR": "Թուրքերեն (Թուրքիա)",
|
||||
"app.submenu.application.localeDropdown.uk-UA": "Ուկրաիներեն",
|
||||
"app.submenu.application.localeDropdown.vi": "Վիետնամերեն",
|
||||
"app.submenu.application.localeDropdown.vi-VN": "Վիետնամերեն (Վիետնամ)",
|
||||
"app.submenu.application.localeDropdown.zh-CN": "Չինարեն պարզեցված (Չինաստան)",
|
||||
"app.submenu.application.localeDropdown.zh-TW": "Ավանդական չինարեն (Թայվան)",
|
||||
"app.submenu.notification.SectionTitle": "Ծանուցումներ",
|
||||
"app.submenu.notification.Desc": "Սահմանել, թե երբ և ինչի մասին ծանուցվեք",
|
||||
"app.submenu.notification.audioAlertLabel": "Ձայնային ծանուցումներ",
|
||||
|
@ -3,8 +3,8 @@
|
||||
"app.chat.submitLabel": "メッセージを送信",
|
||||
"app.chat.loading": "チャットメッセージをロードしています: {0}%",
|
||||
"app.chat.errorMaxMessageLength": "メッセージが長すぎます。最大の{0}文字を超えています",
|
||||
"app.chat.disconnected": "通信が切断されたため、メッセージを送れません",
|
||||
"app.chat.locked": "チャットがロック状態のため、メッセージを送れません",
|
||||
"app.chat.disconnected": "通信が切断されたため、メッセージを送ることができません",
|
||||
"app.chat.locked": "チャットがロック状態のため、メッセージを送ることができません",
|
||||
"app.chat.inputLabel": "チャット {0} へメッセージ入力",
|
||||
"app.chat.emojiButtonLabel": "絵文字選択",
|
||||
"app.chat.inputPlaceholder": "メッセージ{0}",
|
||||
@ -28,8 +28,8 @@
|
||||
"app.chat.multi.typing": "複数の人が入力中",
|
||||
"app.chat.one.typing": "{0}が入力中",
|
||||
"app.chat.two.typing": "{0}と{1}が入力中",
|
||||
"app.chat.copySuccess": "チャットの記録がコピーされました",
|
||||
"app.chat.copyErr": "チャット記録のコピーに失敗しました",
|
||||
"app.chat.copySuccess": "チャットのやりとりがコピーされました",
|
||||
"app.chat.copyErr": "チャットのやりとりのコピーに失敗しました",
|
||||
"app.emojiPicker.search": "検索",
|
||||
"app.emojiPicker.notFound": "絵文字が見つかりません",
|
||||
"app.emojiPicker.skintext": "標準の肌の色を選択",
|
||||
@ -246,6 +246,8 @@
|
||||
"app.presentationUploader.sent": "送信終了",
|
||||
"app.presentationUploader.exportingTimeout": "エクスポートに時間がかかりすぎています...",
|
||||
"app.presentationUploader.export": "チャットへ送信",
|
||||
"app.presentationUploader.export.linkAvailable": "{0}をダウンロードするためのリンクが、公開チャットから利用できます。",
|
||||
"app.presentationUploader.export.notAccessibleWarning": "にはアクセスできないようです",
|
||||
"app.presentationUploader.currentPresentationLabel": "プレゼンテーションファイル",
|
||||
"app.presentationUploder.extraHint": "重要:それぞれのファイルが{0}MB、{1}ページを超えないようにしてください。",
|
||||
"app.presentationUploder.uploadLabel": "アップロード",
|
||||
@ -409,7 +411,7 @@
|
||||
"app.endMeeting.description": "この操作により、会議を終了します。まだ{0}人が参加していますが本当に構いませんか?",
|
||||
"app.endMeeting.noUserDescription": "本当にこの会議を終了しますか?",
|
||||
"app.endMeeting.contentWarning": "この会議のチャットメッセージ、共有メモ、ホワイトボードの書き込み、そして共有ドキュメントにはもうアクセスできなくなります",
|
||||
"app.endMeeting.yesLabel": "ユーザー全員を退室させる",
|
||||
"app.endMeeting.yesLabel": "はい、全員退室させて終了します",
|
||||
"app.endMeeting.noLabel": "いいえ",
|
||||
"app.about.title": "このソフトウェアについて",
|
||||
"app.about.version": "ビルド番号:",
|
||||
@ -454,6 +456,68 @@
|
||||
"app.submenu.application.paginationEnabledLabel": "ビデオのページ付け",
|
||||
"app.submenu.application.layoutOptionLabel": "レイアウトのタイプ",
|
||||
"app.submenu.application.pushLayoutLabel": "レイアウトを強制",
|
||||
"app.submenu.application.localeDropdown.af": "アフリカーンス語",
|
||||
"app.submenu.application.localeDropdown.ar": "アラビア語",
|
||||
"app.submenu.application.localeDropdown.az": "アゼルバイジャン語",
|
||||
"app.submenu.application.localeDropdown.bg-BG": "ブルガリア語",
|
||||
"app.submenu.application.localeDropdown.bn": "ベンガル語",
|
||||
"app.submenu.application.localeDropdown.ca": "カタルーニャ語",
|
||||
"app.submenu.application.localeDropdown.cs-CZ": "チェコ語",
|
||||
"app.submenu.application.localeDropdown.da": "デンマーク語",
|
||||
"app.submenu.application.localeDropdown.de": "ドイツ語",
|
||||
"app.submenu.application.localeDropdown.dv": "ディベヒ語",
|
||||
"app.submenu.application.localeDropdown.el-GR": "ギリシャ語(ギリシャ)",
|
||||
"app.submenu.application.localeDropdown.en": "英語",
|
||||
"app.submenu.application.localeDropdown.eo": "エスペラント語",
|
||||
"app.submenu.application.localeDropdown.es": "スペイン語",
|
||||
"app.submenu.application.localeDropdown.es-419": "スペイン語(南米)",
|
||||
"app.submenu.application.localeDropdown.es-ES": "スペイン語(スペイン)",
|
||||
"app.submenu.application.localeDropdown.es-MX": "スペイン語(メキシコ)",
|
||||
"app.submenu.application.localeDropdown.et": "エストニア語",
|
||||
"app.submenu.application.localeDropdown.eu": "バスク語",
|
||||
"app.submenu.application.localeDropdown.fa-IR": "ペルシャ語",
|
||||
"app.submenu.application.localeDropdown.fi": "フィンランド語",
|
||||
"app.submenu.application.localeDropdown.fr": "フランス語",
|
||||
"app.submenu.application.localeDropdown.gl": "ガリシア語",
|
||||
"app.submenu.application.localeDropdown.he": "ヘブライ語",
|
||||
"app.submenu.application.localeDropdown.hi-IN": "ヒンズー語",
|
||||
"app.submenu.application.localeDropdown.hr": "クロアチア語",
|
||||
"app.submenu.application.localeDropdown.hu-HU": "ハンガリア語",
|
||||
"app.submenu.application.localeDropdown.hy": "アルメニア語",
|
||||
"app.submenu.application.localeDropdown.id": "インドネシア語",
|
||||
"app.submenu.application.localeDropdown.it-IT": "イタリア語",
|
||||
"app.submenu.application.localeDropdown.ja": "日本語",
|
||||
"app.submenu.application.localeDropdown.ka": "ジョージア語",
|
||||
"app.submenu.application.localeDropdown.km": "クメール語",
|
||||
"app.submenu.application.localeDropdown.kn": "カンナダ語",
|
||||
"app.submenu.application.localeDropdown.ko-KR": "韓国語(韓国)",
|
||||
"app.submenu.application.localeDropdown.lo-LA": "ラオス語",
|
||||
"app.submenu.application.localeDropdown.lt-LT": "リトアニア語",
|
||||
"app.submenu.application.localeDropdown.lv": "ラトビア語",
|
||||
"app.submenu.application.localeDropdown.ml": "マラヤーラム語",
|
||||
"app.submenu.application.localeDropdown.mn-MN": "モンゴル語",
|
||||
"app.submenu.application.localeDropdown.nb-NO": "ノルウェー語(ブークモール)",
|
||||
"app.submenu.application.localeDropdown.nl": "オランダ語",
|
||||
"app.submenu.application.localeDropdown.oc": "オック語",
|
||||
"app.submenu.application.localeDropdown.pl-PL": "ポーランド語",
|
||||
"app.submenu.application.localeDropdown.pt": "ポルトガル語",
|
||||
"app.submenu.application.localeDropdown.pt-BR": "ポルトガル語(ブラジル)",
|
||||
"app.submenu.application.localeDropdown.ro-RO": "ルーマニア語",
|
||||
"app.submenu.application.localeDropdown.ru": "ロシア語",
|
||||
"app.submenu.application.localeDropdown.sk-SK": "スロバキア語(スロバキア)",
|
||||
"app.submenu.application.localeDropdown.sl": "スロベニア語",
|
||||
"app.submenu.application.localeDropdown.sr": "セルビア語",
|
||||
"app.submenu.application.localeDropdown.sv-SE": "スウェーデン語",
|
||||
"app.submenu.application.localeDropdown.ta": "タミル語",
|
||||
"app.submenu.application.localeDropdown.te": "テルグ語",
|
||||
"app.submenu.application.localeDropdown.th": "タイ語",
|
||||
"app.submenu.application.localeDropdown.tr": "トルコ語",
|
||||
"app.submenu.application.localeDropdown.tr-TR": "トルコ語(トルコ)",
|
||||
"app.submenu.application.localeDropdown.uk-UA": "ウクライナ語",
|
||||
"app.submenu.application.localeDropdown.vi": "ベトナム語",
|
||||
"app.submenu.application.localeDropdown.vi-VN": "ベトナム語(ベトナム)",
|
||||
"app.submenu.application.localeDropdown.zh-CN": "中国語(中国)",
|
||||
"app.submenu.application.localeDropdown.zh-TW": "中国語(台湾)",
|
||||
"app.submenu.notification.SectionTitle": "通知",
|
||||
"app.submenu.notification.Desc": "何をどのように通知するかを設定できます。",
|
||||
"app.submenu.notification.audioAlertLabel": "音声通知",
|
||||
@ -1162,7 +1226,7 @@
|
||||
"playback.player.presentation.wrapper.aria": "プレゼンエリア",
|
||||
"playback.player.screenshare.wrapper.aria": "画面共有エリア",
|
||||
"playback.player.search.modal.title": "検索",
|
||||
"playback.player.search.modal.subtitle": "プレゼンスライドの内容を探す",
|
||||
"playback.player.search.modal.subtitle": "スライドのテキストを検索",
|
||||
"playback.player.thumbnails.wrapper.aria": "サムネイルエリア",
|
||||
"playback.player.webcams.wrapper.aria": "ウェブカムエリア",
|
||||
"app.learningDashboard.dashboardTitle": "参加状況分析ボード",
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -2,10 +2,11 @@
|
||||
"app.home.greeting": "Вітаємо! Ваша презентація почнеться найближчим часом... ",
|
||||
"app.chat.submitLabel": "Надіслати повідомлення",
|
||||
"app.chat.loading": "Завантажено повідомлень чату: {0}%",
|
||||
"app.chat.errorMaxMessageLength": "Повідомлення є довшим допустимого на {0} символів",
|
||||
"app.chat.errorMaxMessageLength": "Повідомлення занадто довге та перевищило {0} символів",
|
||||
"app.chat.disconnected": "Ви від'єднались, повідомлення не можуть бути надіслані",
|
||||
"app.chat.locked": "Чат заблоковано, неможливо надіслати повідомлення",
|
||||
"app.chat.inputLabel": "Текст повідомлення у чаті з {0}",
|
||||
"app.chat.emojiButtonLabel": "Підібрати емоджі",
|
||||
"app.chat.inputPlaceholder": "Повідомлення {0}",
|
||||
"app.chat.titlePublic": "Загальний чат",
|
||||
"app.chat.titlePrivate": "Приватний чат з {0}",
|
||||
@ -21,6 +22,7 @@
|
||||
"app.chat.offline": "Не в мережі",
|
||||
"app.chat.pollResult": "Результати опитування",
|
||||
"app.chat.breakoutDurationUpdated": "Час перерви зараз - {0} хвилин",
|
||||
"app.chat.breakoutDurationUpdatedModerator": "Час у тимчасових кімнатах {0} хвилин, сповіщення надіслане.",
|
||||
"app.chat.emptyLogLabel": "Журнал чату порожній",
|
||||
"app.chat.clearPublicChatMessage": "Історію загального чату очищено модератором",
|
||||
"app.chat.multi.typing": "Учасники пишуть",
|
||||
@ -28,6 +30,27 @@
|
||||
"app.chat.two.typing": "{0} і {1} набирають",
|
||||
"app.chat.copySuccess": "Стенограму чату скопійовано",
|
||||
"app.chat.copyErr": "Скопіювати стенограму чату не вдалось",
|
||||
"app.emojiPicker.search": "Пошук",
|
||||
"app.emojiPicker.notFound": "Емоджі не знайдено",
|
||||
"app.emojiPicker.skintext": "Відтінок шкіри",
|
||||
"app.emojiPicker.clear": "Очистити",
|
||||
"app.emojiPicker.categories.label": "Категорії емоджі",
|
||||
"app.emojiPicker.categories.people": "Люди та тіло",
|
||||
"app.emojiPicker.categories.nature": "Природа та звірі",
|
||||
"app.emojiPicker.categories.foods": "Їжа та напої",
|
||||
"app.emojiPicker.categories.places": "Подорожі та місця",
|
||||
"app.emojiPicker.categories.activity": "Заняття",
|
||||
"app.emojiPicker.categories.objects": "Об'єкти",
|
||||
"app.emojiPicker.categories.symbols": "Символи",
|
||||
"app.emojiPicker.categories.flags": "Прапори",
|
||||
"app.emojiPicker.categories.recent": "Часто вживані",
|
||||
"app.emojiPicker.categories.search": "Результати пошуку",
|
||||
"app.emojiPicker.skintones.1": "Колір шкіри по замовчуванню",
|
||||
"app.emojiPicker.skintones.2": "Світла шкіра",
|
||||
"app.emojiPicker.skintones.3": "Смуглява шкіра",
|
||||
"app.emojiPicker.skintones.4": "Смугла шкіра",
|
||||
"app.emojiPicker.skintones.5": "Темносмугла шкіра",
|
||||
"app.emojiPicker.skintones.6": "Темна шкіра",
|
||||
"app.captions.label": "Субтитри",
|
||||
"app.captions.menu.close": "Закрити",
|
||||
"app.captions.menu.start": "Почати",
|
||||
@ -53,12 +76,21 @@
|
||||
"app.captions.speech.start": "Розпочато розпізнавання голосу",
|
||||
"app.captions.speech.stop": "Зупинено розпізнавання голосу",
|
||||
"app.captions.speech.error": "Розпізнавання голосу зупинено через несумісний браузер чи тривалий час тиші",
|
||||
"app.confirmation.skipConfirm": "Не запитувати знову",
|
||||
"app.confirmation.virtualBackground.title": "Запустити штучний фон",
|
||||
"app.confirmation.virtualBackground.description": "{0} буде додано як штучний фон. Продовжуємо?",
|
||||
"app.confirmationModal.yesLabel": "Так",
|
||||
"app.textInput.sendLabel": "Відіслати",
|
||||
"app.title.defaultViewLabel": "Стандартний вигляд презентації",
|
||||
"app.notes.title": "Спільні нотатки",
|
||||
"app.notes.label": "Нотатки",
|
||||
"app.notes.hide": "Сховати нотатки",
|
||||
"app.notes.locked": "Заблоковано",
|
||||
"app.notes.disabled": "Закріплено на носієві",
|
||||
"app.notes.notesDropdown.covertAndUpload": "Перетворити нотатки у презентацію",
|
||||
"app.notes.notesDropdown.pinNotes": "Закріпити нотатки на білій дошці",
|
||||
"app.notes.notesDropdown.unpinNotes": "Відкріпити нотатки",
|
||||
"app.notes.notesDropdown.notesOptions": "Більше налаштувань",
|
||||
"app.pads.hint": "Натисніть Esc для переходу у панель інструментів",
|
||||
"app.user.activityCheck": "Перевірка активності учасника",
|
||||
"app.user.activityCheck.label": "Перевірте, чи учасник зараз на зустрiчi ({0})",
|
||||
@ -72,7 +104,7 @@
|
||||
"app.userList.presenter": "Ведучий",
|
||||
"app.userList.you": "Ви",
|
||||
"app.userList.locked": "Обмежено",
|
||||
"app.userList.byModerator": "(модератор)",
|
||||
"app.userList.byModerator": "модератором",
|
||||
"app.userList.label": "Список учасників",
|
||||
"app.userList.toggleCompactView.label": "Увімкнути/вимкнути компактний вид",
|
||||
"app.userList.moderator": "Модератор",
|
||||
@ -96,7 +128,7 @@
|
||||
"app.userList.menu.ejectUserCameras.label": "Відключити вебкамери",
|
||||
"app.userList.userAriaLabel": "{0} {1} {2} Статус {3}",
|
||||
"app.userList.menu.promoteUser.label": "Зробити модератором",
|
||||
"app.userList.menu.demoteUser.label": "Понизити до глядача",
|
||||
"app.userList.menu.demoteUser.label": "Зробити глядачем",
|
||||
"app.userList.menu.unlockUser.label": "Зняти обмеження для {0}",
|
||||
"app.userList.menu.lockUser.label": "Обмежити можливості для {0}",
|
||||
"app.userList.menu.directoryLookup.label": "Пошук у каталозі",
|
||||
@ -148,7 +180,7 @@
|
||||
"app.screenshare.presenterSharingLabel": "Тепер ви демонструєте свій екран",
|
||||
"app.screenshare.screenshareFinalError": "Код {0}. Неможливо відобразити екран",
|
||||
"app.screenshare.screenshareRetryError": "Код {0}. Спробуйте показати екран знову",
|
||||
"app.screenshare.screenshareRetryOtherEnvError": "Код {0}. Неможливо відобразити екран. Спробуйте знову з іншим браузером або пристроєм",
|
||||
"app.screenshare.screenshareRetryOtherEnvError": "Код {0}. Неможливо показати екран. Спробуйте знову з іншим браузером або пристроєм",
|
||||
"app.screenshare.screenshareUnsupportedEnv": "Код {0}. Браузер не підтримується. Спробуйте знову з іншим браузером або пристроєм",
|
||||
"app.screenshare.screensharePermissionError": "Код {0}. Необхідно надати дозвіл на показ екрану.",
|
||||
"app.meeting.ended": "Цей сеанс завершився",
|
||||
@ -161,7 +193,7 @@
|
||||
"app.meeting.alertMeetingEndsUnderMinutesSingular": "Зустріч завершується за 1 хв.",
|
||||
"app.meeting.alertMeetingEndsUnderMinutesPlural": "Зустріч завершується за {0} хв.",
|
||||
"app.meeting.alertBreakoutEndsUnderMinutesPlural": "Перерва закінчиться за {0} хв.",
|
||||
"app.meeting.alertBreakoutEndsUnderMinutesSingular": "Перерва закінчиться за 1 хв.",
|
||||
"app.meeting.alertBreakoutEndsUnderMinutesSingular": "Перерва закінчиться за хвилину.",
|
||||
"app.presentation.hide": "Приховати презентацію",
|
||||
"app.presentation.notificationLabel": "Поточна презентація",
|
||||
"app.presentation.downloadLabel": "Завантажити",
|
||||
@ -170,7 +202,7 @@
|
||||
"app.presentation.endSlideContent": "Кінець вмісту слайду",
|
||||
"app.presentation.changedSlideContent": "Слайд: {0}",
|
||||
"app.presentation.emptySlideContent": "Даний слайд порожній",
|
||||
"app.presentation.options.fullscreen": "Повний екран",
|
||||
"app.presentation.options.fullscreen": "Повноекранна презентація",
|
||||
"app.presentation.options.exitFullscreen": "Вихід з повного екрану",
|
||||
"app.presentation.options.minimize": "Мінімізувати",
|
||||
"app.presentation.options.snapshot": "Знімок поточного слайду",
|
||||
@ -203,7 +235,20 @@
|
||||
"app.presentation.presentationToolbar.goToSlide": "Слайд {0}",
|
||||
"app.presentation.placeholder": "Немає активної презентації",
|
||||
"app.presentationUploder.title": "Презентація",
|
||||
"app.presentationUploder.message": "Ведучий може завантажувати будь-який документ офісного формату, включно PDF. Ми рекомендуємо завантажувати презентації саме у форматі PDF. Після завантаження поставте прапорець навпроти імені файлу, який ви хочете показати учасникам.",
|
||||
"app.presentationUploder.message": "У ролі доповідача у вас є можливість завантажити будь який офісний документ або PDF файл. Ми рекомендуємо PDF файли для кращої сумісності. Переконайтесь, що презентація помічена як обрана для показу на дошці ліворуч від імені файлу.",
|
||||
"app.presentationUploader.exportHint": "Обираючи «Надіслати в чат» слухачами буде отримане посилання із анотаціями придатне для завантаження.",
|
||||
"app.presentationUploader.exportToastHeader": "Надсилання у чат ({0} елемент)",
|
||||
"app.presentationUploader.exportToastHeaderPlural": "Надсилання у чат ({0} елементів)",
|
||||
"app.presentationUploader.exporting": "Надсилання у чат",
|
||||
"app.presentationUploader.sending": "Надсилання...",
|
||||
"app.presentationUploader.collecting": "Обробка слайду {0} із {1}...",
|
||||
"app.presentationUploader.processing": "Анотування слайду {0} із {1}...",
|
||||
"app.presentationUploader.sent": "Надіслано",
|
||||
"app.presentationUploader.exportingTimeout": "Експорт займе певний час...",
|
||||
"app.presentationUploader.export": "Надіслати у чат",
|
||||
"app.presentationUploader.export.linkAvailable": "Посилання для завантаження {0} доступне у публічному чаті.",
|
||||
"app.presentationUploader.export.notAccessibleWarning": "може бути недоступним",
|
||||
"app.presentationUploader.currentPresentationLabel": "Поточна презентація",
|
||||
"app.presentationUploder.extraHint": "Важливо: кожен файл має бути не більший за {0} MB та {1} сторінок",
|
||||
"app.presentationUploder.uploadLabel": "Завантажити",
|
||||
"app.presentationUploder.confirmLabel": "Підтвердити",
|
||||
@ -214,32 +259,34 @@
|
||||
"app.presentationUploder.dropzoneImagesLabel": "Для завантаження перетягніть сюди зображення",
|
||||
"app.presentationUploder.browseFilesLabel": "або виберіть файл",
|
||||
"app.presentationUploder.browseImagesLabel": "або виберіть/захопіть зображення",
|
||||
"app.presentationUploder.externalUploadTitle": "Додати вміст із сторонніх додатків ",
|
||||
"app.presentationUploder.externalUploadLabel": "Обрати файли",
|
||||
"app.presentationUploder.fileToUpload": "Буде завантажено ...",
|
||||
"app.presentationUploder.currentBadge": "Поточний",
|
||||
"app.presentationUploder.rejectedError": "Неможливо завантажити вибрані файл(и). Перевірте тип файлу(iв).",
|
||||
"app.presentationUploder.connectionClosedError": "Перервано через поганий зв'язок. Спробуйте пізніше",
|
||||
"app.presentationUploder.upload.progress": "Завантаження ({0}%)",
|
||||
"app.presentationUploder.upload.413": "Файл надто великий, розмір перевищує допустимі {0} МБ",
|
||||
"app.presentationUploder.genericError": "Ой лишенько! Щось пішло не так ...",
|
||||
"app.presentationUploder.genericError": "Йой! Щось пішло не так ...",
|
||||
"app.presentationUploder.upload.408": "Вичерпано час запиту дії токену для завантаження.",
|
||||
"app.presentationUploder.upload.404": "404: Неправильний токен для завантаження",
|
||||
"app.presentationUploder.upload.401": "Не вдалося здійснити запит токену для завантаження презентації.",
|
||||
"app.presentationUploder.conversion.conversionProcessingSlides": "Обробка сторінки {0} з {1}",
|
||||
"app.presentationUploder.conversion.genericConversionStatus": "Файл конвертується...",
|
||||
"app.presentationUploder.conversion.genericConversionStatus": "Конвертування файлу...",
|
||||
"app.presentationUploder.conversion.generatingThumbnail": "Створення мініатюр...",
|
||||
"app.presentationUploder.conversion.generatedSlides": "Слайди створюються...",
|
||||
"app.presentationUploder.conversion.generatedSlides": "Створення слайдів...",
|
||||
"app.presentationUploder.conversion.generatingSvg": "Створення зображень SVG...",
|
||||
"app.presentationUploder.conversion.pageCountExceeded": "Кількість сторінок перевищує максимальну кількість {0}",
|
||||
"app.presentationUploder.conversion.invalidMimeType": "Виявлено неправильний формат (розширення подане як {0} але вміст є {1})",
|
||||
"app.presentationUploder.conversion.conversionTimeout": "Слайд {0} не може бути оброблений з {1} спроб.",
|
||||
"app.presentationUploder.conversion.officeDocConversionInvalid": "Не вийшло опрацювати документ. Будь ласка, завантажте файл у форматі PDF.",
|
||||
"app.presentationUploder.conversion.officeDocConversionFailed": "Не вийшло опрацювати документ. Будь ласка, завантажте файл у форматі PDF.",
|
||||
"app.presentationUploder.conversion.pdfHasBigPage": "Не вдалось конвертувати файл PDF, будь ласка, спробуйте його покращити. Максимальний розмір сторінки {0} ",
|
||||
"app.presentationUploder.conversion.pdfHasBigPage": "Не вдалось конвертувати файл PDF, будь ласка, спробуйте його оптимізувати. Максимальний розмір {0} ",
|
||||
"app.presentationUploder.conversion.timeout": "Ой, перетворення займає надто багато часу",
|
||||
"app.presentationUploder.conversion.pageCountFailed": "Не вийшло визначити кількість сторінок.",
|
||||
"app.presentationUploder.conversion.unsupportedDocument": "Файли з таким розширенням не підтримуються",
|
||||
"app.presentationUploder.isDownloadableLabel": "Завантаження презентації заборонене - клікніть щоб дозволити завантажити презентацію",
|
||||
"app.presentationUploder.isNotDownloadableLabel": "Завантаження презентації дозволено - клікніть щоб заборонити завантажити презентацію",
|
||||
"app.presentationUploder.removePresentationLabel": "Вилучити презентацію",
|
||||
"app.presentationUploder.setAsCurrentPresentation": "Встановити презентацію поточною",
|
||||
"app.presentationUploder.setAsCurrentPresentation": "Встановити як поточну",
|
||||
"app.presentationUploder.tableHeading.filename": "Ім'я файлу",
|
||||
"app.presentationUploder.tableHeading.options": "Параметри",
|
||||
"app.presentationUploder.tableHeading.status": "Статус",
|
||||
@ -249,15 +296,19 @@
|
||||
"app.presentationUploder.item" : "елемент",
|
||||
"app.presentationUploder.itemPlural" : "елементів",
|
||||
"app.presentationUploder.clearErrors": "Очистити помилки",
|
||||
"app.presentationUploder.clearErrorsDesc": "Очищує помилки завантажень презентацій",
|
||||
"app.presentationUploder.clearErrorsDesc": "Очищує невдалі завантаження презентацій",
|
||||
"app.presentationUploder.uploadViewTitle": "Завантажити презентацію",
|
||||
"app.poll.questionAndoptions.label" : "У цій стрічці текст запитання для показу, дистрактори не обов'язкові.\nA. Правильний варіант *\nB. Дистрактор\nC. Дистрактор\nD. Дистрактор\nE. Дистрактор",
|
||||
"app.poll.customInput.label": "Довільний текст",
|
||||
"app.poll.customInputInstructions.label": "Довільний формат увімкнено — напишіть чи вставте запитання та варіант(и) у поданому форматі, або перетягніть та киньте сюди текстовий файл у такому форматі.",
|
||||
"app.poll.maxOptionsWarning.label": "Лише перші 5 варіантів можуть бути використані!",
|
||||
"app.poll.pollPaneTitle": "Опитування",
|
||||
"app.poll.enableMultipleResponseLabel": "Дозволити декілька відповідей від опитуваних?",
|
||||
"app.poll.enableMultipleResponseLabel": "Дозволити декілька відповідей від респондента?",
|
||||
"app.poll.quickPollTitle": "Швидке опитування",
|
||||
"app.poll.hidePollDesc": "Ховає панель меню опитувань",
|
||||
"app.poll.quickPollInstruction": "Виберіть типовий шаблон опитування.",
|
||||
"app.poll.activePollInstruction": "Залиште цю панель відкритою, щоб бачити відповіді на опитування в реальному часі. Коли будете готові, оберіть 'Опублікувати результати опитування', щоб зробити результати доступними учасникам і таким чином завершити опитування.",
|
||||
"app.poll.dragDropPollInstruction": "Для заповнення значень голосування, перетягніть текстовий файл зі значеннями у підсвічене поле",
|
||||
"app.poll.hidePollDesc": "Ховає панель опитувань",
|
||||
"app.poll.quickPollInstruction": "Виберіть варіант для початку опитування.",
|
||||
"app.poll.activePollInstruction": "Залиште цю панель відкритою, щоб бачити відповіді вживу на ваше опитування. Коли будете готові, оберіть «Опублікувати результати опитування», щоб зробити результати доступними учасникам і таким чином завершити опитування.",
|
||||
"app.poll.dragDropPollInstruction": "Для заповнення варіантів відповідей, перетягніть текстовий файл із відповідями у підсвічене поле",
|
||||
"app.poll.customPollTextArea": "Заповнити значення голосування",
|
||||
"app.poll.publishLabel": "Опублікувати опитування",
|
||||
"app.poll.cancelPollLabel": "Скасувати",
|
||||
@ -270,24 +321,24 @@
|
||||
"app.poll.clickHereToSelect": "Клацніть тут для вибору",
|
||||
"app.poll.question.label" : "Напишіть ваше запитання...",
|
||||
"app.poll.optionalQuestion.label" : "Напишіть ваше запитання (за потреби)...",
|
||||
"app.poll.userResponse.label" : "Відповіть користувача",
|
||||
"app.poll.userResponse.label" : "Надрукована відповідь",
|
||||
"app.poll.responseTypes.label" : "Типи відповідей",
|
||||
"app.poll.optionDelete.label" : "Видалити",
|
||||
"app.poll.responseChoices.label" : "Варіанти відповідей",
|
||||
"app.poll.typedResponse.desc" : "Користувачі матимуть текстове поле для вводу відповіді",
|
||||
"app.poll.addItem.label" : "Додати",
|
||||
"app.poll.start.label" : "Почати голосування",
|
||||
"app.poll.addItem.label" : "Додати елемент",
|
||||
"app.poll.start.label" : "Почати опитування",
|
||||
"app.poll.secretPoll.label" : "Анонімне опитування",
|
||||
"app.poll.secretPoll.isSecretLabel": "Опитування анонімне - ви не будете бачити окремих відповідей",
|
||||
"app.poll.questionErr": "Потрібно вказати запитання",
|
||||
"app.poll.optionErr": "Введіть варіант опитування",
|
||||
"app.poll.secretPoll.isSecretLabel": "Опитування анонімне — ви не будете бачити окремих відповідей",
|
||||
"app.poll.questionErr": "Потрібно вказати запитання.",
|
||||
"app.poll.optionErr": "Введіть варіант відповіді",
|
||||
"app.poll.startPollDesc": "Розпочинає опитування",
|
||||
"app.poll.showRespDesc": "Показує налаштування відповідей",
|
||||
"app.poll.addRespDesc": "Додати поле відповіді в опитування",
|
||||
"app.poll.addRespDesc": "Додає поле відповіді в опитуванні",
|
||||
"app.poll.deleteRespDesc": "Видаляє варіант {0}",
|
||||
"app.poll.t": "Дійсно",
|
||||
"app.poll.t": "Правильно",
|
||||
"app.poll.f": "Хибно",
|
||||
"app.poll.tf": "Дійсно / хибно",
|
||||
"app.poll.tf": "Правильно / Хибно",
|
||||
"app.poll.y": "Так",
|
||||
"app.poll.n": "Ні",
|
||||
"app.poll.abstention": "Утримуюсь",
|
||||
@ -296,29 +347,29 @@
|
||||
"app.poll.a3": "A / B / C",
|
||||
"app.poll.a4": "A / B / C / D",
|
||||
"app.poll.a5": "A / B / C / D / E",
|
||||
"app.poll.answer.true": "Дійсно",
|
||||
"app.poll.answer.true": "Правильно",
|
||||
"app.poll.answer.false": "Хибно",
|
||||
"app.poll.answer.yes": "Так",
|
||||
"app.poll.answer.no": "Ні",
|
||||
"app.poll.answer.abstention": "Утримуюсь",
|
||||
"app.poll.answer.a": "А",
|
||||
"app.poll.answer.b": "Б",
|
||||
"app.poll.answer.c": "В",
|
||||
"app.poll.answer.d": "Г",
|
||||
"app.poll.answer.e": "Ґ",
|
||||
"app.poll.answer.a": "A",
|
||||
"app.poll.answer.b": "B",
|
||||
"app.poll.answer.c": "C",
|
||||
"app.poll.answer.d": "D",
|
||||
"app.poll.answer.e": "E",
|
||||
"app.poll.liveResult.usersTitle": "Учасники",
|
||||
"app.poll.liveResult.responsesTitle": "Відповідь",
|
||||
"app.poll.liveResult.secretLabel": "Це анонімне опитування. Окремі відповіді не показано.",
|
||||
"app.poll.removePollOpt": "Видалено варіант відповіді {0}",
|
||||
"app.poll.emptyPollOpt": "Порожньо",
|
||||
"app.polling.pollingTitle": "Варіанти опитування",
|
||||
"app.polling.pollQuestionTitle": "Питання голосування",
|
||||
"app.polling.pollingTitle": "Варіанти відповіді",
|
||||
"app.polling.pollQuestionTitle": "Текст запитання",
|
||||
"app.polling.submitLabel": "Відправити",
|
||||
"app.polling.submitAriaLabel": "Відправити відповідь на голосування",
|
||||
"app.polling.submitAriaLabel": "Відправити відповіді",
|
||||
"app.polling.responsePlaceholder": "Введіть відповідь",
|
||||
"app.polling.responseSecret": "Анонімне опитування - ведучий не може бачити вашої відповіді.",
|
||||
"app.polling.responseNotSecret": "Звичайне опитування - ведучий може бачити вашу відповідь.",
|
||||
"app.polling.pollAnswerLabel": "Відповідь опитування {0}",
|
||||
"app.polling.responseSecret": "Це анонімне опитування — викладач не бачитиме вашої відповіді окремо.",
|
||||
"app.polling.responseNotSecret": "Звичайне опитування — викладач може окремо бачити вашу відповідь.",
|
||||
"app.polling.pollAnswerLabel": "Відповідь {0}",
|
||||
"app.polling.pollAnswerDesc": "Виберіть цей варіант щоб проголосувати за {0}",
|
||||
"app.failedMessage": "Вибачте, проблеми з підключенням до сервера.",
|
||||
"app.downloadPresentationButton.label": "Звантажити оригінал презентації",
|
||||
@ -326,12 +377,12 @@
|
||||
"app.waitingMessage": "Втрачено з'єднання. Спроба повторного з'єднання через {0} секунд...",
|
||||
"app.retryNow": "Повторити",
|
||||
"app.muteWarning.label": "Натисніть {0} щоб вас почули інші",
|
||||
"app.muteWarning.disableMessage": "Сповіщення про вимкнення мікрофона вимкнено до його увімкнення",
|
||||
"app.muteWarning.tooltip": "Натисніть, щоб зачинити та вимкнути сповіщення до увімкнення мікрофона",
|
||||
"app.muteWarning.disableMessage": "Сповіщення про вимкнення мікрофона неактивні до їх увімкнення",
|
||||
"app.muteWarning.tooltip": "Прибрати попередження до наступного увімкнення",
|
||||
"app.navBar.settingsDropdown.optionsLabel": "Параметри",
|
||||
"app.navBar.settingsDropdown.fullscreenLabel": "На весь екран",
|
||||
"app.navBar.settingsDropdown.fullscreenLabel": "Повноекранний режим",
|
||||
"app.navBar.settingsDropdown.settingsLabel": "Налаштування",
|
||||
"app.navBar.settingsDropdown.aboutLabel": "Про застосунок",
|
||||
"app.navBar.settingsDropdown.aboutLabel": "Додаток",
|
||||
"app.navBar.settingsDropdown.leaveSessionLabel": "Залишити зустріч",
|
||||
"app.navBar.settingsDropdown.exitFullscreenLabel": "Вийти з повноекранного режиму",
|
||||
"app.navBar.settingsDropdown.fullscreenDesc": "Розгорнути меню параметрів на весь екран",
|
||||
@ -342,6 +393,7 @@
|
||||
"app.navBar.settingsDropdown.hotkeysLabel": "Гарячі клавіші",
|
||||
"app.navBar.settingsDropdown.hotkeysDesc": "Перелік гарячих клавiш",
|
||||
"app.navBar.settingsDropdown.helpLabel": "Допомога",
|
||||
"app.navBar.settingsDropdown.openAppLabel": "Відкрити планшетний додаток BigBlueButton",
|
||||
"app.navBar.settingsDropdown.helpDesc": "Переспрямовує учасника до навчального відео (нова вкладка)",
|
||||
"app.navBar.settingsDropdown.endMeetingDesc": "Завершує поточну зустріч",
|
||||
"app.navBar.settingsDropdown.endMeetingLabel": "Завершити зустріч",
|
||||
@ -352,37 +404,48 @@
|
||||
"app.navBar.recording": "Цей сеанс записується",
|
||||
"app.navBar.recording.on": "Записується",
|
||||
"app.navBar.recording.off": "Не записується",
|
||||
"app.navBar.emptyAudioBrdige": "Немає активного мікрофону. Активуйте Ваш мікрофон, щоб додати звук в даний запис.",
|
||||
"app.navBar.emptyAudioBrdige": "Мікрофон не активний. Активуйте мікрофон, щоб додати звук у запис.",
|
||||
"app.leaveConfirmation.confirmLabel": "Вийти",
|
||||
"app.leaveConfirmation.confirmDesc": "Виводить вас із зустрічі",
|
||||
"app.endMeeting.title": "Завершено {0}",
|
||||
"app.endMeeting.description": "Ця дія завершить сеанс для {0} активних користувачів(користувача). Ви певні що хочете завершити цей сеанс?",
|
||||
"app.endMeeting.noUserDescription": "Ви певні щодо завершення зустрічі?",
|
||||
"app.endMeeting.contentWarning": "Повідомлення чату, спільні нотатки, вміст дошки та спільні документи більше не будуть безпосередньо доступними",
|
||||
"app.endMeeting.yesLabel": "Так",
|
||||
"app.endMeeting.yesLabel": "Завершити зустріч для всіх користувачів",
|
||||
"app.endMeeting.noLabel": "Ні",
|
||||
"app.about.title": "Про застосунок",
|
||||
"app.about.title": "Застосунок",
|
||||
"app.about.version": "Збірка клієнта:",
|
||||
"app.about.version_label": "BigBlueButton версія:",
|
||||
"app.about.version_label": "Версія BigBlueButton:",
|
||||
"app.about.copyright": "Авторське право:",
|
||||
"app.about.confirmLabel": "ОК",
|
||||
"app.about.confirmDesc": "ОК",
|
||||
"app.about.dismissLabel": "Скасувати",
|
||||
"app.about.dismissDesc": "Закрити інформацію про клієнта",
|
||||
"app.mobileAppModal.title": "Відкрити планшетний додаток BigBlueButton",
|
||||
"app.mobileAppModal.description": "У вас встановлено додаток на планшеті для BigBlueButton?",
|
||||
"app.mobileAppModal.openApp": "Так, відкрити додаток",
|
||||
"app.mobileAppModal.obtainUrlMsg": "Отримання URL зустрічі",
|
||||
"app.mobileAppModal.obtainUrlErrorMsg": "Помилка отримання URL зустрічі",
|
||||
"app.mobileAppModal.openStore": "Ні, відкрити AppStore для завантаження",
|
||||
"app.mobileAppModal.dismissLabel": "Відміна",
|
||||
"app.mobileAppModal.dismissDesc": "Закрити",
|
||||
"app.mobileAppModal.userConnectedWithSameId": "Користувач {0} щойно приєднався з таким самим ID як ваше.",
|
||||
"app.actionsBar.changeStatusLabel": "Змінити статус",
|
||||
"app.actionsBar.muteLabel": "Вимкнути мікрофон",
|
||||
"app.actionsBar.unmuteLabel": "Увімкнути мікрофон",
|
||||
"app.actionsBar.camOffLabel": "Вимкнути камеру",
|
||||
"app.actionsBar.raiseLabel": "Підняти",
|
||||
"app.actionsBar.raiseLabel": "Підняти руку",
|
||||
"app.actionsBar.label": "Панель дій",
|
||||
"app.actionsBar.actionsDropdown.restorePresentationLabel": "Відновити презентацію",
|
||||
"app.actionsBar.actionsDropdown.restorePresentationDesc": "Клавіша відновлення презентації після її згортання",
|
||||
"app.actionsBar.actionsDropdown.minimizePresentationLabel": "Згорнути презентацію",
|
||||
"app.actionsBar.actionsDropdown.minimizePresentationLabel": "Мінімізувати презентацію",
|
||||
"app.actionsBar.actionsDropdown.minimizePresentationDesc": "Клавіша для згортання презентації",
|
||||
"app.actionsBar.actionsDropdown.layoutModal": "Вікно налаштувань",
|
||||
"app.screenshare.screenShareLabel" : "Демонстрація екрану",
|
||||
"app.submenu.application.applicationSectionTitle": "Застосунок",
|
||||
"app.submenu.application.animationsLabel": "Анімації",
|
||||
"app.submenu.application.audioFilterLabel": "Аудіофільтри для мікрофона",
|
||||
"app.submenu.application.darkThemeLabel": "Темний режим",
|
||||
"app.submenu.application.fontSizeControlLabel": "Розмір шрифту",
|
||||
"app.submenu.application.increaseFontBtnLabel": "Збільшити розмір шрифту",
|
||||
"app.submenu.application.decreaseFontBtnLabel": "Зменшити розмір шрифту",
|
||||
@ -392,8 +455,71 @@
|
||||
"app.submenu.application.noLocaleOptionLabel": "Відсутні переклади",
|
||||
"app.submenu.application.paginationEnabledLabel": "Відео посторінково",
|
||||
"app.submenu.application.layoutOptionLabel": "Тип компонування",
|
||||
"app.submenu.application.pushLayoutLabel": "Застосувати компонування для всіх",
|
||||
"app.submenu.application.localeDropdown.af": "Африкаанс",
|
||||
"app.submenu.application.localeDropdown.ar": "Арабська",
|
||||
"app.submenu.application.localeDropdown.az": "Азейбаржанська",
|
||||
"app.submenu.application.localeDropdown.bg-BG": "Болгарська",
|
||||
"app.submenu.application.localeDropdown.bn": "Бенгальська",
|
||||
"app.submenu.application.localeDropdown.ca": "Каталонська",
|
||||
"app.submenu.application.localeDropdown.cs-CZ": "Чешська",
|
||||
"app.submenu.application.localeDropdown.da": "Данська",
|
||||
"app.submenu.application.localeDropdown.de": "Німецька",
|
||||
"app.submenu.application.localeDropdown.dv": "Мальдівська",
|
||||
"app.submenu.application.localeDropdown.el-GR": "Грецька (Греція)",
|
||||
"app.submenu.application.localeDropdown.en": "Англійська",
|
||||
"app.submenu.application.localeDropdown.eo": "Есперанто",
|
||||
"app.submenu.application.localeDropdown.es": "Іспанська",
|
||||
"app.submenu.application.localeDropdown.es-419": "Іспанська (Латинська Америка)",
|
||||
"app.submenu.application.localeDropdown.es-ES": "Іспанська (Іспанія)",
|
||||
"app.submenu.application.localeDropdown.es-MX": "Іспанська (Мексика)",
|
||||
"app.submenu.application.localeDropdown.et": "Естонська",
|
||||
"app.submenu.application.localeDropdown.eu": "Баскська",
|
||||
"app.submenu.application.localeDropdown.fa-IR": "Перська",
|
||||
"app.submenu.application.localeDropdown.fi": "Фінська",
|
||||
"app.submenu.application.localeDropdown.fr": "Французька",
|
||||
"app.submenu.application.localeDropdown.gl": "Галісійська",
|
||||
"app.submenu.application.localeDropdown.he": "Іврит",
|
||||
"app.submenu.application.localeDropdown.hi-IN": "Гінді",
|
||||
"app.submenu.application.localeDropdown.hr": "Хорватська",
|
||||
"app.submenu.application.localeDropdown.hu-HU": "Угорська",
|
||||
"app.submenu.application.localeDropdown.hy": "Вірменська",
|
||||
"app.submenu.application.localeDropdown.id": "Індонезійська",
|
||||
"app.submenu.application.localeDropdown.it-IT": "Італійська",
|
||||
"app.submenu.application.localeDropdown.ja": "Японська",
|
||||
"app.submenu.application.localeDropdown.ka": "Грузинська",
|
||||
"app.submenu.application.localeDropdown.km": "Кхмерська",
|
||||
"app.submenu.application.localeDropdown.kn": "Каннада",
|
||||
"app.submenu.application.localeDropdown.ko-KR": "Корейська (Корея)",
|
||||
"app.submenu.application.localeDropdown.lo-LA": "Лаоська",
|
||||
"app.submenu.application.localeDropdown.lt-LT": "Литовська",
|
||||
"app.submenu.application.localeDropdown.lv": "Латвійська",
|
||||
"app.submenu.application.localeDropdown.ml": "Малаялам",
|
||||
"app.submenu.application.localeDropdown.mn-MN": "Монгольська",
|
||||
"app.submenu.application.localeDropdown.nb-NO": "Норвежська (Букмол)",
|
||||
"app.submenu.application.localeDropdown.nl": "Данська",
|
||||
"app.submenu.application.localeDropdown.oc": "Окситанська",
|
||||
"app.submenu.application.localeDropdown.pl-PL": "Польська",
|
||||
"app.submenu.application.localeDropdown.pt": "Португальська",
|
||||
"app.submenu.application.localeDropdown.pt-BR": "Португальська (Бразилія)",
|
||||
"app.submenu.application.localeDropdown.ro-RO": "Румунська",
|
||||
"app.submenu.application.localeDropdown.ru": "Московська",
|
||||
"app.submenu.application.localeDropdown.sk-SK": "Словацька (Словакія)",
|
||||
"app.submenu.application.localeDropdown.sl": "Словенська",
|
||||
"app.submenu.application.localeDropdown.sr": "Сербська",
|
||||
"app.submenu.application.localeDropdown.sv-SE": "Шведська",
|
||||
"app.submenu.application.localeDropdown.ta": "Тамільська",
|
||||
"app.submenu.application.localeDropdown.te": "Телугу",
|
||||
"app.submenu.application.localeDropdown.th": "Тайська",
|
||||
"app.submenu.application.localeDropdown.tr": "Турецька",
|
||||
"app.submenu.application.localeDropdown.tr-TR": " Турецька",
|
||||
"app.submenu.application.localeDropdown.uk-UA": "Українська",
|
||||
"app.submenu.application.localeDropdown.vi": "В'єтнамська",
|
||||
"app.submenu.application.localeDropdown.vi-VN": " Турецька",
|
||||
"app.submenu.application.localeDropdown.zh-CN": "Китайська спрощена (Китай)",
|
||||
"app.submenu.application.localeDropdown.zh-TW": "Китайська спрощена (Тайвань)",
|
||||
"app.submenu.notification.SectionTitle": "Сповіщення",
|
||||
"app.submenu.notification.Desc": "Оберіть як та про що вас буде сповіщено",
|
||||
"app.submenu.notification.Desc": "Оберіть як та про що вас буде сповіщено.",
|
||||
"app.submenu.notification.audioAlertLabel": "Звукові сповіщення",
|
||||
"app.submenu.notification.pushAlertLabel": "Виринаючі сповіщення",
|
||||
"app.submenu.notification.messagesLabel": "Повідомлення у чаті",
|
||||
@ -419,12 +545,12 @@
|
||||
"app.settings.main.save.label": "Зберегти",
|
||||
"app.settings.main.save.label.description": "Зберігає зміни та закриває меню налаштувань",
|
||||
"app.settings.dataSavingTab.label": "Заощадження трафіку",
|
||||
"app.settings.dataSavingTab.webcam": "Дозволити вебкамери",
|
||||
"app.settings.dataSavingTab.screenShare": "Демонстрація екрану",
|
||||
"app.settings.dataSavingTab.webcam": "Дозволити вебкамери учасників",
|
||||
"app.settings.dataSavingTab.screenShare": "Дозволити демонстрацію екрану учасників",
|
||||
"app.settings.dataSavingTab.description": "Для заощадження передачі даних, будь ласка, вимкніть функції, які пов'язані з демонстрацією відео:",
|
||||
"app.settings.save-notification.label": "Налаштування збережено",
|
||||
"app.statusNotifier.lowerHands": "Опустити руки",
|
||||
"app.statusNotifier.lowerHandDescOneUser": "Опустити {0} руку",
|
||||
"app.statusNotifier.lowerHandDescOneUser": "Опустити руку {0}",
|
||||
"app.statusNotifier.raisedHandsTitle": "Підняті руки",
|
||||
"app.statusNotifier.raisedHandDesc": "{0} підняли руки",
|
||||
"app.statusNotifier.raisedHandDescOneUser": "{0} підняв руку",
|
||||
@ -437,26 +563,26 @@
|
||||
"app.talkingIndicator.moreThanMaxIndicatorsWereTalking" : "{0}+ говорили",
|
||||
"app.talkingIndicator.wasTalking" : "{0} закінчив говорити",
|
||||
"app.actionsBar.actionsDropdown.actionsLabel": "Дії",
|
||||
"app.actionsBar.actionsDropdown.presentationLabel": "Керування презентаціями",
|
||||
"app.actionsBar.actionsDropdown.presentationLabel": "Презентації",
|
||||
"app.actionsBar.actionsDropdown.initPollLabel": "Опитування",
|
||||
"app.actionsBar.actionsDropdown.desktopShareLabel": "Демонструвати ваш екран",
|
||||
"app.actionsBar.actionsDropdown.lockedDesktopShareLabel": "Демонстрація екрану заблокована",
|
||||
"app.actionsBar.actionsDropdown.desktopShareLabel": "Демонстрація екрану",
|
||||
"app.actionsBar.actionsDropdown.stopDesktopShareLabel": "Зупинити демонстрацію екрану",
|
||||
"app.actionsBar.actionsDropdown.presentationDesc": "Завантажити вашу презентацію",
|
||||
"app.actionsBar.actionsDropdown.initPollDesc": "Опитування",
|
||||
"app.actionsBar.actionsDropdown.initPollDesc": "Розпочати опитування",
|
||||
"app.actionsBar.actionsDropdown.desktopShareDesc": "Демонструвати ваш екран іншим учасникам",
|
||||
"app.actionsBar.actionsDropdown.stopDesktopShareDesc": "Зупинити демонстрацію екрану",
|
||||
"app.actionsBar.actionsDropdown.pollBtnLabel": "Опитування",
|
||||
"app.actionsBar.actionsDropdown.pollBtnDesc": "Перемкнути панель опитування",
|
||||
"app.actionsBar.actionsDropdown.saveUserNames": "Зберегти імена учасників",
|
||||
"app.actionsBar.actionsDropdown.createBreakoutRoom": "Створити кімнати для учасників",
|
||||
"app.actionsBar.actionsDropdown.createBreakoutRoomDesc": "створити кімнати і розділити учасників між ними ",
|
||||
"app.actionsBar.actionsDropdown.createBreakoutRoom": "Створити тимчасові кімнати для перерви",
|
||||
"app.actionsBar.actionsDropdown.createBreakoutRoomDesc": "створити тимчасові кімнати і розділити учасників між ними ",
|
||||
"app.actionsBar.actionsDropdown.captionsLabel": "Створити приховані субтитри",
|
||||
"app.actionsBar.actionsDropdown.captionsDesc": "Вмикає панель субтитрів",
|
||||
"app.actionsBar.actionsDropdown.takePresenter": "Стати ведучим",
|
||||
"app.actionsBar.actionsDropdown.takePresenterDesc": "Встановити себе ведучим/презентатором",
|
||||
"app.actionsBar.actionsDropdown.takePresenterDesc": "Встановити себе ведучим",
|
||||
"app.actionsBar.actionsDropdown.selectRandUserLabel": "Вибрати випадкового учасника",
|
||||
"app.actionsBar.actionsDropdown.selectRandUserDesc": "Обирає випадкового користувача серед активних глядачів",
|
||||
"app.actionsBar.actionsDropdown.propagateLayoutLabel": "Застосувати композицію",
|
||||
"app.actionsBar.emojiMenu.statusTriggerLabel": "Статус",
|
||||
"app.actionsBar.emojiMenu.awayLabel": "Відійшов",
|
||||
"app.actionsBar.emojiMenu.awayDesc": "Змінити ваш статус на 'Відійшов'",
|
||||
@ -491,30 +617,32 @@
|
||||
"app.audioNotification.audioFailedError1007": "Не вдалося з'єднатися (ICE помилка 1007)",
|
||||
"app.audioNotification.audioFailedError1008": "Трансфер не вдався (Помилка 1008)",
|
||||
"app.audioNotification.audioFailedError1009": "Не можу отримати інфо з STUN/TURN сервера (Помилка 1009)",
|
||||
"app.audioNotification.audioFailedError1010": "Час на узгодження з'єднання вичерпано ( ICE помилка 1010)",
|
||||
"app.audioNotification.audioFailedError1010": "Час на узгодження з'єднання вичерпано (ICE помилка 1010)",
|
||||
"app.audioNotification.audioFailedError1011": "Час з'єднання вийшов (ICE помилка 1011)",
|
||||
"app.audioNotification.audioFailedError1012": "З'єднання закрите (ICE помилка 1012)",
|
||||
"app.audioNotification.audioFailedMessage": "Не вдалося встановити голосове з'єднання",
|
||||
"app.audioNotification.mediaFailedMessage": "Помилка getUserMicMedia, дозволені тільки безпечні джерела",
|
||||
"app.audioNotification.deviceChangeFailed": "Помилка замівни пристою виводу звуку. Перевірте його функціональність та доступність",
|
||||
"app.audioNotification.closeLabel": "Закрити",
|
||||
"app.audioNotificaion.reconnectingAsListenOnly": "Мікрофони вимкнено для глядачів, ви під'єднані як слухач",
|
||||
"app.breakoutJoinConfirmation.title": "Приєднатися до кімнати перерви",
|
||||
"app.breakoutJoinConfirmation.title": "Приєднатися до тимчасової кімнати",
|
||||
"app.breakoutJoinConfirmation.message": "Чи хочете ви приєднатися до",
|
||||
"app.breakoutJoinConfirmation.confirmDesc": "Приєднує вас до кімнати перерви",
|
||||
"app.breakoutJoinConfirmation.confirmDesc": "Приєднує вас до тимчасової кімнати",
|
||||
"app.breakoutJoinConfirmation.dismissLabel": "Скасувати",
|
||||
"app.breakoutJoinConfirmation.dismissDesc": "Закрити та відмовити у приєднанні до кімнати перерви",
|
||||
"app.breakoutJoinConfirmation.freeJoinMessage": "Виберіть кімнату для перерви , до якої бажаєте під’єднатися",
|
||||
"app.breakoutTimeRemainingMessage": "Час перерви у кімнаті : {0}",
|
||||
"app.breakoutWillCloseMessage": "Час вичерпано. Конференцію невдовзі буде закрито",
|
||||
"app.breakoutJoinConfirmation.dismissDesc": "Закрити та відмовити у приєднанні до тимчасової кімнати",
|
||||
"app.breakoutJoinConfirmation.freeJoinMessage": "Виберіть тимчасову кімнату до якої бажаєте під’єднатися",
|
||||
"app.breakoutTimeRemainingMessage": "Час перерви у кімнаті: {0}",
|
||||
"app.breakoutWillCloseMessage": "Час вичерпано. Тимчасова кімната буде скоро закрита",
|
||||
"app.breakout.dropdown.manageDuration": "Змінити протяжність",
|
||||
"app.breakout.dropdown.destroyAll": "Закінчити кімнати перерв",
|
||||
"app.breakout.dropdown.destroyAll": "Закінчити тимчасові кімнати",
|
||||
"app.breakout.dropdown.options": "Опції перерви",
|
||||
"app.breakout.dropdown.manageUsers": "Керування користувачами",
|
||||
"app.calculatingBreakoutTimeRemaining": "Підрахунок часу, що залишився...",
|
||||
"app.audioModal.ariaTitle": "Вікно підключення до голосової конференції",
|
||||
"app.audioModal.microphoneLabel": "Мікрофон",
|
||||
"app.audioModal.listenOnlyLabel": "Тільки слухати",
|
||||
"app.audioModal.microphoneDesc": "Приєднатись до голосової конференції з мікрофоном",
|
||||
"app.audioModal.listenOnlyDesc": "Приєднатись до голосової конференції лише як слухач",
|
||||
"app.audioModal.microphoneDesc": "Приєднатись з мікрофоном",
|
||||
"app.audioModal.listenOnlyDesc": "Приєднатись лише як слухач",
|
||||
"app.audioModal.audioChoiceLabel": "Як ви хочете приєднатися до голосової конференції?",
|
||||
"app.audioModal.iOSBrowser": "Звук/відео не підтримується",
|
||||
"app.audioModal.iOSErrorDescription": "Поки що звук та відео у Chrome для iOS не підтримуються.",
|
||||
@ -530,7 +658,7 @@
|
||||
"app.audioModal.settingsTitle": "Налаштування звуку",
|
||||
"app.audioModal.helpTitle": "З'явилися проблеми з вашими медіа пристроями",
|
||||
"app.audioModal.helpText": "Чи ви надали дозвіл на доступ до мікрофона? Зверніть увагу, що коли ви намагаєтеся приєднатися до голосової конференції, має з'явитися діалогове вікно, в якому вас запитають про дозвіл на під'єднання мультимедійних пристроїв. Будь ласка, прийміть це, щоб встановити голосовий зв'язок. Якщо цього не відбулося спробуйте змінити дозволи мікрофона у налаштуваннях вашого переглядача.",
|
||||
"app.audioModal.help.noSSL": "Сторінка незахищена. Щоб дозволити доступ до мікрофона, сторінка повинна обслуговуватися через HTTPS. Будь ласка, зв'яжіться з адміністратором сервера.",
|
||||
"app.audioModal.help.noSSL": "Сторінка незахищена. Щоб дозволити доступ до мікрофона, сторінка повинна відкриватись через HTTPS з'єднання. Будь ласка, зв'яжіться з адміністратором сервера.",
|
||||
"app.audioModal.help.macNotAllowed": "Схоже, системні налаштування Mac блокують доступ до вашого мікрофону. Відкрийте System Preferences > Security & Privacy > Privacy > Microphone та переконайтеся, що вибрано переглядач, яким ви користуєтеся.",
|
||||
"app.audioModal.audioDialTitle": "Приєднатися за допомогою телефону",
|
||||
"app.audioDial.audioDialDescription": "Наберіть номер",
|
||||
@ -555,6 +683,7 @@
|
||||
"app.audio.changeAudioDevice": "Змінити аудіопристрій",
|
||||
"app.audio.enterSessionLabel": "Приєднатися до сеансу",
|
||||
"app.audio.playSoundLabel": "Відтворити звук",
|
||||
"app.audio.stopAudioFeedback": "Зупинити аудіотест",
|
||||
"app.audio.backLabel": "Назад",
|
||||
"app.audio.loading": "Завантаження",
|
||||
"app.audio.microphones": "Мікрофони",
|
||||
@ -567,17 +696,40 @@
|
||||
"app.audio.audioSettings.testSpeakerLabel": "Перевірте динаміки",
|
||||
"app.audio.audioSettings.microphoneStreamLabel": "Гучність вашого звукового потоку",
|
||||
"app.audio.audioSettings.retryLabel": "Повторити",
|
||||
"app.audio.audioSettings.fallbackInputLabel": "Вхід аудіо {0}",
|
||||
"app.audio.audioSettings.fallbackOutputLabel": "Вихід аудіо {0}",
|
||||
"app.audio.audioSettings.defaultOutputDeviceLabel": "По замовчуванню",
|
||||
"app.audio.audioSettings.findingDevicesLabel": "Пошук пристроїв...",
|
||||
"app.audio.listenOnly.backLabel": "Назад",
|
||||
"app.audio.listenOnly.closeLabel": "Закрити",
|
||||
"app.audio.permissionsOverlay.title": "Дозволити BigBlueButton використовувати ваші мультимедійні пристрої",
|
||||
"app.audio.permissionsOverlay.title": "Дозвольте доступ до вашого мікрофону",
|
||||
"app.audio.permissionsOverlay.hint": "Нам потрібно, щоб ви дозволили використовувати мультимедійні пристрої, щоб приєднатись до голосової конференції :)",
|
||||
"app.audio.captions.button.start": "Почати субтитри",
|
||||
"app.audio.captions.button.stop": "Зупинити субтитри",
|
||||
"app.audio.captions.button.language": "Мова",
|
||||
"app.audio.captions.button.transcription": "Транскрипція",
|
||||
"app.audio.captions.button.transcriptionSettings": "Налаштування транскрипції",
|
||||
"app.audio.captions.speech.title": "Автоматична транскрипція",
|
||||
"app.audio.captions.speech.disabled": "Вимкнено",
|
||||
"app.audio.captions.speech.unsupported": "Ваш веб-оглядач не підтримує розпізнавання мови. Аудіо не буде переведено в титри.",
|
||||
"app.audio.captions.select.de-DE": "Німецька",
|
||||
"app.audio.captions.select.en-US": "Англійська",
|
||||
"app.audio.captions.select.es-ES": "Іспанська",
|
||||
"app.audio.captions.select.fr-FR": "Французька",
|
||||
"app.audio.captions.select.hi-ID": "Хінді",
|
||||
"app.audio.captions.select.it-IT": "Італійська",
|
||||
"app.audio.captions.select.ja-JP": "Японська",
|
||||
"app.audio.captions.select.pt-BR": "Португальська",
|
||||
"app.audio.captions.select.ru-RU": "Московська",
|
||||
"app.audio.captions.select.zh-CN": "Китайська",
|
||||
"app.error.removed": "Вас було вилучено з конференції",
|
||||
"app.error.meeting.ended": "Ви вийшли з конференції",
|
||||
"app.meeting.logout.duplicateUserEjectReason": "Учасник з таким саме ім'ям намагається приєднатися до зустрічі",
|
||||
"app.meeting.logout.permissionEjectReason": "Вилучено через порушення дозволу",
|
||||
"app.meeting.logout.ejectedFromMeeting": "Вас було вилучено із зустрічі",
|
||||
"app.meeting.logout.validateTokenFailedEjectReason": "Не вдалося перевірити токен авторизації",
|
||||
"app.meeting.logout.userInactivityEjectReason": "Учасник занадто довго неактивний",
|
||||
"app.meeting.logout.userInactivityEjectReason": "Учасник тривало неактивний",
|
||||
"app.meeting.logout.maxParticipantsReached": "Максимально передбачена кількість учасників в конференції була досягнута",
|
||||
"app.meeting-ended.rating.legendLabel": "Рейтинг відгуків",
|
||||
"app.meeting-ended.rating.starLabel": "Зірка",
|
||||
"app.modal.close": "Закрити",
|
||||
@ -599,33 +751,36 @@
|
||||
"app.error.403": "Ви були вилучені з зустрiчi",
|
||||
"app.error.404": "Не знайдено",
|
||||
"app.error.408": "Помилка автентифікації",
|
||||
"app.error.409": "Конфлікт",
|
||||
"app.error.410": "Зустріч закінчилася",
|
||||
"app.error.500": "Ой, щось пішло не так",
|
||||
"app.error.userLoggedOut": "Користувач має невірний sessionToken через те що вилогінився",
|
||||
"app.error.ejectedUser": "Користувач має невірний sessionToken через викид",
|
||||
"app.error.503": "Помилка. Вас від'єднало...",
|
||||
"app.error.disconnected.rejoin": "Ви можете оновити сторінку для переприєднання.",
|
||||
"app.error.userLoggedOut": "Користувач має помилковий sessionToken через те що вилогінився",
|
||||
"app.error.ejectedUser": "Користувач має помилковий sessionToken через викид",
|
||||
"app.error.joinedAnotherWindow": "Схоже що ця сесія відкрита у іншому вікні браузера",
|
||||
"app.error.userBanned": "Користувача забанено",
|
||||
"app.error.userBanned": "Користувача було заблоковано",
|
||||
"app.error.leaveLabel": "Увійдіть знову",
|
||||
"app.error.fallback.presentation.title": "Виникла помилка",
|
||||
"app.error.fallback.presentation.description": "Уже увійшли. Спробуйте перезавантажити сторінку.",
|
||||
"app.error.fallback.presentation.reloadButton": "Перезавантажити",
|
||||
"app.guest.waiting": "Очікування схвалення приєднання",
|
||||
"app.guest.errorSeeConsole": "Помилка: більш детально в консолі",
|
||||
"app.guest.waiting": "Очікуємо схвалення на приєднання",
|
||||
"app.guest.errorSeeConsole": "Помилка: більш детально в консолі.",
|
||||
"app.guest.noModeratorResponse": "Немає відповіді модератора.",
|
||||
"app.guest.noSessionToken": "Не отримано лексему сеансу",
|
||||
"app.guest.windowTitle": "BigBlueButton - Гостьова вітальня",
|
||||
"app.guest.missingToken": "Для гостя не вказано лексему сеансу",
|
||||
"app.guest.missingSession": "Для гостя не вказано сеанс",
|
||||
"app.guest.missingMeeting": "Зустріч не існує",
|
||||
"app.guest.noSessionToken": "Не отримано ідентифікатора сесії.",
|
||||
"app.guest.windowTitle": "BigBlueButton — Гостьова вітальня",
|
||||
"app.guest.missingToken": "Для гостя не вказано ідентифікатора сесії",
|
||||
"app.guest.missingSession": "Для гостя не вказано сесії",
|
||||
"app.guest.missingMeeting": "Така зустріч не існує.",
|
||||
"app.guest.meetingEnded": "Зустріч закінчилась.",
|
||||
"app.guest.guestWait": "Будь ласка, зачекайте, поки модератор схвалить приєднання вас до зустрічі.",
|
||||
"app.guest.guestDeny": "Гостю відмовлено у приєднанні до зустрічі.",
|
||||
"app.guest.seatWait": "Гість очікує на вільне місце у зустрічі.",
|
||||
"app.guest.allow": "Гостя підтверджено та скеровано до зустрічі",
|
||||
"app.guest.firstPositionInWaitingQueue": "Ви перші у черзі",
|
||||
"app.guest.positionInWaitingQueue": "Ваша черга",
|
||||
"app.guest.guestInvalid": "Невірний запрошений гість",
|
||||
"app.guest.meetingForciblyEnded": "Зустріч зупинено",
|
||||
"app.guest.seatWait": "Гість очікує на вільне місце у зустрічі.",
|
||||
"app.guest.allow": "Гостя підтверджено та скеровано до зустрічі.",
|
||||
"app.guest.firstPositionInWaitingQueue": "Ви перші у черзі!",
|
||||
"app.guest.positionInWaitingQueue": "Ваша черга: ",
|
||||
"app.guest.guestInvalid": "Невалідний гість",
|
||||
"app.guest.meetingForciblyEnded": "Зустріч зупинено, ви не можете до неї приєднатись",
|
||||
"app.userList.guest.waitingUsers": "Учасники у очікуванні",
|
||||
"app.userList.guest.waitingUsersTitle": "Керування учасниками",
|
||||
"app.userList.guest.optionTitle": "Переглянути учасників, які очікують",
|
||||
@ -644,14 +799,18 @@
|
||||
"app.userList.guest.privateMessageLabel": "Повідомлення",
|
||||
"app.userList.guest.acceptLabel": "Прийняти",
|
||||
"app.userList.guest.denyLabel": "Відмовити",
|
||||
"app.userList.guest.feedbackMessage": "Застосована дія: ",
|
||||
"app.user-info.title": "Пошук у каталозі",
|
||||
"app.toast.breakoutRoomEnded": "Час роботи в кімнаті для учасників закінчилася. Будь ласка, приєднайтесь знову до аудіо конференції.",
|
||||
"app.toast.breakoutRoomEnded": "Час роботи в тимчасовій кімнаті закінчився. Будь ласка, приєднайтесь знову до аудіо конференції.",
|
||||
"app.toast.chat.public": "Нове повідомлення у загальному чаті",
|
||||
"app.toast.chat.private": "Нове повідомлення у приватному чаті",
|
||||
"app.toast.chat.system": "Система",
|
||||
"app.toast.chat.poll": "Результати опитування",
|
||||
"app.toast.chat.pollClick": "Результати опитування опубліковані. Написніть тут для перегляду.",
|
||||
"app.toast.clearedEmoji.label": "Статус знято",
|
||||
"app.toast.setEmoji.label": "Усі статуси встановлені на {0}",
|
||||
"app.toast.meetingMuteOn.label": "Всім учасникам вимкнено мікрофони",
|
||||
"app.toast.meetingMuteOnViewers.label": "Всі глядячі без активних мікрофонів",
|
||||
"app.toast.meetingMuteOff.label": "Блокування мікрофону вимкнено",
|
||||
"app.toast.setEmoji.raiseHand": "Ви підняли руку",
|
||||
"app.toast.setEmoji.lowerHand": "Руку опущено",
|
||||
@ -677,8 +836,8 @@
|
||||
"app.shortcut-help.hidePrivateChat": "Приховати приватний чат",
|
||||
"app.shortcut-help.closePrivateChat": "Закрити приватний чат",
|
||||
"app.shortcut-help.openActions": "Відкрити меню дій",
|
||||
"app.shortcut-help.raiseHand": "Переключити - піднята/опущена рука",
|
||||
"app.shortcut-help.openDebugWindow": "Відкрити вікно зневадження",
|
||||
"app.shortcut-help.raiseHand": "Перемикання підняття руки",
|
||||
"app.shortcut-help.openDebugWindow": "Відкрити вікно налагодження",
|
||||
"app.shortcut-help.openStatus": "Відкрити статус меню ",
|
||||
"app.shortcut-help.togglePan": "Включити Інструмент - Переміщення (ведучий)",
|
||||
"app.shortcut-help.toggleFullscreen": "Переключити - На весь екран (ведучий)",
|
||||
@ -688,8 +847,40 @@
|
||||
"app.shortcut-help.toggleFullscreenKey": "Enter",
|
||||
"app.shortcut-help.nextSlideKey": "Права стрілка",
|
||||
"app.shortcut-help.previousSlideKey": "Ліва стрілка",
|
||||
"app.shortcut-help.select": "Вибирання",
|
||||
"app.shortcut-help.pencil": "Олівець",
|
||||
"app.shortcut-help.eraser": "Гумка",
|
||||
"app.shortcut-help.rectangle": "Прямокутник",
|
||||
"app.shortcut-help.elipse": "Еліпс",
|
||||
"app.shortcut-help.triangle": "Трикутник",
|
||||
"app.shortcut-help.line": "Лінія",
|
||||
"app.shortcut-help.arrow": "Стрілочка",
|
||||
"app.shortcut-help.text": "Напис",
|
||||
"app.shortcut-help.note": "Наклейка-примітка",
|
||||
"app.shortcut-help.general": "Загальні",
|
||||
"app.shortcut-help.presentation": "Презентація",
|
||||
"app.shortcut-help.whiteboard": "Дошка",
|
||||
"app.shortcut-help.zoomIn": "Наблизити",
|
||||
"app.shortcut-help.zoomOut": "Віддалити",
|
||||
"app.shortcut-help.zoomFit": "Очистити наближення",
|
||||
"app.shortcut-help.zoomSelect": "Наблизити до виділеного",
|
||||
"app.shortcut-help.flipH": "Горизонтальне віддзеркалення",
|
||||
"app.shortcut-help.flipV": "Вертикальне віддзеркалення",
|
||||
"app.shortcut-help.lock": "Закріпити / Відкріпити ",
|
||||
"app.shortcut-help.moveToFront": "На передній план",
|
||||
"app.shortcut-help.moveToBack": "На задній план",
|
||||
"app.shortcut-help.moveForward": "Перемістити вперед",
|
||||
"app.shortcut-help.moveBackward": "Перемістити назад",
|
||||
"app.shortcut-help.undo": "Відмінити",
|
||||
"app.shortcut-help.redo": "Повторити",
|
||||
"app.shortcut-help.cut": "Вирізати",
|
||||
"app.shortcut-help.copy": "Копіювати",
|
||||
"app.shortcut-help.paste": "Вставити",
|
||||
"app.shortcut-help.selectAll": "Обрати все",
|
||||
"app.shortcut-help.delete": "Видалити",
|
||||
"app.shortcut-help.duplicate": "Дублювати",
|
||||
"app.lock-viewers.title": "Обмежити глядачів",
|
||||
"app.lock-viewers.description": "Ці налаштування дозволяють обмежити учасників у доступі до певних функцій",
|
||||
"app.lock-viewers.description": "Ці налаштування дозволяють обмежити учасників у доступі до певних функцій.",
|
||||
"app.lock-viewers.featuresLable": "Властивість",
|
||||
"app.lock-viewers.lockStatusLabel": "Стан",
|
||||
"app.lock-viewers.webcamLabel": "Увімкнути вебкамеру",
|
||||
@ -711,14 +902,14 @@
|
||||
"app.guest-policy.button.alwaysAccept": "Завжди приймати",
|
||||
"app.guest-policy.button.alwaysDeny": "Завжди відхиляти",
|
||||
"app.guest-policy.policyBtnDesc": "Встановлює політику для гостей зустрічі",
|
||||
"app.connection-status.ariaTitle": "Вікно умов стану з'єднання",
|
||||
"app.connection-status.ariaTitle": "Вікно стану з'єднання",
|
||||
"app.connection-status.title": "Стан з'єднання",
|
||||
"app.connection-status.description": "Перегляд стану з'єднання користувачів",
|
||||
"app.connection-status.empty": "Немає проблем із зв'язком",
|
||||
"app.connection-status.more": "докладно",
|
||||
"app.connection-status.copy": "Копіювати статистику",
|
||||
"app.connection-status.copied": "Скопійовано!",
|
||||
"app.connection-status.jitter": "Тремтіння",
|
||||
"app.connection-status.jitter": "Фазове тримтіння",
|
||||
"app.connection-status.label": "Стан з'єднання",
|
||||
"app.connection-status.settings": "Налаштування ваших параметрів",
|
||||
"app.connection-status.no": "Ні",
|
||||
@ -732,24 +923,30 @@
|
||||
"app.connection-status.usingTurn": "Використання TURN",
|
||||
"app.connection-status.yes": "Так",
|
||||
"app.connection-status.connectionStats": "Статистика конектів",
|
||||
"app.connection-status.myLogs": "Мої логи",
|
||||
"app.connection-status.sessionLogs": "Логи сесії",
|
||||
"app.connection-status.myLogs": "Мій журнал",
|
||||
"app.connection-status.sessionLogs": "Журнал сесії",
|
||||
"app.connection-status.next": "Наступна сторінка",
|
||||
"app.connection-status.prev": "Попередня сторінка",
|
||||
"app.learning-dashboard.label": "Дошка аналітики навчання",
|
||||
"app.learning-dashboard.description": "Відкрити панель обліку активності учасників",
|
||||
"app.learning-dashboard.description": "Дошка активності користувачів",
|
||||
"app.learning-dashboard.clickHereToOpen": "Відкрити дошку аналітики навчання",
|
||||
"app.recording.startTitle": "Почати запис",
|
||||
"app.recording.stopTitle": "Призупинити запис",
|
||||
"app.recording.resumeTitle": "Відновити запис",
|
||||
"app.recording.startDescription": "Для паузи запису клацніть повторно на кнопку запису.",
|
||||
"app.recording.stopDescription": "Дійсно призупинити запис? Щоб відновити запис, клацніть ще раз на кнопку запису.",
|
||||
"app.recording.notify.title": "Запис розпочався",
|
||||
"app.recording.notify.description": "Запис буде доступний по завершенню сесії",
|
||||
"app.recording.notify.continue": "Продовжити",
|
||||
"app.recording.notify.leave": "Покинути",
|
||||
"app.recording.notify.continueLabel" : "Прийняти факт запису та продовжити",
|
||||
"app.recording.notify.leaveLabel" : "Не приймати факт запису та вийти",
|
||||
"app.videoPreview.cameraLabel": "Камера",
|
||||
"app.videoPreview.profileLabel": "Якість",
|
||||
"app.videoPreview.quality.low": "Низька",
|
||||
"app.videoPreview.quality.medium": "Середня",
|
||||
"app.videoPreview.quality.high": "Висока",
|
||||
"app.videoPreview.quality.hd": "High definition",
|
||||
"app.videoPreview.quality.hd": "Надвисока якість",
|
||||
"app.videoPreview.cancelLabel": "Скасувати",
|
||||
"app.videoPreview.closeLabel": "Закрити",
|
||||
"app.videoPreview.findingWebcamsLabel": "Пошук вебкамер",
|
||||
@ -760,13 +957,20 @@
|
||||
"app.videoPreview.webcamOptionLabel": "Виберіть вебкамеру",
|
||||
"app.videoPreview.webcamPreviewLabel": "Попередній перегляд вебкамери",
|
||||
"app.videoPreview.webcamSettingsTitle": "Налаштування вебкамери",
|
||||
"app.videoPreview.webcamEffectsTitle": "Візуальні ефекти камери",
|
||||
"app.videoPreview.webcamVirtualBackgroundLabel": "Налаштування віртуального тла",
|
||||
"app.videoPreview.webcamVirtualBackgroundDisabledLabel": "Цей пристрій не підтримує віртуального тла",
|
||||
"app.videoPreview.webcamNotFoundLabel": "Вебкамеру не знайдено",
|
||||
"app.videoPreview.profileNotFoundLabel": "Для цієї камери немає підтримуваних профілів",
|
||||
"app.videoPreview.brightness": "Яскравість",
|
||||
"app.videoPreview.wholeImageBrightnessLabel": "Повне зображення",
|
||||
"app.videoPreview.wholeImageBrightnessDesc": "Застосовує яскравість та фонове зображення",
|
||||
"app.videoPreview.sliderDesc": "Відрегулюйте рівень яскравості",
|
||||
"app.video.joinVideo": "Увімкнути вебкамеру",
|
||||
"app.video.connecting": "Веб камера підключається ...",
|
||||
"app.video.connecting": "Зображення камери стає публічним...",
|
||||
"app.video.leaveVideo": "Вимкнути вебкамеру",
|
||||
"app.video.videoSettings": "Налаштування відео",
|
||||
"app.video.visualEffects": "Налаштування візуальних ефектів",
|
||||
"app.video.advancedVideo": "Відкрити розширені налаштування",
|
||||
"app.video.iceCandidateError": "Помилка додавання ICE кандидата",
|
||||
"app.video.iceConnectionStateError": "Не вдалося з'єднатися (ICE помилка 1107)",
|
||||
@ -782,8 +986,9 @@
|
||||
"app.video.notReadableError": "Не вдалося отримати відео з вебкамери. Будь ласка, переконайтеся, що інша програма не використовує її",
|
||||
"app.video.timeoutError": "Браузер не відповів вчасно",
|
||||
"app.video.genericError": "Невідома помилка з пристроєм (Помилка {0})",
|
||||
"app.video.inactiveError": "Вебкамера неочікувано припинила роботу. Перевірте дозволи веб оглядача для камер.",
|
||||
"app.video.mediaTimedOutError": "Потік відео від вашої камери перервався. Спробуйте приєднати її знову.",
|
||||
"app.video.mediaFlowTimeout1020": "Потоки не досягають сервера (помилка 1020)",
|
||||
"app.video.mediaFlowTimeout1020": "Трансляція не досягає сервера (помилка 1020)",
|
||||
"app.video.suggestWebcamLock": "Примусово заблокувати налаштування для глядачів?",
|
||||
"app.video.suggestWebcamLockReason": "(це підвищить стабільність конференції)",
|
||||
"app.video.enable": "Увімкнути",
|
||||
@ -804,8 +1009,17 @@
|
||||
"app.video.virtualBackground.board": "Дошка",
|
||||
"app.video.virtualBackground.coffeeshop": "Кав'ярня",
|
||||
"app.video.virtualBackground.background": "Задній фон",
|
||||
"app.video.virtualBackground.backgroundWithIndex": "Фонове зображення {0}",
|
||||
"app.video.virtualBackground.custom": "Обрати свій",
|
||||
"app.video.virtualBackground.remove": "Видалити додане зображення",
|
||||
"app.video.virtualBackground.genericError": "Не вдалось застосувати ефект для камери. Спробуйте знову.",
|
||||
"app.video.virtualBackground.camBgAriaDesc": "Встановлює віртуальне тло для вебкамери: {0}",
|
||||
"app.video.virtualBackground.maximumFileSizeExceeded": "Максимальний розмір перевищено ({0} Mb)",
|
||||
"app.video.virtualBackground.typeNotAllowed": "Тип файлу не підтримується",
|
||||
"app.video.virtualBackground.errorOnRead": "Щось пішло не так при читанні файлу.",
|
||||
"app.video.virtualBackground.uploaded": "Додано",
|
||||
"app.video.virtualBackground.uploading": "Завантаження...",
|
||||
"app.video.virtualBackground.button.customDesc": "Додати власний віртуальний фон",
|
||||
"app.video.camCapReached": "Ви не можете поширити більше камер",
|
||||
"app.video.meetingCamCapReached": "Досягнуто ліміт камер у зустрічі",
|
||||
"app.video.dropZoneLabel": "Перетягніть сюди",
|
||||
@ -826,6 +1040,7 @@
|
||||
"app.whiteboard.annotations.poll": "Результати голосування опубліковані",
|
||||
"app.whiteboard.annotations.pollResult": "Результат голосування",
|
||||
"app.whiteboard.annotations.noResponses": "Немає відповідей",
|
||||
"app.whiteboard.annotations.notAllowed": "Вам не дозволено робити цю зміну",
|
||||
"app.whiteboard.toolbar.tools": "Інструменти",
|
||||
"app.whiteboard.toolbar.tools.hand": "Переміщення",
|
||||
"app.whiteboard.toolbar.tools.pencil": "Олівець",
|
||||
@ -852,6 +1067,7 @@
|
||||
"app.whiteboard.toolbar.color.silver": "Срібний",
|
||||
"app.whiteboard.toolbar.undo": "Скасувати нотатку",
|
||||
"app.whiteboard.toolbar.clear": "Стерти усі нотатки",
|
||||
"app.whiteboard.toolbar.clearConfirmation": "Ви впевнені, що хочете очистити всі анотації?",
|
||||
"app.whiteboard.toolbar.multiUserOn": "Увімкнути спільний доступ до дошки",
|
||||
"app.whiteboard.toolbar.multiUserOff": "Вимкнути спільний доступ до дошки",
|
||||
"app.whiteboard.toolbar.palmRejectionOn": "Увімкнути захист від випадкових дотиків",
|
||||
@ -871,19 +1087,19 @@
|
||||
"app.videoDock.webcamUnfocusDesc": "Не акцентувати обрану камеру",
|
||||
"app.videoDock.webcamPinLabel": "Закріпити",
|
||||
"app.videoDock.webcamPinDesc": "Закріпити обрану камеру",
|
||||
"app.videoDock.webcamFullscreenLabel": "Вебкамера на весь екран",
|
||||
"app.videoDock.webcamSqueezedButtonLabel": "Налаштування вебкамери",
|
||||
"app.videoDock.webcamUnpinLabel": "Відкріпити",
|
||||
"app.videoDock.webcamUnpinLabelDisabled": "Тільки модератори можуть відкріпляти користувачів",
|
||||
"app.videoDock.webcamUnpinDesc": "Відкріпити обрану камеру",
|
||||
"app.videoDock.autoplayBlockedDesc": "Потрібен дозвіл, щоб показати вам вебкамери інших учасників.",
|
||||
"app.videoDock.autoplayAllowLabel": "Дивитися вебкамери",
|
||||
"app.invitation.title": "Запрошення до кімнати перерв ",
|
||||
"app.invitation.confirm": "Запросити",
|
||||
"app.createBreakoutRoom.title": "Кімнати для перерв",
|
||||
"app.createBreakoutRoom.ariaTitle": "Приховати кімнати для перерв",
|
||||
"app.createBreakoutRoom.breakoutRoomLabel": "Кімнати для перерв {0}",
|
||||
"app.createBreakoutRoom.ariaTitle": "Приховати тимчасові кімнати",
|
||||
"app.createBreakoutRoom.breakoutRoomLabel": "Тимчасові кімнати {0}",
|
||||
"app.createBreakoutRoom.askToJoin": "Запит на приєднання",
|
||||
"app.createBreakoutRoom.generatingURL": "Створення URL",
|
||||
"app.createBreakoutRoom.generatingURLMessage": "Ми створюємо адресу URL для приєднання до обраної кімнати. Це може тривати декілька секунд...",
|
||||
"app.createBreakoutRoom.generatingURLMessage": "Ми створюємо адресу URL для приєднання до обраної тимчасової кімнати. Це може тривати декілька секунд...",
|
||||
"app.createBreakoutRoom.duration": "Тривалість {0}",
|
||||
"app.createBreakoutRoom.room": "Кімната {0}",
|
||||
"app.createBreakoutRoom.notAssigned": "Не призначено ({0})",
|
||||
@ -896,22 +1112,24 @@
|
||||
"app.createBreakoutRoom.numberOfRooms": "Кількість кімнат",
|
||||
"app.createBreakoutRoom.durationInMinutes": "Тривалість (хвилини)",
|
||||
"app.createBreakoutRoom.randomlyAssign": "Випадково призначити",
|
||||
"app.createBreakoutRoom.randomlyAssignDesc": "Випадково розподілити користувачів по кімнатах",
|
||||
"app.createBreakoutRoom.randomlyAssignDesc": "Розподілити рандомно по тимчасових кімнатах",
|
||||
"app.createBreakoutRoom.resetAssignments": "Суинути призначення",
|
||||
"app.createBreakoutRoom.resetAssignmentsDesc": "Скинути усі призначення кімнати",
|
||||
"app.createBreakoutRoom.endAllBreakouts": "Закрити усі перервні кімнати ",
|
||||
"app.createBreakoutRoom.endAllBreakouts": "Закрити всі тимчасові кімнати ",
|
||||
"app.createBreakoutRoom.chatTitleMsgAllRooms": "усі кімнати",
|
||||
"app.createBreakoutRoom.msgToBreakoutsSent": "Повідомлення надіслано до {0} кімнат перерв",
|
||||
"app.createBreakoutRoom.msgToBreakoutsSent": "Повідомлення надіслано до {0} тимчасових кімнат",
|
||||
"app.createBreakoutRoom.roomName": "{0} (Кімната - {1})",
|
||||
"app.createBreakoutRoom.doneLabel": "Готово",
|
||||
"app.createBreakoutRoom.nextLabel": "Далі",
|
||||
"app.createBreakoutRoom.minusRoomTime": "Зменшити тривалість кімнати для перерви до",
|
||||
"app.createBreakoutRoom.addRoomTime": "Збільшити тривалість кімнати для перерви до",
|
||||
"app.createBreakoutRoom.minusRoomTime": "Зменшити тривалість тимчасових кімнат до",
|
||||
"app.createBreakoutRoom.addRoomTime": "Збільшити тривалість тимчасових кімнат до",
|
||||
"app.createBreakoutRoom.addParticipantLabel": "+ Додати учасника",
|
||||
"app.createBreakoutRoom.freeJoin": "Дозволити учасникам обирати кімнату самостійно",
|
||||
"app.createBreakoutRoom.captureNotes": "Забрати спільні нотатки, коли по припиненню тимчасових кімнат",
|
||||
"app.createBreakoutRoom.captureSlides": "Забрати дошку по припиненню тимчасових кімнат",
|
||||
"app.createBreakoutRoom.leastOneWarnBreakout": "Щонайменше один учасник має бути присутнім у кімнаті.",
|
||||
"app.createBreakoutRoom.minimumDurationWarnBreakout": "Мінімальна тривалість кімнати для учасників {0} хвилин",
|
||||
"app.createBreakoutRoom.modalDesc": "Примітка: Щоб призначити учасників до певної кімнати, будь ласка, перетягніть їхні імена до комірок кімнат.",
|
||||
"app.createBreakoutRoom.minimumDurationWarnBreakout": "Мінімальна тривалість тимчасової кімнати {0} хвилин",
|
||||
"app.createBreakoutRoom.modalDesc": "Примітка: Перетягніть імена учасників до кімнат, щоб виконати призначення.",
|
||||
"app.createBreakoutRoom.roomTime": "{0} хвилин",
|
||||
"app.createBreakoutRoom.numberOfRoomsError": "Кількість кімнат є неправильною.",
|
||||
"app.createBreakoutRoom.duplicatedRoomNameError": "Назва кімнати не може повторюватись",
|
||||
@ -919,8 +1137,16 @@
|
||||
"app.createBreakoutRoom.setTimeInMinutes": "Протяжність перерви (minutes)",
|
||||
"app.createBreakoutRoom.setTimeLabel": "Застосувати",
|
||||
"app.createBreakoutRoom.setTimeCancel": "Відмінити",
|
||||
"app.createBreakoutRoom.setTimeHigherThanMeetingTimeError": "Чвс перерви не може перевищувати час зустрічі",
|
||||
"app.createBreakoutRoom.roomNameInputDesc": "Оновлює назву кімнати для учасників",
|
||||
"app.createBreakoutRoom.setTimeHigherThanMeetingTimeError": "Тривалість тимчасової кімнати не може перевищувати час зустрічі",
|
||||
"app.createBreakoutRoom.roomNameInputDesc": "Оновлює назву тимчасової кімнати",
|
||||
"app.createBreakoutRoom.movedUserLabel": "Перенесено {0} до кімнати {1} ",
|
||||
"app.updateBreakoutRoom.modalDesc": "Щоб оновити чи запросити користувача, просто перетягніть його до відповідної кімнати. ",
|
||||
"app.updateBreakoutRoom.cancelLabel": "Відміна",
|
||||
"app.updateBreakoutRoom.title": "Оновити тимчасові кімнати",
|
||||
"app.updateBreakoutRoom.confirm": "Застосувати",
|
||||
"app.updateBreakoutRoom.userChangeRoomNotification": "Вас перенесено у кімнату {0}.",
|
||||
"app.smartMediaShare.externalVideo": "Зовнішні відео",
|
||||
"app.update.resetRoom": "Скинути налаштування кімнати",
|
||||
"app.externalVideo.start": "Поділитися новим відео",
|
||||
"app.externalVideo.title": "Поділитися зовнішнім відео",
|
||||
"app.externalVideo.input": "Посилання на зовнішню адресу відео",
|
||||
@ -932,21 +1158,31 @@
|
||||
"app.externalVideo.fullscreenLabel": "Переглядач відео",
|
||||
"app.externalVideo.noteLabel": "Примітка: Зовнішні відеозаписи не з'являються у записі сеансу. Підтримуються: YouTube, Vimeo, Instructure Media, Twitch, Dailymotion та посилання на відео ( наприклад : https://example.com/xy.mp4 )",
|
||||
"app.externalVideo.subtitlesOn": "Вимкнути",
|
||||
"app.externalVideo.subtitlesOff": "Вмикнути (якщо доступно)",
|
||||
"app.externalVideo.subtitlesOff": "Увімкнути (якщо доступно)",
|
||||
"app.actionsBar.actionsDropdown.shareExternalVideo": "Демонстрація зовнішнього відео",
|
||||
"app.actionsBar.actionsDropdown.stopShareExternalVideo": "Припинити показ зовнішнього відео",
|
||||
"app.iOSWarning.label": "Будь ласка, оновіть пристрій з iOS до версії 12.2 або новішої версії",
|
||||
"app.legacy.unsupportedBrowser": "Схоже, ви використовуєте браузер, який в повному обсязі не підтримується. Будь ласка, використовуйте {0} або {1} для повної підтримки.",
|
||||
"app.legacy.upgradeBrowser": "Схоже, ви використовуєте старішу версію браузера, який підтримується. Будь ласка, оновіть його для повної підтримки.",
|
||||
"app.legacy.criosBrowser": "Будь ласка, використовуйте браузер Safari на пристрої з iOS для повної підтримки.",
|
||||
"app.debugWindow.windowTitle": "Зневадження",
|
||||
"app.debugWindow.windowTitle": "Налагодження",
|
||||
"app.debugWindow.form.userAgentLabel": "Агент користувача",
|
||||
"app.debugWindow.form.button.copy": "Копіювати",
|
||||
"app.debugWindow.form.enableAutoarrangeLayoutLabel": "Дозволити режим Авторозташування",
|
||||
"app.debugWindow.form.enableAutoarrangeLayoutLabel": "Дозволити режим авторозкладки",
|
||||
"app.debugWindow.form.enableAutoarrangeLayoutDescription": "(буде відключено якщо ви перемістите або зміните розмір зони відображення вебкамер)",
|
||||
"app.debugWindow.form.chatLoggerLabel": "Рівень протоколювання тестового чату",
|
||||
"app.debugWindow.form.button.apply": "Застосувати",
|
||||
"app.layout.style.custom": "Власне компонування",
|
||||
"app.layout.modal.title": "Розкладки",
|
||||
"app.layout.modal.confirm": "Підтвердити",
|
||||
"app.layout.modal.cancel": "Відміна",
|
||||
"app.layout.modal.layoutLabel": "Оберіть вашу розкладку",
|
||||
"app.layout.modal.keepPushingLayoutLabel": "Застосувати для всіх",
|
||||
"app.layout.modal.pushLayoutLabel": "Застосувати для кожного",
|
||||
"app.layout.modal.layoutToastLabel": "Налаштування розкладки змінено",
|
||||
"app.layout.modal.layoutSingular": "Розкладка",
|
||||
"app.layout.modal.layoutBtnDesc": "Встановлює розкладку як обране налаштування",
|
||||
"app.layout.style.custom": "Власна розкладка",
|
||||
"app.layout.style.smart": "Розумна розкладка",
|
||||
"app.layout.style.presentationFocus": "Фокус не презентації",
|
||||
"app.layout.style.videoFocus": "Фокус на відео",
|
||||
"app.layout.style.customPush": "Власне (встановити компонування всім)",
|
||||
@ -982,7 +1218,7 @@
|
||||
"playback.player.chat.message.poll.option.yes": "Так",
|
||||
"playback.player.chat.message.poll.option.no": "Ні",
|
||||
"playback.player.chat.message.poll.option.abstention": "Утримався",
|
||||
"playback.player.chat.message.poll.option.true": "Вірно",
|
||||
"playback.player.chat.message.poll.option.true": "Правильно",
|
||||
"playback.player.chat.message.poll.option.false": "Хибно",
|
||||
"playback.player.chat.message.video.name": "Зовнішнє відео",
|
||||
"playback.player.chat.wrapper.aria": "Область чату",
|
||||
@ -994,6 +1230,7 @@
|
||||
"playback.player.thumbnails.wrapper.aria": "Область мініатюр",
|
||||
"playback.player.webcams.wrapper.aria": "Вебкамери",
|
||||
"app.learningDashboard.dashboardTitle": "Дошка аналітики навчання",
|
||||
"app.learningDashboard.bigbluebuttonTitle": "BigBlueButton",
|
||||
"app.learningDashboard.downloadSessionDataLabel": "Завантажити дані сесії",
|
||||
"app.learningDashboard.lastUpdatedLabel": "Оновлено ",
|
||||
"app.learningDashboard.sessionDataDownloadedLabel": "Завантажено!",
|
||||
@ -1018,6 +1255,12 @@
|
||||
"app.learningDashboard.userDetails.response": "Відповідь",
|
||||
"app.learningDashboard.userDetails.mostCommonAnswer": "Найчастіша відповідь",
|
||||
"app.learningDashboard.userDetails.anonymousAnswer": "Анонімне опитування",
|
||||
"app.learningDashboard.userDetails.talkTime": "Час розмови",
|
||||
"app.learningDashboard.userDetails.messages": "Повідомлення",
|
||||
"app.learningDashboard.userDetails.emojis": "Емоджі",
|
||||
"app.learningDashboard.userDetails.raiseHands": "Підняття руки",
|
||||
"app.learningDashboard.userDetails.pollVotes": "Опитування",
|
||||
"app.learningDashboard.userDetails.onlineIndicator": "{0} час онлайн",
|
||||
"app.learningDashboard.usersTable.title": "Огляд",
|
||||
"app.learningDashboard.usersTable.colOnline": "Час онлайн",
|
||||
"app.learningDashboard.usersTable.colTalk": "Час виступів",
|
||||
@ -1035,14 +1278,19 @@
|
||||
"app.learningDashboard.usersTable.pollVotes": "Результати опитування",
|
||||
"app.learningDashboard.usersTable.join": "Приєднатися",
|
||||
"app.learningDashboard.usersTable.left": "Зліва",
|
||||
"app.learningDashboard.usersTable.notAvailable": "Н/Д",
|
||||
"app.learningDashboard.usersTable.notAvailable": "Недоступно",
|
||||
"app.learningDashboard.pollsTable.title": "Опитування",
|
||||
"app.learningDashboard.pollsTable.anonymousAnswer": "Анонімні опитування (відповіді в останньому рядку)",
|
||||
"app.learningDashboard.pollsTable.anonymousRowName": "Анонім",
|
||||
"app.learningDashboard.pollsTable.noPollsCreatedHeading": "Ще не створено жлдного опитування",
|
||||
"app.learningDashboard.pollsTable.noPollsCreatedHeading": "Ще не створено жодного опитування",
|
||||
"app.learningDashboard.pollsTable.noPollsCreatedMessage": "Як опитування буде завершено, результати відобразяться у цьому списку",
|
||||
"app.learningDashboard.statusTimelineTable.title": "Таймлайн",
|
||||
"app.learningDashboard.pollsTable.answerTotal": "Всього",
|
||||
"app.learningDashboard.pollsTable.userLabel": "Користувач",
|
||||
"app.learningDashboard.statusTimelineTable.title": "Перебіг",
|
||||
"app.learningDashboard.statusTimelineTable.thumbnail": "Іконка презентації",
|
||||
"app.learningDashboard.statusTimelineTable.presentation": "Презентація",
|
||||
"app.learningDashboard.statusTimelineTable.pageNumber": "Сторінка",
|
||||
"app.learningDashboard.statusTimelineTable.setAt": "Станом на",
|
||||
"app.learningDashboard.errors.invalidToken": "Недійсна лексема сеансу",
|
||||
"app.learningDashboard.errors.dataUnavailable": "Дані більше недоступні",
|
||||
"mobileApp.portals.list.empty.addFirstPortal.label": "Додайте свій перший портал кнопками вище",
|
||||
@ -1056,6 +1304,4 @@
|
||||
"mobileApp.portals.addPortalPopup.validation.emptyFields": "Необхідні поля",
|
||||
"mobileApp.portals.addPortalPopup.validation.portalNameAlreadyExists": "Ім'я вже використовується",
|
||||
"mobileApp.portals.addPortalPopup.validation.urlInvalid": "Помилка завантаження сторінки - перевірте посилання та з'єднання з мережею"
|
||||
|
||||
}
|
||||
|
||||
|
@ -345,6 +345,13 @@ exports.lockPrivateChat = 'input[data-test="lockPrivateChat"]';
|
||||
exports.lockEditSharedNotes = 'input[data-test="lockEditSharedNotes"]';
|
||||
exports.lockUserList = 'input[data-test="lockUserList"]';
|
||||
|
||||
// Closed Captions
|
||||
exports.writeClosedCaptions = 'li[data-test="writeClosedCaptions"]';
|
||||
exports.startWritingClosedCaptions = 'button[data-test="startWritingClosedCaptions"]';
|
||||
exports.startViewingClosedCaptionsBtn = 'button[data-test="startViewingClosedCaptionsBtn"]';
|
||||
exports.startViewingClosedCaptions = 'button[data-test="startViewingClosedCaptions"]';
|
||||
exports.liveCaptions = 'div[data-test="liveCaptions"]';
|
||||
|
||||
// Locales
|
||||
exports.locales = ['af', 'ar', 'az', 'bg-BG', 'bn', 'ca', 'cs-CZ', 'da', 'de',
|
||||
'dv', 'el-GR', 'en', 'eo', 'es', 'es-419', 'es-ES', 'es-MX', 'et', 'eu',
|
||||
|
@ -5,6 +5,7 @@ const e = require('../core/elements');
|
||||
const { waitAndClearDefaultPresentationNotification } = require('../notifications/util');
|
||||
const { sleep } = require('../core/helpers');
|
||||
const { checkAvatarIcon, checkIsPresenter, checkMutedUsers } = require('./util');
|
||||
const { getNotesLocator } = require('../sharednotes/util');
|
||||
const { checkTextContent } = require('../core/util');
|
||||
const { getSettings } = require('../core/settings');
|
||||
const { ELEMENT_WAIT_LONGER_TIME } = require('../core/constants');
|
||||
@ -265,6 +266,27 @@ class MultiUsers {
|
||||
|
||||
await this.modPage.hasElement(e.multiUsersWhiteboardOn);
|
||||
}
|
||||
|
||||
async writeClosedCaptions() {
|
||||
await this.modPage.waitForSelector(e.whiteboard);
|
||||
await this.modPage2.waitForSelector(e.whiteboard);
|
||||
|
||||
await this.modPage.waitAndClick(e.manageUsers);
|
||||
await this.modPage.waitAndClick(e.writeClosedCaptions);
|
||||
await this.modPage.waitAndClick(e.startWritingClosedCaptions);
|
||||
|
||||
await this.modPage.waitAndClick(e.startViewingClosedCaptionsBtn);
|
||||
await this.modPage2.waitAndClick(e.startViewingClosedCaptionsBtn);
|
||||
|
||||
await this.modPage.waitAndClick(e.startViewingClosedCaptions);
|
||||
await this.modPage2.waitAndClick(e.startViewingClosedCaptions);
|
||||
|
||||
const notesLocator = getNotesLocator(this.modPage);
|
||||
await notesLocator.type(e.message);
|
||||
|
||||
await this.modPage.hasText(e.liveCaptions, e.message);
|
||||
await this.modPage2.hasText(e.liveCaptions, e.message);
|
||||
}
|
||||
}
|
||||
|
||||
exports.MultiUsers = MultiUsers;
|
||||
|
@ -226,6 +226,13 @@ test.describe.parallel('User', () => {
|
||||
await multiusers.initUserPage(false);
|
||||
await multiusers.muteAllUsersExceptPresenter();
|
||||
});
|
||||
|
||||
test('Write closed captions', async ({ browser, context, page }) => {
|
||||
const multiusers = new MultiUsers(browser, context);
|
||||
await multiusers.initModPage(page, true);
|
||||
await multiusers.initModPage2(true);
|
||||
await multiusers.writeClosedCaptions();
|
||||
});
|
||||
});
|
||||
|
||||
test.describe.parallel('Mobile devices', () => {
|
||||
|
15
bigbluebutton-tests/puppeteer/package-lock.json
generated
15
bigbluebutton-tests/puppeteer/package-lock.json
generated
@ -1,9 +1,10 @@
|
||||
{
|
||||
"name": "npm-proj-1662702934055-0.944182342486958pXOD4I",
|
||||
"name": "puppeteer",
|
||||
"lockfileVersion": 2,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "puppeteer",
|
||||
"dependencies": {
|
||||
"axios": "^0.26.1",
|
||||
"babel-jest": "^27.5.1",
|
||||
@ -4274,9 +4275,9 @@
|
||||
"integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
|
||||
},
|
||||
"node_modules/json5": {
|
||||
"version": "2.2.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz",
|
||||
"integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==",
|
||||
"version": "2.2.3",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
|
||||
"integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
|
||||
"bin": {
|
||||
"json5": "lib/cli.js"
|
||||
},
|
||||
@ -8615,9 +8616,9 @@
|
||||
"integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
|
||||
},
|
||||
"json5": {
|
||||
"version": "2.2.1",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz",
|
||||
"integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA=="
|
||||
"version": "2.2.3",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
|
||||
"integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="
|
||||
},
|
||||
"jsonfile": {
|
||||
"version": "6.1.0",
|
||||
|
@ -62,8 +62,7 @@ To package the application for production:
|
||||
3. Create a new directory `mkdir exploded`
|
||||
4. Navigate to that directory `cd exploded`
|
||||
5. Extract the war content `jar -xvf ../build/libs/bigbluebutton-0.10.0.war`
|
||||
6. Copy run script into exploded dir `cp ../run-prod.sh .`
|
||||
7. Package the content of the new directory in a debian package then add service configuration. Install into `/usr/share/bbb-web`.
|
||||
8. Create a systemd service file that runs `run-prod.sh`. App will be listening on port 8080
|
||||
9. To do custom config, edit `/usr/share/bbb-web/WEB-INF/classes/bigbluebutton.properties`
|
||||
6. Package the content of the new directory in a debian package then add service configuration. Install into `/usr/share/bbb-web`.
|
||||
7. Use the systemd service file provided in build/package-template/bbb-web. App will be listening on port 8080
|
||||
8. To do custom config, edit `/usr/share/bbb-web/WEB-INF/classes/bigbluebutton.properties`
|
||||
Don't forget to use full directories path and replace the dot before the org with the full path to the exploded war.
|
||||
|
@ -413,7 +413,7 @@ endWhenNoModerator=false
|
||||
endWhenNoModeratorDelayInMinutes=1
|
||||
|
||||
# List of features to disable (comma-separated)
|
||||
# Available options: breakoutRooms, captions, chat, externalVideos, layouts, learningDashboard, polls, screenshare,
|
||||
# Available options: breakoutRooms, liveTranscription, captions, chat, externalVideos, layouts, learningDashboard, polls, screenshare,
|
||||
# sharedNotes, virtualBackgrounds, downloadPresentationWithAnnotations, importPresentationWithAnnotationsFromBreakoutRooms, importSharedNotesFromBreakoutRooms
|
||||
# disabledFeatures=
|
||||
|
||||
@ -422,3 +422,12 @@ notifyRecordingIsOn=false
|
||||
|
||||
# Allow endpoint with current BigBlueButton version
|
||||
allowRevealOfBBBVersion=false
|
||||
|
||||
# legacy method for disabling of the learning analytics dashboard; please use disabledFeatures=learningDashboard
|
||||
learningDashboardEnabled=true
|
||||
|
||||
# legacy method for disabling of the breakout rooms; please use disabledFeatures=breakoutRooms
|
||||
breakoutRoomsEnabled=true
|
||||
|
||||
# legacy, please use maxUserConcurrentAccesses instead
|
||||
allowDuplicateExtUserid=true
|
||||
|
@ -157,7 +157,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
<property name="disableRecordingDefault" value="${disableRecordingDefault}"/>
|
||||
<property name="autoStartRecording" value="${autoStartRecording}"/>
|
||||
<property name="allowStartStopRecording" value="${allowStartStopRecording}"/>
|
||||
<property name="learningDashboardEnabled" value="${learningDashboardEnabled:true}"/>
|
||||
<property name="learningDashboardEnabled" value="${learningDashboardEnabled}"/>
|
||||
<property name="learningDashboardCleanupDelayInMinutes" value="${learningDashboardCleanupDelayInMinutes}"/>
|
||||
<property name="webcamsOnlyForModerator" value="${webcamsOnlyForModerator}"/>
|
||||
<property name="defaultMeetingCameraCap" value="${meetingCameraCap}"/>
|
||||
@ -178,7 +178,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
<property name="muteOnStart" value="${muteOnStart}"/>
|
||||
<property name="allowModsToUnmuteUsers" value="${allowModsToUnmuteUsers}"/>
|
||||
<property name="allowModsToEjectCameras" value="${allowModsToEjectCameras}"/>
|
||||
<property name="breakoutRoomsEnabled" value="${breakoutRoomsEnabled:true}"/>
|
||||
<property name="breakoutRoomsEnabled" value="${breakoutRoomsEnabled}"/>
|
||||
<property name="breakoutRoomsRecord" value="${breakoutRoomsRecord}"/>
|
||||
<property name="breakoutRoomsPrivateChatEnabled" value="${breakoutRoomsPrivateChatEnabled}"/>
|
||||
<property name="lockSettingsDisableCam" value="${lockSettingsDisableCam}"/>
|
||||
@ -191,7 +191,7 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
|
||||
<property name="lockSettingsLockOnJoin" value="${lockSettingsLockOnJoin}"/>
|
||||
<property name="lockSettingsLockOnJoinConfigurable" value="${lockSettingsLockOnJoinConfigurable}"/>
|
||||
<property name="lockSettingsHideViewersCursor" value="${lockSettingsHideViewersCursor}"/>
|
||||
<property name="allowDuplicateExtUserid" value="${allowDuplicateExtUserid:true}"/>
|
||||
<property name="allowDuplicateExtUserid" value="${allowDuplicateExtUserid}"/>
|
||||
<property name="maxUserConcurrentAccesses" value="${maxUserConcurrentAccesses}"/>
|
||||
<property name="endWhenNoModerator" value="${endWhenNoModerator}"/>
|
||||
<property name="endWhenNoModeratorDelayInMinutes" value="${endWhenNoModeratorDelayInMinutes}"/>
|
||||
|
@ -1,2 +0,0 @@
|
||||
#!/bin/bash
|
||||
exec java -Dgrails.env=prod -Dserver.address=127.0.0.1 -Dserver.port=8090 -Dspring.main.allow-circular-references=true -Xms384m -Xmx384m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/bigbluebutton/diagnostics -cp WEB-INF/lib/*:/:WEB-INF/classes/:. org.springframework.boot.loader.WarLauncher
|
@ -28,6 +28,10 @@ location /html5client/fonts {
|
||||
alias /usr/share/meteor/bundle/programs/web.browser/app/fonts;
|
||||
}
|
||||
|
||||
location /html5client/files {
|
||||
alias /usr/share/meteor/bundle/programs/web.browser/app/files;
|
||||
}
|
||||
|
||||
location /html5client/wasm {
|
||||
types {
|
||||
application/wasm wasm;
|
||||
|
@ -72,6 +72,10 @@ npm i
|
||||
cd -
|
||||
cp -r /tmp/html5-build/bundle staging/usr/share/meteor
|
||||
|
||||
# copy over tl;draw fonts due to a preset path
|
||||
mkdir -p staging/usr/share/meteor/bundle/programs/web.browser/app/files
|
||||
cp node_modules/@fontsource/*/files/*.woff[2] staging/usr/share/meteor/bundle/programs/web.browser/app/files/
|
||||
|
||||
cp systemd_start.sh staging/usr/share/meteor/bundle
|
||||
chmod +x staging/usr/share/meteor/bundle/systemd_start.sh
|
||||
|
||||
|
6
build/packages-template/bbb-web/bbb-web.env
Normal file
6
build/packages-template/bbb-web/bbb-web.env
Normal file
@ -0,0 +1,6 @@
|
||||
ENV=prod
|
||||
LISTEN_ADDRESS=127.0.0.1
|
||||
LISTEN_PORT=8090
|
||||
INITIAL_HEAP_SIZE=384m
|
||||
MAX_HEAP_SIZE=384m
|
||||
HEAP_DUMP_PATH=/var/bigbluebutton/diagnostics
|
@ -10,9 +10,8 @@ Type=simple
|
||||
User=bigbluebutton
|
||||
Group=bigbluebutton
|
||||
WorkingDirectory=/usr/share/bbb-web
|
||||
#EnvironmentFile=/etc/default/bbb-web
|
||||
#ExecStartPre=/bin/chown -R bigbluebutton:bigbluebutton /usr/share/bbb-web
|
||||
ExecStart=/usr/share/bbb-web/run-prod.sh
|
||||
EnvironmentFile=/etc/default/bbb-web
|
||||
ExecStart=java -Dgrails.env=${ENV} -Dserver.address=${LISTEN_ADDRESS} -Dserver.port=${LISTEN_PORT} -Dspring.main.allow-circular-references=true -Xms${INITIAL_HEAP_SIZE} -Xmx${MAX_HEAP_SIZE} -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${HEAP_DUMP_PATH} -cp WEB-INF/lib/*:/:WEB-INF/classes/:. org.springframework.boot.loader.WarLauncher
|
||||
ExecReload=/bin/kill -HUP $MAINPID
|
||||
Restart=always
|
||||
RestartSec=60
|
||||
|
@ -79,7 +79,9 @@ echo $PWD
|
||||
|
||||
mkdir -p "$STAGING"/usr/share/bbb-web
|
||||
mv build/libs/bigbluebutton-0.10.0.war "$STAGING"/usr/share/bbb-web
|
||||
cp run-prod.sh "$STAGING"/usr/share/bbb-web
|
||||
|
||||
mkdir -p "$STAGING"/etc/default
|
||||
cp ../bbb-web.env "$STAGING"/etc/default/bbb-web
|
||||
|
||||
mkdir -p "$STAGING"/lib/systemd/system
|
||||
cp ../bbb-web.service "$STAGING"/lib/systemd/system
|
||||
|
@ -1,3 +1,3 @@
|
||||
. ./opts-global.sh
|
||||
|
||||
OPTS="$OPTS -t deb -d zip,unzip,imagemagick,redis-server,xpdf-utils,bbb-libreoffice-docker,psmisc,fonts-crosextra-carlito,fonts-crosextra-caladea,fonts-noto,openjdk-11-jdk"
|
||||
OPTS="$OPTS -t deb -d zip,unzip,imagemagick,redis-server,xpdf-utils,bbb-libreoffice-docker,psmisc,fonts-crosextra-carlito,fonts-crosextra-caladea,fonts-noto,openjdk-11-jdk,file"
|
||||
|
@ -536,8 +536,8 @@ module BigBlueButton
|
||||
ffmpeg_filter << "[#{input_index}]"
|
||||
# Scale the video length for the deskshare timestamp workaround
|
||||
ffmpeg_filter << "setpts=PTS*#{scale}," unless scale.nil?
|
||||
# Clean up the video framerate and extend the video if needed
|
||||
ffmpeg_filter << "fps=#{layout[:framerate]},tpad=stop=-1:stop_mode=clone"
|
||||
# Extend the video if needed and clean up the framerate
|
||||
ffmpeg_filter << "tpad=stop=-1:stop_mode=clone,fps=#{layout[:framerate]}"
|
||||
# Apply PTS offset so '0' time is aligned, and trim frames before start point
|
||||
ffmpeg_filter << ",setpts=PTS-#{ms_to_s(video[:timestamp])}/TB,trim=start=0"
|
||||
ffmpeg_filter << "[#{pad_name}];"
|
||||
|
Loading…
Reference in New Issue
Block a user