Merge remote-tracking branch 'upstream/v2.6.x-release' into disabled-transcriptions

This commit is contained in:
GuiLeme 2023-01-09 10:58:25 -03:00
commit 78b165ed7c
117 changed files with 2692 additions and 939 deletions

View File

@ -13,7 +13,7 @@ jobs:
build-install-and-test:
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
- run: ./build/get_external_dependencies.sh
- run: ./build/setup.sh bbb-apps-akka
- run: ./build/setup.sh bbb-config

View File

@ -6,8 +6,13 @@ on:
- opened
- synchronize
permissions:
contents: read
jobs:
main:
permissions:
pull-requests: write # for eps1lon/actions-label-merge-conflict to label PRs
runs-on: ubuntu-latest
steps:
- name: Check for dirty pull requests

View File

@ -1,4 +1,5 @@
# set up stages
#
variables:
GIT_STRATEGY: fetch
@ -11,7 +12,7 @@ stages:
# define which docker image to use for builds
default:
image: gitlab.senfcall.de:5050/senfcall-public/docker-bbb-build:v2022-12-08-meteor-290
image: gitlab.senfcall.de:5050/senfcall-public/docker-bbb-build:v2022-12-29-grails-524
# This stage uses git to find out since when each package has been unmodified.
# it then checks an API endpoint on the package server to find out for which of
@ -99,7 +100,7 @@ bbb-html5-build:
script:
- build/setup-inside-docker.sh bbb-html5
bbb-learning-dashboard:
bbb-learning-dashboard-build:
extends: .build_job
script:
- build/setup-inside-docker.sh bbb-learning-dashboard

View File

@ -18,7 +18,7 @@ val compileSettings = Seq(
"-Xlint",
"-Ywarn-dead-code",
"-language:_",
"-target:jvm-1.11",
"-target:11",
"-encoding", "UTF-8"
),
javacOptions ++= List(
@ -48,7 +48,7 @@ lazy val bbbAppsAkka = (project in file(".")).settings(name := "bbb-apps-akka",
// Config file is in ./.scalariform.conf
scalariformAutoformat := true
scalaVersion := "2.13.4"
scalaVersion := "2.13.9"
//-----------
// Packaging
//

View File

@ -7,7 +7,7 @@ sudo dpkg -i target/bbb-apps-akka_*.deb
echo ''
echo ''
echo '----------------'
echo 'bbb-web updated'
echo 'bbb-apps-akka updated'
sudo service bbb-apps-akka start
echo 'starting service bbb-web'
echo 'starting service bbb-apps-akka'

View File

@ -7,7 +7,7 @@ object Dependencies {
object Versions {
// Scala
val scala = "2.13.4"
val scala = "2.13.9"
val junit = "4.12"
val junitInterface = "0.11"
val scalactic = "3.0.8"
@ -26,7 +26,7 @@ object Dependencies {
val codec = "1.15"
// BigBlueButton
val bbbCommons = "0.0.21-SNAPSHOT"
val bbbCommons = "0.0.22-SNAPSHOT"
// Test
val scalaTest = "3.2.11"

View File

@ -13,6 +13,12 @@ import java.io.File
trait PresentationWithAnnotationsMsgHdlr extends RightsManagementTrait {
this: PresentationPodHdlrs =>
object JobTypes {
val DOWNLOAD = "PresentationWithAnnotationDownloadJob"
val CAPTURE_PRESENTATION = "PresentationWithAnnotationExportJob"
val CAPTURE_NOTES = "PadCaptureJob"
}
def buildStoreAnnotationsInRedisSysMsg(annotations: StoredAnnotations, liveMeeting: LiveMeeting): BbbCommonEnvCoreMsg = {
val routing = collection.immutable.HashMap("sender" -> "bbb-apps-akka")
val envelope = BbbCoreEnvelope(StoreAnnotationsInRedisSysMsg.NAME, routing)
@ -111,7 +117,6 @@ trait PresentationWithAnnotationsMsgHdlr extends RightsManagementTrait {
log.error(s"Presentation ${presId} not found in meeting ${meetingId}")
} else {
val jobType: String = "PresentationWithAnnotationDownloadJob"
val jobId: String = RandomStringGenerator.randomAlphanumericString(16);
val allPages: Boolean = m.body.allPages
val pageCount = currentPres.get.pages.size
@ -120,7 +125,7 @@ trait PresentationWithAnnotationsMsgHdlr extends RightsManagementTrait {
val pages: List[Int] = m.body.pages // Desired presentation pages for export
val pagesRange: List[Int] = if (allPages) (1 to pageCount).toList else pages
val exportJob: ExportJob = new ExportJob(jobId, jobType, "annotated_slides", presId, presLocation, allPages, pagesRange, meetingId, "");
val exportJob: ExportJob = new ExportJob(jobId, JobTypes.DOWNLOAD, "annotated_slides", presId, presLocation, allPages, pagesRange, meetingId, "");
val storeAnnotationPages: List[PresentationPageForExport] = getPresentationPagesForExport(pagesRange, pageCount, presId, currentPres, liveMeeting);
// Send Export Job to Redis
@ -147,7 +152,6 @@ trait PresentationWithAnnotationsMsgHdlr extends RightsManagementTrait {
} else {
val jobId: String = RandomStringGenerator.randomAlphanumericString(16);
val jobType = "PresentationWithAnnotationExportJob"
val allPages: Boolean = m.allPages
val pageCount = currentPres.get.pages.size
@ -172,7 +176,7 @@ trait PresentationWithAnnotationsMsgHdlr extends RightsManagementTrait {
// 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))
val exportJob: ExportJob = new ExportJob(jobId, jobType, filename, presId, presLocation, allPages, pagesRange, parentMeetingId, presentationUploadToken)
val exportJob: ExportJob = new ExportJob(jobId, JobTypes.CAPTURE_PRESENTATION, filename, presId, presLocation, allPages, pagesRange, parentMeetingId, presentationUploadToken)
val storeAnnotationPages: List[PresentationPageForExport] = getPresentationPagesForExport(pagesRange, pageCount, presId, currentPres, liveMeeting);
// Send Export Job to Redis
@ -210,13 +214,12 @@ trait PresentationWithAnnotationsMsgHdlr extends RightsManagementTrait {
val userId: String = "system"
val jobId: String = s"${m.body.breakoutId}-notes" // Used as the temporaryPresentationId upon upload
val jobType = "PadCaptureJob"
val filename = m.body.filename
val presentationUploadToken: String = PresentationPodsApp.generateToken("DEFAULT_PRESENTATION_POD", userId)
bus.outGW.send(buildPresentationUploadTokenSysPubMsg(m.body.parentMeetingId, userId, presentationUploadToken, filename))
val exportJob = new ExportJob(jobId, jobType, filename, m.body.padId, "", true, List(), m.body.parentMeetingId, presentationUploadToken)
val exportJob = new ExportJob(jobId, JobTypes.CAPTURE_NOTES, filename, m.body.padId, "", true, List(), m.body.parentMeetingId, presentationUploadToken)
val job = buildStoreExportJobInRedisSysMsg(exportJob, liveMeeting)
bus.outGW.send(job)

View File

@ -42,6 +42,17 @@ trait ChangeLockSettingsInMeetingCmdMsgHdlr extends RightsManagementTrait {
MeetingStatus2x.setPermissions(liveMeeting.status, settings)
// Dial-in
def buildLockMessage(meetingId: String, userId: String, lockedBy: String, locked: Boolean): BbbCommonEnvCoreMsg = {
val routing = Routing.addMsgToClientRouting(MessageTypes.BROADCAST_TO_MEETING, meetingId, userId)
val envelope = BbbCoreEnvelope(UserLockedInMeetingEvtMsg.NAME, routing)
val body = UserLockedInMeetingEvtMsgBody(userId, locked, lockedBy)
val header = BbbClientMsgHeader(UserLockedInMeetingEvtMsg.NAME, meetingId, userId)
val event = UserLockedInMeetingEvtMsg(header, body)
BbbCommonEnvCoreMsg(envelope, event)
}
if (oldPermissions.disableCam != settings.disableCam) {
if (settings.disableCam) {
val notifyEvent = MsgBuilder.buildNotifyAllInMeetingEvtMsg(
@ -55,24 +66,6 @@ trait ChangeLockSettingsInMeetingCmdMsgHdlr extends RightsManagementTrait {
outGW.send(notifyEvent)
LockSettingsUtil.enforceCamLockSettingsForAllUsers(liveMeeting, outGW)
// Dial-in
def buildLockMessage(meetingId: String, userId: String, lockedBy: String, locked: Boolean): BbbCommonEnvCoreMsg = {
val routing = Routing.addMsgToClientRouting(MessageTypes.BROADCAST_TO_MEETING, meetingId, userId)
val envelope = BbbCoreEnvelope(UserLockedInMeetingEvtMsg.NAME, routing)
val body = UserLockedInMeetingEvtMsgBody(userId, locked, lockedBy)
val header = BbbClientMsgHeader(UserLockedInMeetingEvtMsg.NAME, meetingId, userId)
val event = UserLockedInMeetingEvtMsg(header, body)
BbbCommonEnvCoreMsg(envelope, event)
}
VoiceUsers.findAll(liveMeeting.voiceUsers) foreach { vu =>
if (vu.intId.startsWith(IntIdPrefixType.DIAL_IN)) { // only Dial-in users need this
val eventExplicitLock = buildLockMessage(liveMeeting.props.meetingProp.intId, vu.intId, msg.body.setBy, settings.disableMic)
outGW.send(eventExplicitLock)
}
}
} else {
val notifyEvent = MsgBuilder.buildNotifyAllInMeetingEvtMsg(
liveMeeting.props.meetingProp.intId,
@ -97,8 +90,12 @@ trait ChangeLockSettingsInMeetingCmdMsgHdlr extends RightsManagementTrait {
Vector()
)
outGW.send(notifyEvent)
// Apply lock settings when disableMic from false to true.
VoiceUsers.findAll(liveMeeting.voiceUsers) foreach { vu =>
if (vu.intId.startsWith(IntIdPrefixType.DIAL_IN)) { // only Dial-in users need this
val eventExplicitLock = buildLockMessage(liveMeeting.props.meetingProp.intId, vu.intId, msg.body.setBy, settings.disableMic)
outGW.send(eventExplicitLock)
}
}
LockSettingsUtil.enforceLockSettingsForAllVoiceUsers(liveMeeting, outGW)
} else {
val notifyEvent = MsgBuilder.buildNotifyAllInMeetingEvtMsg(

View File

@ -18,7 +18,7 @@ val compileSettings = Seq(
"-Xlint",
"-Ywarn-dead-code",
"-language:_",
"-target:jvm-1.11",
"-target:11",
"-encoding", "UTF-8"
),
javacOptions ++= List(
@ -27,7 +27,7 @@ val compileSettings = Seq(
)
)
scalaVersion := "2.13.4"
scalaVersion := "2.13.9"
resolvers += Resolver.sonatypeRepo("releases")

View File

@ -7,7 +7,7 @@ object Dependencies {
object Versions {
// Scala
val scala = "2.13.4"
val scala = "2.13.9"
val junitInterface = "0.11"
val scalactic = "3.0.8"
@ -21,8 +21,8 @@ object Dependencies {
val codec = "1.15"
// BigBlueButton
val bbbCommons = "0.0.21-SNAPSHOT"
val bbbFsesl = "0.0.8-SNAPSHOT"
val bbbCommons = "0.0.22-SNAPSHOT"
val bbbFsesl = "0.0.9-SNAPSHOT"
// Test
val scalaTest = "3.2.11"

View File

@ -1,7 +1,7 @@
import org.bigbluebutton.build._
version := "0.0.21-SNAPSHOT"
version := "0.0.22-SNAPSHOT"
val compileSettings = Seq(
organization := "org.bigbluebutton",
@ -12,7 +12,7 @@ val compileSettings = Seq(
"-Xlint",
"-Ywarn-dead-code",
"-language:_",
"-target:jvm-1.11",
"-target:11",
"-encoding", "UTF-8"
),
javacOptions ++= List(
@ -55,7 +55,7 @@ scalariformAutoformat := true
// Do not append Scala versions to the generated artifacts
//crossPaths := false
scalaVersion := "2.13.4"
scalaVersion := "2.13.9"
// This forbids including Scala related libraries into the dependency
//autoScalaLibrary := false

View File

@ -7,7 +7,7 @@ object Dependencies {
object Versions {
// Scala
val scala = "2.13.4"
val scala = "2.13.9"
val junit = "4.12"
val junitInterface = "0.11"
val scalactic = "3.0.8"

View File

@ -9,16 +9,16 @@ case class DurationProps(duration: Int, createdTime: Long, createdDate: String,
endWhenNoModerator: Boolean, endWhenNoModeratorDelayInMinutes: Int)
case class MeetingProp(
name: String,
extId: String,
intId: String,
meetingCameraCap: Int,
maxPinnedCameras: Int,
isBreakout: Boolean,
disabledFeatures: Vector[String],
notifyRecordingIsOn: Boolean,
uploadExternalDescription: String,
uploadExternalUrl: String,
name: String,
extId: String,
intId: String,
meetingCameraCap: Int,
maxPinnedCameras: Int,
isBreakout: Boolean,
disabledFeatures: Vector[String],
notifyRecordingIsOn: Boolean,
presentationUploadExternalDescription: String,
presentationUploadExternalUrl: String,
)
case class BreakoutProps(

View File

@ -11,7 +11,7 @@ val compileSettings = Seq(
"-Xlint",
"-Ywarn-dead-code",
"-language:_",
"-target:jvm-1.11",
"-target:11",
"-encoding", "UTF-8"
),
javacOptions ++= List(
@ -40,7 +40,7 @@ lazy val commonWeb = (project in file(".")).settings(name := "bbb-common-web", l
// Config file is in ./.scalariform.conf
scalariformAutoformat := true
scalaVersion := "2.13.4"
scalaVersion := "2.13.9"
//-----------
// Packaging
//
@ -101,15 +101,10 @@ licenses := Seq("LGPL-3.0" -> url("http://opensource.org/licenses/LGPL-3.0"))
homepage := Some(url("http://www.bigbluebutton.org"))
libraryDependencies += "javax.validation" % "validation-api" % "2.0.1.Final"
libraryDependencies += "org.springframework.boot" % "spring-boot-starter-validation" % "2.7.1"
libraryDependencies += "org.glassfish" % "javax.el" % "3.0.1-b12"
libraryDependencies += "org.apache.httpcomponents" % "httpclient" % "4.5.13"
libraryDependencies ++= Seq(
"javax.validation" % "validation-api" % "2.0.1.Final",
"org.springframework.boot" % "spring-boot-starter-validation" % "2.6.1",
"org.springframework.data" % "spring-data-commons" % "2.6.1",
"org.springframework.boot" % "spring-boot-starter-validation" % "2.7.1",
"org.springframework.data" % "spring-data-commons" % "2.7.6",
"org.glassfish" % "javax.el" % "3.0.1-b12",
"org.apache.httpcomponents" % "httpclient" % "4.5.13",
"org.postgresql" % "postgresql" % "42.2.16",

View File

@ -7,7 +7,7 @@ object Dependencies {
object Versions {
// Scala
val scala = "2.13.4"
val scala = "2.13.9"
val junit = "4.12"
val junitInterface = "0.11"
val scalactic = "3.0.8"
@ -34,7 +34,7 @@ object Dependencies {
val text = "1.10.0"
// BigBlueButton
val bbbCommons = "0.0.21-SNAPSHOT"
val bbbCommons = "0.0.22-SNAPSHOT"
// Test
val scalaTest = "3.2.11"

View File

@ -73,8 +73,8 @@ public class ApiParams {
public static final String DISABLED_FEATURES = "disabledFeatures";
public static final String NOTIFY_RECORDING_IS_ON = "notifyRecordingIsOn";
public static final String UPLOAD_EXTERNAL_DESCRIPTION = "uploadExternalDescription";
public static final String UPLOAD_EXTERNAL_URL = "uploadExternalUrl";
public static final String PRESENTATION_UPLOAD_EXTERNAL_DESCRIPTION = "presentationUploadExternalDescription";
public static final String PRESENTATION_UPLOAD_EXTERNAL_URL = "presentationUploadExternalUrl";
public static final String BREAKOUT_ROOMS_CAPTURE_SLIDES = "breakoutRoomsCaptureSlides";
public static final String BREAKOUT_ROOMS_CAPTURE_NOTES = "breakoutRoomsCaptureNotes";

View File

@ -419,7 +419,7 @@ public class MeetingService implements MessageListener {
m.getMuteOnStart(), m.getAllowModsToUnmuteUsers(), m.getAllowModsToEjectCameras(), m.getMeetingKeepEvents(),
m.breakoutRoomsParams, m.lockSettingsParams, m.getHtml5InstanceId(),
m.getGroups(), m.getDisabledFeatures(), m.getNotifyRecordingIsOn(),
m.getUploadExternalDescription(), m.getUploadExternalUrl());
m.getPresentationUploadExternalDescription(), m.getPresentationUploadExternalUrl());
}
private String formatPrettyDate(Long timestamp) {

View File

@ -81,6 +81,7 @@ public class ParamsProcessorUtil {
private String defaultHTML5ClientUrl;
private String defaultGuestWaitURL;
private Boolean allowRequestsWithoutSession = false;
private Integer defaultHttpSessionTimeout = 14400;
private Boolean useDefaultAvatar = false;
private String defaultAvatarURL;
private String defaultGuestPolicy;
@ -104,8 +105,8 @@ public class ParamsProcessorUtil {
private boolean defaultKeepEvents = false;
private Boolean useDefaultLogo;
private String defaultLogoURL;
private String defaultUploadExternalDescription = "";
private String defaultUploadExternalUrl = "";
private String defaultPresentationUploadExternalDescription = "";
private String defaultPresentationUploadExternalUrl = "";
private boolean defaultBreakoutRoomsEnabled = true;
private boolean defaultBreakoutRoomsRecord;
@ -639,14 +640,14 @@ public class ParamsProcessorUtil {
guestPolicy = params.get(ApiParams.GUEST_POLICY);
}
String uploadExternalDescription = defaultUploadExternalDescription;
if (!StringUtils.isEmpty(params.get(ApiParams.UPLOAD_EXTERNAL_DESCRIPTION))) {
uploadExternalDescription = params.get(ApiParams.UPLOAD_EXTERNAL_DESCRIPTION);
String presentationUploadExternalDescription = defaultPresentationUploadExternalDescription;
if (!StringUtils.isEmpty(params.get(ApiParams.PRESENTATION_UPLOAD_EXTERNAL_DESCRIPTION))) {
presentationUploadExternalDescription = params.get(ApiParams.PRESENTATION_UPLOAD_EXTERNAL_DESCRIPTION);
}
String uploadExternalUrl = defaultUploadExternalUrl;
if (!StringUtils.isEmpty(params.get(ApiParams.UPLOAD_EXTERNAL_URL))) {
uploadExternalUrl = params.get(ApiParams.UPLOAD_EXTERNAL_URL);
String presentationUploadExternalUrl = defaultPresentationUploadExternalUrl;
if (!StringUtils.isEmpty(params.get(ApiParams.PRESENTATION_UPLOAD_EXTERNAL_URL))) {
presentationUploadExternalUrl = params.get(ApiParams.PRESENTATION_UPLOAD_EXTERNAL_URL);
}
String meetingLayout = defaultMeetingLayout;
@ -737,8 +738,8 @@ public class ParamsProcessorUtil {
.withGroups(groups)
.withDisabledFeatures(listOfDisabledFeatures)
.withNotifyRecordingIsOn(notifyRecordingIsOn)
.withUploadExternalDescription(uploadExternalDescription)
.withUploadExternalUrl(uploadExternalUrl)
.withPresentationUploadExternalDescription(presentationUploadExternalDescription)
.withPresentationUploadExternalUrl(presentationUploadExternalUrl)
.build();
if (!StringUtils.isEmpty(params.get(ApiParams.MODERATOR_ONLY_MESSAGE))) {
@ -846,6 +847,14 @@ public class ParamsProcessorUtil {
return allowRequestsWithoutSession;
}
public Integer getDefaultHttpSessionTimeout() {
return defaultHttpSessionTimeout;
}
public void setDefaultHttpSessionTimeout(Integer value) {
this.defaultHttpSessionTimeout = value;
}
public String getDefaultLogoutUrl() {
if ((StringUtils.isEmpty(defaultLogoutUrl)) || "default".equalsIgnoreCase(defaultLogoutUrl)) {
return defaultServerUrl;
@ -1445,12 +1454,12 @@ public class ParamsProcessorUtil {
this.defaultNotifyRecordingIsOn = notifyRecordingIsOn;
}
public void setUploadExternalDescription(String uploadExternalDescription) {
this.defaultUploadExternalDescription = uploadExternalDescription;
public void setPresentationUploadExternalDescription(String presentationUploadExternalDescription) {
this.defaultPresentationUploadExternalDescription = presentationUploadExternalDescription;
}
public void setUploadExternalUrl(String uploadExternalUrl) {
this.defaultUploadExternalUrl = uploadExternalUrl;
public void setPresentationUploadExternalUrl(String presentationUploadExternalUrl) {
this.defaultPresentationUploadExternalUrl = presentationUploadExternalUrl;
}
public void setBbbVersion(String version) {

View File

@ -97,8 +97,8 @@ public class Meeting {
private Boolean allowRequestsWithoutSession = false;
private Boolean allowModsToEjectCameras = false;
private Boolean meetingKeepEvents;
private String uploadExternalDescription;
private String uploadExternalUrl;
private String presentationUploadExternalDescription;
private String presentationUploadExternalUrl;
private Integer meetingExpireIfNoUserJoinedInMinutes = 5;
private Integer meetingExpireWhenLastUserLeftInMinutes = 1;
@ -123,8 +123,8 @@ public class Meeting {
intMeetingId = builder.internalId;
disabledFeatures = builder.disabledFeatures;
notifyRecordingIsOn = builder.notifyRecordingIsOn;
uploadExternalDescription = builder.uploadExternalDescription;
uploadExternalUrl = builder.uploadExternalUrl;
presentationUploadExternalDescription = builder.presentationUploadExternalDescription;
presentationUploadExternalUrl = builder.presentationUploadExternalUrl;
if (builder.viewerPass == null){
viewerPass = "";
} else {
@ -424,11 +424,11 @@ public class Meeting {
return notifyRecordingIsOn;
}
public String getUploadExternalDescription() {
return uploadExternalDescription;
public String getPresentationUploadExternalDescription() {
return presentationUploadExternalDescription;
}
public String getUploadExternalUrl() {
return uploadExternalUrl;
public String getPresentationUploadExternalUrl() {
return presentationUploadExternalUrl;
}
public String getWelcomeMessageTemplate() {
@ -863,8 +863,8 @@ public class Meeting {
private String learningDashboardAccessToken;
private ArrayList<String> disabledFeatures;
private Boolean notifyRecordingIsOn;
private String uploadExternalDescription;
private String uploadExternalUrl;
private String presentationUploadExternalDescription;
private String presentationUploadExternalUrl;
private int duration;
private String webVoice;
private String telVoice;
@ -993,13 +993,13 @@ public class Meeting {
return this;
}
public Builder withUploadExternalDescription(String d) {
this.uploadExternalDescription = d;
public Builder withPresentationUploadExternalDescription(String d) {
this.presentationUploadExternalDescription = d;
return this;
}
public Builder withUploadExternalUrl(String u) {
this.uploadExternalUrl = u;
public Builder withPresentationUploadExternalUrl(String u) {
this.presentationUploadExternalUrl = u;
return this;
}

View File

@ -25,8 +25,8 @@ public class CreateMeetingMessage {
public final String learningDashboardAccessToken;
public final ArrayList<String> disabledFeatures;
public final Boolean notifyRecordingIsOn;
public final String uploadExternalDescription;
public final String uploadExternalUrl;
public final String presentationUploadExternalDescription;
public final String presentationUploadExternalUrl;
public final Long createTime;
public final String createDate;
public final Map<String, String> metadata;
@ -38,8 +38,8 @@ public class CreateMeetingMessage {
String viewerPass, String learningDashboardAccessToken,
ArrayList<String> disabledFeatures,
Boolean notifyRecordingIsOn,
String uploadExternalDescription,
String uploadExternalUrl,
String presentationUploadExternalDescription,
String presentationUploadExternalUrl,
Long createTime, String createDate, Map<String, String> metadata) {
this.id = id;
this.externalId = externalId;
@ -58,8 +58,8 @@ public class CreateMeetingMessage {
this.learningDashboardAccessToken = learningDashboardAccessToken;
this.disabledFeatures = disabledFeatures;
this.notifyRecordingIsOn = notifyRecordingIsOn;
this.uploadExternalDescription = uploadExternalDescription;
this.uploadExternalUrl = uploadExternalUrl;
this.presentationUploadExternalDescription = presentationUploadExternalDescription;
this.presentationUploadExternalUrl = presentationUploadExternalUrl;
this.createTime = createTime;
this.createDate = createDate;
this.metadata = metadata;

View File

@ -18,7 +18,7 @@ public class ParamsUtil {
public static final String INVALID_CHARS = ",";
public static String stripControlChars(String text) {
return text.replaceAll("\\p{Cc}", "");
return text.replaceAll("\\p{Cc}", "").trim();
}
public static String escapeHTMLTags(String value) {

View File

@ -43,8 +43,8 @@ public interface IBbbWebApiGWApp {
ArrayList<Group> groups,
ArrayList<String> disabledFeatures,
Boolean notifyRecordingIsOn,
String uploadExternalDescription,
String uploadExternalUrl);
String presentationUploadExternalDescription,
String presentationUploadExternalUrl);
void registerUser(String meetingID, String internalUserId, String fullname, String role,
String externUserID, String authToken, String avatarURL,

View File

@ -150,8 +150,8 @@ class BbbWebApiGWApp(
groups: java.util.ArrayList[Group],
disabledFeatures: java.util.ArrayList[String],
notifyRecordingIsOn: java.lang.Boolean,
uploadExternalDescription: String,
uploadExternalUrl: String): Unit = {
presentationUploadExternalDescription: String,
presentationUploadExternalUrl: String): Unit = {
val disabledFeaturesAsVector: Vector[String] = disabledFeatures.asScala.toVector
@ -164,8 +164,8 @@ class BbbWebApiGWApp(
isBreakout = isBreakout.booleanValue(),
disabledFeaturesAsVector,
notifyRecordingIsOn,
uploadExternalDescription,
uploadExternalUrl
presentationUploadExternalDescription,
presentationUploadExternalUrl
)
val durationProps = DurationProps(

View File

@ -0,0 +1 @@
engine-strict=true

View File

@ -1,13 +1,13 @@
const config = require('../../config');
const { level } = config.log;
const {level} = config.log;
const trace = level.toLowerCase() === 'trace';
const debug = trace || level.toLowerCase() === 'debug';
const date = () => new Date().toISOString();
const parse = (messages) => {
return messages.map(message => {
return messages.map((message) => {
if (typeof message === 'object') return JSON.stringify(message);
return message;

View File

@ -0,0 +1,88 @@
const config = require('../../config');
const EXPORT_STATUSES = Object.freeze({
COLLECTING: 'COLLECTING',
PROCESSING: 'PROCESSING',
});
class PresAnnStatusMsg {
constructor(exportJob, status = EXPORT_STATUSES.COLLECTING) {
this.message = {
envelope: {
name: config.log.msgName,
routing: {
sender: exportJob.module,
},
timestamp: (new Date()).getTime(),
},
core: {
header: {
name: config.log.msgName,
meetingId: exportJob.parentMeetingId,
userId: '',
},
body: {
presId: exportJob.presId,
pageNumber: 1,
totalPages: JSON.parse(exportJob.pages).length,
status,
error: false,
},
},
};
}
build = (pageNumber = 1) => {
this.message.core.body.pageNumber = pageNumber;
this.message.envelope.timestamp = (new Date()).getTime();
const event = JSON.stringify(this.message);
this.message.core.body.error = false;
return event;
};
setError = (error = true) => {
this.message.core.body.error = error;
};
setStatus = (status) => {
this.message.core.body.status = status;
};
static get EXPORT_STATUSES() {
return EXPORT_STATUSES;
}
};
class NewPresAnnFileAvailableMsg {
constructor(exportJob, link) {
this.message = {
envelope: {
name: config.notifier.msgName,
routing: {
sender: exportJob.module,
},
timestamp: (new Date()).getTime(),
},
core: {
header: {
name: config.notifier.msgName,
meetingId: exportJob.parentMeetingId,
userId: '',
},
body: {
fileURI: link,
presId: exportJob.presId,
},
},
};
}
build = () => {
return JSON.stringify(this.message);
};
};
module.exports = {
PresAnnStatusMsg,
NewPresAnnFileAvailableMsg,
};

View File

@ -10,6 +10,7 @@
"dependencies": {
"axios": "^0.26.0",
"form-data": "^4.0.0",
"lodash": "^4.17.21",
"perfect-freehand": "^1.0.16",
"probe-image-size": "^7.2.3",
"redis": "^4.0.3",
@ -19,6 +20,10 @@
"devDependencies": {
"eslint": "^8.20.0",
"eslint-config-google": "^0.14.0"
},
"engines": {
"node": "^16.16.0",
"npm": "^8.5.0"
}
},
"node_modules/@eslint/eslintrc": {
@ -920,6 +925,11 @@
"node": ">= 0.8.0"
}
},
"node_modules/lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
},
"node_modules/lodash.merge": {
"version": "4.6.2",
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
@ -2044,6 +2054,11 @@
"type-check": "~0.4.0"
}
},
"lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
},
"lodash.merge": {
"version": "4.6.2",
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",

View File

@ -19,5 +19,9 @@
"devDependencies": {
"eslint": "^8.20.0",
"eslint-config-google": "^0.14.0"
},
"engines": {
"node": "^16.16.0",
"npm": "^8.5.0"
}
}

View File

@ -8,6 +8,7 @@ const redis = require('redis');
const sanitize = require('sanitize-filename');
const stream = require('stream');
const WorkerStarter = require('../lib/utils/worker-starter');
const {PresAnnStatusMsg} = require('../lib/utils/message-builder');
const {workerData} = require('worker_threads');
const {promisify} = require('util');
@ -55,29 +56,7 @@ async function collectAnnotationsFromRedis() {
const pdfFile = `${presFile}.pdf`;
// Message to display conversion progress toast
const statusUpdate = {
envelope: {
name: config.log.msgName,
routing: {
sender: exportJob.module,
},
timestamp: (new Date()).getTime(),
},
core: {
header: {
name: config.log.msgName,
meetingId: exportJob.parentMeetingId,
userId: '',
},
body: {
presId: exportJob.presId,
pageNumber: 1,
totalPages: pages.length,
status: 'COLLECTING',
error: false,
},
},
};
const statusUpdate = new PresAnnStatusMsg(exportJob);
if (fs.existsSync(pdfFile)) {
for (const p of pages) {
@ -103,35 +82,32 @@ async function collectAnnotationsFromRedis() {
try {
cp.spawnSync(config.shared.pdftocairo, extract_png_from_pdf, {shell: false});
} catch (error) {
const error_reason = `PDFtoCairo failed extracting slide ${pageNumber}`;
logger.error(`${error_reason} in job ${jobId}: ${error.message}`);
statusUpdate.core.body.status = error_reason;
statusUpdate.core.body.error = true;
logger.error(`PDFtoCairo failed extracting slide ${pageNumber} in job ${jobId}: ${error.message}`);
statusUpdate.setError();
}
statusUpdate.core.body.pageNumber = pageNumber;
statusUpdate.envelope.timestamp = (new Date()).getTime();
await client.publish(config.redis.channels.publish, JSON.stringify(statusUpdate));
statusUpdate.core.body.error = false;
await client.publish(config.redis.channels.publish, statusUpdate.build(pageNumber));
}
// If PNG file already available
} else if (fs.existsSync(`${presFile}.png`)) {
fs.copyFileSync(`${presFile}.png`, path.join(dropbox, 'slide1.png'));
await client.publish(config.redis.channels.publish, JSON.stringify(statusUpdate));
// If JPEG file available
} else if (fs.existsSync(`${presFile}.jpeg`)) {
fs.copyFileSync(`${presFile}.jpeg`, path.join(dropbox, 'slide1.jpeg'));
await client.publish(config.redis.channels.publish, JSON.stringify(statusUpdate));
} else {
statusUpdate.core.body.error = true;
await client.publish(config.redis.channels.publish, JSON.stringify(statusUpdate));
client.disconnect();
return logger.error(`Presentation file missing for job ${exportJob.jobId}`);
if (fs.existsSync(`${presFile}.png`)) {
// PNG file available
fs.copyFileSync(`${presFile}.png`, path.join(dropbox, 'slide1.png'));
} else if (fs.existsSync(`${presFile}.jpeg`)) {
// JPEG file available
fs.copyFileSync(`${presFile}.jpeg`, path.join(dropbox, 'slide1.jpeg'));
await client.publish(config.redis.channels.publish, statusUpdate.build());
} else {
await client.publish(config.redis.channels.publish, statusUpdate.build());
client.disconnect();
return logger.error(`No PDF, PNG or JPEG file available for job ${jobId}`);
}
await client.publish(config.redis.channels.publish, statusUpdate.build());
}
client.disconnect();
const process = new WorkerStarter({jobId, statusUpdate});
const process = new WorkerStarter({jobId});
process.process();
}

View File

@ -5,6 +5,7 @@ const FormData = require('form-data');
const redis = require('redis');
const axios = require('axios').default;
const path = require('path');
const {NewPresAnnFileAvailableMsg} = require('../lib/utils/message-builder');
const {workerData} = require('worker_threads');
const [jobType, jobId, filename] = [workerData.jobType, workerData.jobId, workerData.filename];
@ -31,30 +32,10 @@ async function notifyMeetingActor() {
exportJob.parentMeetingId, exportJob.parentMeetingId,
exportJob.presId, 'pdf', jobId, filename);
const notification = {
envelope: {
name: config.notifier.msgName,
routing: {
sender: exportJob.module,
},
timestamp: (new Date()).getTime(),
},
core: {
header: {
name: config.notifier.msgName,
meetingId: exportJob.parentMeetingId,
userId: '',
},
body: {
fileURI: link,
presId: exportJob.presId,
},
},
};
const notification = new NewPresAnnFileAvailableMsg(exportJob, link);
logger.info(`Annotated PDF available at ${link}`);
await client.publish(config.redis.channels.publish,
JSON.stringify(notification));
await client.publish(config.redis.channels.publish, notification.build());
client.disconnect();
}

View File

@ -10,14 +10,16 @@ const sanitize = require('sanitize-filename');
const {getStrokePoints, getStrokeOutlinePoints} = require('perfect-freehand');
const probe = require('probe-image-size');
const redis = require('redis');
const {PresAnnStatusMsg} = require('../lib/utils/message-builder');
const [jobId, statusUpdate] = [workerData.jobId, workerData.statusUpdate];
const jobId = workerData.jobId;
const logger = new Logger('presAnn Process Worker');
logger.info('Processing PDF for job ' + jobId);
statusUpdate.core.body.status = 'PROCESSING';
const dropbox = path.join(config.shared.presAnnDropboxDir, jobId);
const job = fs.readFileSync(path.join(dropbox, 'job'));
const exportJob = JSON.parse(job);
const statusUpdate = new PresAnnStatusMsg(exportJob, PresAnnStatusMsg.EXPORT_STATUSES.PROCESSING);
// General utilities for rendering SVGs resembling Tldraw as much as possible
function align_to_pango(alignment) {
@ -157,10 +159,8 @@ function render_textbox(textColor, font, fontSize, textAlign, text, id, textBoxW
try {
cp.spawnSync(config.shared.imagemagick, commands, {shell: false});
} catch (error) {
const error_reason = 'ImageMagick failed to render textbox';
logger.error(`${error_reason} in job ${jobId}: ${error.message}`);
statusUpdate.core.body.status = error_reason;
statusUpdate.core.body.error = true;
logger.error(`ImageMagick failed to render textbox in job ${jobId}: ${error.message}`);
statusUpdate.setError();
}
}
@ -596,7 +596,7 @@ function overlay_shape_label(svg, annotation) {
const fontSize = text_size_to_px(annotation.style.size, annotation.style.scale);
const textAlign = 'center';
const text = annotation.label;
const id = annotation.id;
const id = sanitize(annotation.id);
const rotation = rad_to_degree(annotation.rotation);
const [shape_width, shape_height] = annotation.size;
@ -641,7 +641,7 @@ function overlay_sticky(svg, annotation) {
const textColor = '#0d0d0d'; // For sticky notes
const text = annotation.text;
const id = annotation.id;
const id = sanitize(annotation.id);
render_textbox(textColor, font, fontSize, textAlign, text, id, textBoxWidth);
@ -701,7 +701,7 @@ function overlay_text(svg, annotation) {
const fontSize = text_size_to_px(annotation.style.size, annotation.style.scale);
const textAlign = align_to_pango(annotation.style.textAlign);
const text = annotation.text;
const id = annotation.id;
const id = sanitize(annotation.id);
const rotation = rad_to_degree(annotation.rotation);
const [textBox_x, textBox_y] = annotation.point;
@ -787,17 +787,13 @@ async function process_presentation_annotations() {
client.on('error', (err) => logger.info('Redis Client Error', err));
// 1. Get the job
const job = fs.readFileSync(path.join(dropbox, 'job'));
const exportJob = JSON.parse(job);
// 2. Get the annotations
// Get the annotations
const annotations = fs.readFileSync(path.join(dropbox, 'whiteboard'));
const whiteboard = JSON.parse(annotations);
const pages = JSON.parse(whiteboard.pages);
const ghostScriptInput = [];
// 3. Convert annotations to SVG
// Convert annotations to SVG
for (const currentSlide of pages) {
const bgImagePath = path.join(dropbox, `slide${currentSlide.page}`);
const svgBackgroundSlide = path.join(exportJob.presLocation,
@ -854,14 +850,7 @@ async function process_presentation_annotations() {
}
});
// Dimensions converted to a pixel size which,
// when converted to points, will yield the desired
// dimension in pixels when read without conversion
// e.g. say the background SVG dimensions are set to 1920x1080 pt
// Resize output to 2560x1440 px so that the SVG
// generates with the original size in pt.
// Scale slide back to its original size
const convertAnnotatedSlide = [
SVGfile,
'--output-width', to_px(slideWidth),
@ -873,15 +862,11 @@ async function process_presentation_annotations() {
cp.spawnSync(config.shared.cairosvg, convertAnnotatedSlide, {shell: false});
} catch (error) {
logger.error(`Processing slide ${currentSlide.page} failed for job ${jobId}: ${error.message}`);
statusUpdate.core.body.error = true;
statusUpdate.setError();
}
statusUpdate.core.body.pageNumber = currentSlide.page;
statusUpdate.envelope.timestamp = (new Date()).getTime();
await client.publish(config.redis.channels.publish, JSON.stringify(statusUpdate));
await client.publish(config.redis.channels.publish, statusUpdate.build(currentSlide.page));
ghostScriptInput.push(PDFfile);
statusUpdate.core.body.error = false;
}
// Create PDF output directory if it doesn't exist
@ -903,11 +888,7 @@ async function process_presentation_annotations() {
try {
cp.spawnSync(config.shared.ghostscript, mergePDFs, {shell: false});
} catch (error) {
const error_reason = 'GhostScript failed to merge PDFs';
logger.error(`${error_reason} in job ${jobId}: ${error.message}`);
statusUpdate.core.body.status = error_reason;
statusUpdate.core.body.error = true;
await client.publish(config.redis.channels.publish, JSON.stringify(statusUpdate));
return logger.error(`GhostScript failed to merge PDFs in job ${jobId}: ${error.message}`);
}
// Launch Notifier Worker depending on job type

View File

@ -2,7 +2,7 @@ import org.bigbluebutton.build._
description := "BigBlueButton custom FS-ESL client built on top of FS-ESL Java library."
version := "0.0.8-SNAPSHOT"
version := "0.0.9-SNAPSHOT"
val compileSettings = Seq(
organization := "org.bigbluebutton",
@ -13,7 +13,7 @@ val compileSettings = Seq(
"-Xlint",
"-Ywarn-dead-code",
"-language:_",
"-target:jvm-1.11",
"-target:11",
"-encoding", "UTF-8"
),
javacOptions ++= List(
@ -52,7 +52,7 @@ crossPaths := false
// This forbids including Scala related libraries into the dependency
autoScalaLibrary := false
scalaVersion := "2.13.4"
scalaVersion := "2.13.9"
publishTo := Some(Resolver.file("file", new File(Path.userHome.absolutePath + "/.m2/repository")))

View File

@ -7,7 +7,7 @@ object Dependencies {
object Versions {
// Scala
val scala = "2.13.4"
val scala = "2.13.9"
// Libraries
val netty = "3.2.10.Final"

View File

@ -5,15 +5,17 @@ Learning Analytics Dashboard will be accessible through https://yourdomain/learn
## Prepare destination directory
```
mkdir /var/bigbluebutton/learning-dashboard
mkdir -p /var/bigbluebutton/learning-dashboard
chown bigbluebutton /var/bigbluebutton/learning-dashboard/
```
## Build instructions
```
cd bbb-learning-dashboard
rm -r node_modules
# verify we are in the bbb-learning-dashboard directory ~/src/bbb-learning-dashboard
pwd
if [ -d node_modules ]; then rm -r node_modules; fi
npm install
npm run build
cp -r build/* /var/bigbluebutton/learning-dashboard
@ -22,5 +24,5 @@ cp -r build/* /var/bigbluebutton/learning-dashboard
## Update nginx config
```
cp bbb-learning-dashboard/learning-dashboard.nginx /usr/share/bigbluebutton/nginx/
cp learning-dashboard.nginx /usr/share/bigbluebutton/nginx/
```

View File

@ -1 +1 @@
git clone --branch v5.0.0-beta.1 --depth 1 https://github.com/bigbluebutton/bbb-playback bbb-playback
git clone --branch v5.0.0-beta.2 --depth 1 https://github.com/bigbluebutton/bbb-playback bbb-playback

View File

@ -3,7 +3,7 @@
<condition field="${bbb_authorized}" expression="true" break="on-false" />
<condition field="${sip_via_protocol}" expression="^wss?$" />
<condition field="destination_number" expression="^(\d{5,11})$">
<action application="set" data="jitterbuffer_msec=60:120" />
<action application="set" data="jitterbuffer_msec=100:250" />
<action application="set" data="rtp_jitter_buffer_plc=true" />
<action application="set" data="rtp_jitter_buffer_during_bridge=true" />
<action application="set" data="suppress_cng=true" />
@ -14,7 +14,7 @@
<extension name="bbb_conferences">
<condition field="${bbb_authorized}" expression="true" break="on-false" />
<condition field="destination_number" expression="^(\d{5,11})$">
<action application="set" data="jitterbuffer_msec=60:120" />
<action application="set" data="jitterbuffer_msec=100:250" />
<action application="set" data="rtp_jitter_buffer_plc=true" />
<action application="set" data="rtp_jitter_buffer_during_bridge=true" />
<action application="set" data="suppress_cng=true" />

View File

@ -2,7 +2,7 @@
<extension name="ECHO_TO_CONFERENCE">
<condition field="${bbb_from_echo}" expression="true" break="on-false"/>
<condition field="destination_number" expression="^(ECHO_TO_CONFERENCE)$">
<action application="set" data="jitterbuffer_msec=60:120" />
<action application="set" data="jitterbuffer_msec=100:250" />
<action application="set" data="rtp_jitter_buffer_plc=true" />
<action application="set" data="rtp_jitter_buffer_during_bridge=true" />
<action application="set" data="suppress_cng=true" />

View File

@ -1 +1 @@
BIGBLUEBUTTON_RELEASE=2.6.0-beta.3
BIGBLUEBUTTON_RELEASE=2.6.0-beta.5

View File

@ -109,6 +109,15 @@ enableUFWRules() {
ufw allow OpenSSH
ufw allow "Nginx Full"
ufw allow 16384:32768/udp
# Check if coturn is running on this server and, if so, open firewall port
if systemctl status coturn > /dev/null; then
echo " - Local turnserver detected -- opening port 3478"
ufw allow 3478
# echo " - Forcing FireFox to use turn server"
# yq w -i $HTML5_CONFIG public.kurento.forceRelayOnFirefox true
fi
ufw --force enable
}

View File

@ -1686,8 +1686,7 @@ if [ -n "$HOST" ]; then
echo "Restarting BigBlueButton $BIGBLUEBUTTON_RELEASE ..."
stop_bigbluebutton
start_bigbluebutton
systemctl restart bigbluebutton.target
exit 0
fi
@ -1699,8 +1698,7 @@ if [ $RESTART ]; then
echo "Restarting BigBlueButton $BIGBLUEBUTTON_RELEASE ..."
stop_bigbluebutton
start_bigbluebutton
systemctl restart bigbluebutton.target
check_state
fi

View File

@ -127,7 +127,9 @@ with BigBlueButton; if not, see <http://www.gnu.org/licenses/>.
</head>
<body style="background-color: #06172A">
<div id="aria-polite-alert" aria-live="polite" aria-atomic="false" class="sr-only"></div>
<div id="app" role="document">
<main>
<div id="app" role="document">
</main>
</div>
<span id="destination"></span>
<audio id="remote-media" autoplay>

View File

@ -1296,6 +1296,8 @@ export default class SIPBridge extends BaseAudioBridge {
}
exitAudio() {
if (this.activeSession == null) return Promise.resolve();
return this.activeSession.exitAudio();
}

View File

@ -2,6 +2,7 @@ import Breakouts from '/imports/api/breakouts';
import updateUserBreakoutRoom from '/imports/api/users-persistent-data/server/modifiers/updateUserBreakoutRoom';
import Logger from '/imports/startup/server/logger';
import { check } from 'meteor/check';
import { lowercaseTrim } from '/imports/utils/string-utils';
export default function joinedUsersChanged({ body }) {
check(body, Object);
@ -21,7 +22,7 @@ export default function joinedUsersChanged({ body }) {
breakoutId,
};
const usersMapped = users.map(user => ({ userId: user.id, name: user.name }));
const usersMapped = users.map(user => ({ userId: user.id, name: user.name, sortName: lowercaseTrim(user.name) }));
const modifier = {
$set: {
joinedUsers: usersMapped,

View File

@ -86,8 +86,8 @@ export default function addMeeting(meeting) {
name: String,
disabledFeatures: Array,
notifyRecordingIsOn: Boolean,
uploadExternalDescription: String,
uploadExternalUrl: String,
presentationUploadExternalDescription: String,
presentationUploadExternalUrl: String,
},
usersProp: {
maxUsers: Number,

View File

@ -6,6 +6,7 @@ import VoiceUsers from '/imports/api/voice-users/';
import addUserPsersistentData from '/imports/api/users-persistent-data/server/modifiers/addUserPersistentData';
import stringHash from 'string-hash';
import flat from 'flat';
import { lowercaseTrim } from '/imports/utils/string-utils';
import addVoiceUser from '/imports/api/voice-users/server/modifiers/addVoiceUser';
@ -51,7 +52,7 @@ export default function addUser(meetingId, userData) {
const userInfos = {
meetingId,
sortName: user.name.trim().toLowerCase(),
sortName: lowercaseTrim(user.name),
color,
speechLocale: '',
mobile: false,

View File

@ -7,6 +7,7 @@ import {
} from '/imports/api/video-streams/server/helpers';
import VoiceUsers from '/imports/api/voice-users/';
import Users from '/imports/api/users/';
import { lowercaseTrim } from '/imports/utils/string-utils';
const BASE_FLOOR_TIME = "0";
@ -40,6 +41,7 @@ export default function sharedWebcam(meetingId, userId, stream) {
$set: {
stream,
name,
sortName: lowercaseTrim(name),
lastFloorTime,
floor,
pin,

View File

@ -261,6 +261,7 @@ class ActionsDropdown extends PureComponent {
customStyles: p.current ? customStyles : null,
icon: "file",
iconRight: p.current ? 'check' : null,
selected: p.current ? true : false,
label: p.name,
description: "uploaded presentation file",
key: `uploaded-presentation-${p.id}`,

View File

@ -723,8 +723,7 @@ class BreakoutRoom extends PureComponent {
}
populateWithLastBreakouts(lastBreakouts) {
const { getBreakoutUserWasIn, intl } = this.props;
const { users } = this.state;
const { getBreakoutUserWasIn, users, intl } = this.props;
const changedNames = [];
lastBreakouts.forEach((breakout) => {

View File

@ -74,11 +74,7 @@ class LiveCaptions extends PureComponent {
<div style={captionStyles}>
{clear ? '' : data}
</div>
<div
style={visuallyHidden}
aria-atomic
aria-live="polite"
>
<div style={visuallyHidden}>
{clear ? '' : data}
</div>
</div>

View File

@ -34,7 +34,7 @@ class TypingIndicator extends PureComponent {
const { length } = typingUsers;
const isSingleTyper = length === 1;
const isCoupleTyper = length === 2;
const isMuiltiTypers = length > 2;
const isMultiTypers = length > 2;
let element = null;
@ -76,7 +76,7 @@ class TypingIndicator extends PureComponent {
);
}
if (isMuiltiTypers) {
if (isMultiTypers) {
element = (
<span>
{`${intl.formatMessage(messages.severalPeople)}`}

View File

@ -46,7 +46,7 @@ class LocalesDropdown extends PureComponent {
render() {
const {
value, handleChange, elementId, selectMessage,
value, handleChange, elementId, selectMessage, ariaLabel,
} = this.props;
const defaultLocale = value || DEFAULT_VALUE;
@ -57,6 +57,7 @@ class LocalesDropdown extends PureComponent {
id={elementId}
onChange={handleChange}
value={defaultLocale}
aria-label={ariaLabel||''}
>
<option disabled key={DEFAULT_KEY} value={DEFAULT_VALUE}>
{selectMessage}

View File

@ -16,6 +16,10 @@ const intlMessages = defineMessages({
id: 'app.dropdown.close',
description: 'Close button label',
},
active: {
id: 'app.dropdown.list.item.activeLabel',
description: 'active item label',
},
});
class BBBMenu extends React.Component {
@ -61,11 +65,10 @@ class BBBMenu extends React.Component {
};
makeMenuItems() {
const { actions, selectedEmoji } = this.props;
const { actions, selectedEmoji, intl } = this.props;
return actions?.map(a => {
const { dataTest, label, onClick, key, disabled, description } = a;
const { dataTest, label, onClick, key, disabled, description, selected } = a;
const emojiSelected = key?.toLowerCase()?.includes(selectedEmoji?.toLowerCase());
let customStyles = {
@ -101,7 +104,7 @@ class BBBMenu extends React.Component {
<Styled.MenuItemWrapper>
{a.icon ? <Icon iconName={a.icon} key="icon" /> : null}
<Styled.Option aria-describedby={`${key}-option-desc`}>{label}</Styled.Option>
{description && <div className="sr-only" id={`${key}-option-desc`}>{description}</div>}
{description && <div className="sr-only" id={`${key}-option-desc`}>{`${description}${selected ? ` - ${intl.formatMessage(intlMessages.active)}` : ''}`}</div>}
{a.iconRight ? <Styled.IconRight iconName={a.iconRight} key="iconRight" /> : null}
</Styled.MenuItemWrapper>
</Styled.BBBMenuItem>,

View File

@ -19,6 +19,7 @@ import Checkbox from '/imports/ui/components/common/checkbox/component';
const { isMobile } = deviceInfo;
const propTypes = {
allowDownloadable: PropTypes.bool.isRequired,
intl: PropTypes.object.isRequired,
fileUploadConstraintsHint: PropTypes.bool.isRequired,
fileSizeMax: PropTypes.number.isRequired,
@ -954,6 +955,18 @@ class PresentationUploader extends Component {
}
}
renderDownloadableWithAnnotationsHint() {
const {
intl,
allowDownloadable
} = this.props;
return allowDownloadable ? (
<Styled.ExportHint>
{intl.formatMessage(intlMessages.exportHint)}
</Styled.ExportHint>)
: null;
}
renderPresentationItem(item) {
const { disableActions } = this.state;
const {
@ -1108,9 +1121,9 @@ class PresentationUploader extends Component {
renderExternalUpload() {
const { externalUploadData, intl } = this.props;
const { uploadExternalDescription, uploadExternalUrl } = externalUploadData;
const { presentationUploadExternalDescription, presentationUploadExternalUrl } = externalUploadData;
if (!uploadExternalDescription || !uploadExternalUrl) return null;
if (!presentationUploadExternalDescription || !presentationUploadExternalUrl) return null;
return (
<Styled.ExternalUpload>
@ -1119,11 +1132,11 @@ class PresentationUploader extends Component {
{intl.formatMessage(intlMessages.externalUploadTitle)}
</Styled.ExternalUploadTitle>
<p>{uploadExternalDescription}</p>
<p>{presentationUploadExternalDescription}</p>
</div>
<Styled.ExternalUploadButton
color="default"
onClick={() => window.open(`${uploadExternalUrl}`)}
onClick={() => window.open(`${presentationUploadExternalUrl}`)}
label={intl.formatMessage(intlMessages.externalUploadLabel)}
aria-describedby={intl.formatMessage(intlMessages.externalUploadLabel)}
/>
@ -1218,10 +1231,8 @@ class PresentationUploader extends Component {
{`${intl.formatMessage(intlMessages.message)}`}
{fileUploadConstraintsHint ? this.renderExtraHint() : null}
</Styled.ModalHint>
{this.renderPresentationList()}
<Styled.ExportHint>
{intl.formatMessage(intlMessages.exportHint)}
</Styled.ExportHint>
{this.renderPresentationList()}
{this.renderDownloadableWithAnnotationsHint()}
{isMobile ? this.renderPicDropzone() : null}
{this.renderDropzone()}
{this.renderExternalUpload()}

View File

@ -342,17 +342,17 @@ const getExternalUploadData = () => {
{ meetingId: Auth.meetingID },
{
fields: {
'meetingProp.uploadExternalDescription': 1,
'meetingProp.uploadExternalUrl': 1
'meetingProp.presentationUploadExternalDescription': 1,
'meetingProp.presentationUploadExternalUrl': 1
},
},
);
const { uploadExternalDescription, uploadExternalUrl } = meetingProp;
const { presentationUploadExternalDescription, presentationUploadExternalUrl } = meetingProp;
return {
uploadExternalDescription,
uploadExternalUrl,
presentationUploadExternalDescription,
presentationUploadExternalUrl,
}
};

View File

@ -150,11 +150,14 @@ class Settings extends Component {
});
}
displaySettingsStatus(status) {
displaySettingsStatus(status, textOnly = false) {
const { intl } = this.props;
if (textOnly) {
return status ? intl.formatMessage(intlMessages.on)
: intl.formatMessage(intlMessages.off)
}
return (
<Styled.ToggleLabel>
<Styled.ToggleLabel aria-hidden>
{status ? intl.formatMessage(intlMessages.on)
: intl.formatMessage(intlMessages.off)}
</Styled.ToggleLabel>

View File

@ -283,7 +283,7 @@ class ApplicationMenu extends BaseMenu {
icons={false}
defaultChecked={this.state.audioFilterEnabled}
onChange={() => this.handleAudioFilterChange()}
ariaLabel={intl.formatMessage(intlMessages.audioFilterLabel)}
ariaLabel={`${intl.formatMessage(intlMessages.audioFilterLabel)} - ${displaySettingsStatus(audioFilterStatus, true)}`}
showToggleLabel={showToggleLabel}
/>
</Styled.FormElementRight>
@ -319,7 +319,7 @@ class ApplicationMenu extends BaseMenu {
icons={false}
defaultChecked={settings.paginationEnabled}
onChange={() => this.handleToggle('paginationEnabled')}
ariaLabel={intl.formatMessage(intlMessages.paginationEnabledLabel)}
ariaLabel={`${intl.formatMessage(intlMessages.paginationEnabledLabel)} - ${displaySettingsStatus(settings.paginationEnabled, true)}`}
showToggleLabel={showToggleLabel}
/>
</Styled.FormElementRight>
@ -353,6 +353,7 @@ class ApplicationMenu extends BaseMenu {
defaultChecked={settings.darkTheme}
onChange={() => this.handleToggle('darkTheme')}
showToggleLabel={showToggleLabel}
ariaLabel={`${intl.formatMessage(intlMessages.darkThemeLabel)} - ${displaySettingsStatus(settings.darkTheme, true)}`}
data-test="darkModeToggleBtn"
/>
</Styled.FormElementRight>
@ -408,7 +409,7 @@ class ApplicationMenu extends BaseMenu {
icons={false}
defaultChecked={settings.animations}
onChange={() => this.handleToggle('animations')}
ariaLabel={intl.formatMessage(intlMessages.animationsLabel)}
ariaLabel={`${intl.formatMessage(intlMessages.animationsLabel)} - ${displaySettingsStatus(settings.animations, true)}`}
showToggleLabel={showToggleLabel}
/>
</Styled.FormElementRight>
@ -422,10 +423,7 @@ class ApplicationMenu extends BaseMenu {
<Styled.Row>
<Styled.Col>
<Styled.FormElement>
<Styled.Label
htmlFor="langSelector"
aria-label={intl.formatMessage(intlMessages.languageLabel)}
>
<Styled.Label aria-hidden>
{intl.formatMessage(intlMessages.languageLabel)}
</Styled.Label>
</Styled.FormElement>
@ -439,6 +437,7 @@ class ApplicationMenu extends BaseMenu {
handleChange={(e) => this.handleSelectChange('locale', e)}
value={settings.locale}
elementId="langSelector"
ariaLabel={intl.formatMessage(intlMessages.languageLabel)}
selectMessage={intl.formatMessage(intlMessages.languageOptionLabel)}
/>
</Styled.LocalesDropdownSelect>

View File

@ -54,7 +54,7 @@ class DataSaving extends BaseMenu {
{isVideoEnabled
? (
<Styled.Row>
<Styled.Col aria-hidden="true">
<Styled.Col aria-hidden>
<Styled.FormElement>
<Styled.Label>
{intl.formatMessage(intlMessages.webcamLabel)}
@ -69,7 +69,7 @@ class DataSaving extends BaseMenu {
defaultChecked={viewParticipantsWebcams}
onChange={() => this.handleToggle('viewParticipantsWebcams')}
ariaLabelledBy="webcamToggle"
ariaLabel={intl.formatMessage(intlMessages.webcamLabel)}
ariaLabel={`${intl.formatMessage(intlMessages.webcamLabel)} - ${displaySettingsStatus(viewParticipantsWebcams, true)}`}
showToggleLabel={showToggleLabel}
/>
</Styled.FormElementRight>
@ -80,7 +80,7 @@ class DataSaving extends BaseMenu {
{isScreenSharingEnabled
? (
<Styled.Row>
<Styled.Col aria-hidden="true">
<Styled.Col aria-hidden>
<Styled.FormElement>
<Styled.Label>
{intl.formatMessage(intlMessages.screenShareLabel)}
@ -95,7 +95,7 @@ class DataSaving extends BaseMenu {
defaultChecked={viewScreenshare}
onChange={() => this.handleToggle('viewScreenshare')}
ariaLabelledBy="screenShare"
ariaLabel={intl.formatMessage(intlMessages.screenShareLabel)}
ariaLabel={`${intl.formatMessage(intlMessages.screenShareLabel)} - ${displaySettingsStatus(viewScreenshare, true)}`}
showToggleLabel={showToggleLabel}
/>
</Styled.FormElementRight>

View File

@ -77,7 +77,7 @@ class NotificationMenu extends BaseMenu {
</div>
<Styled.Form>
<Styled.Row>
<Styled.Row aria-hidden>
<Styled.Col />
<Styled.ColHeading>
{intl.formatMessage(intlMessages.audioAlertLabel)}
@ -90,7 +90,7 @@ class NotificationMenu extends BaseMenu {
{isChatEnabled() ? (
<Styled.Row>
<Styled.Col>
<Styled.Label>
<Styled.Label aria-hidden>
{intl.formatMessage(intlMessages.messagesLabel)}
</Styled.Label>
</Styled.Col>
@ -101,7 +101,7 @@ class NotificationMenu extends BaseMenu {
icons={false}
defaultChecked={settings.chatAudioAlerts}
onChange={() => this.handleToggle('chatAudioAlerts')}
ariaLabel={`${intl.formatMessage(intlMessages.messagesLabel)} ${intl.formatMessage(intlMessages.audioAlertLabel)}`}
ariaLabel={`${intl.formatMessage(intlMessages.messagesLabel)} ${intl.formatMessage(intlMessages.audioAlertLabel)} - ${displaySettingsStatus(settings.chatAudioAlerts, true)}`}
showToggleLabel={showToggleLabel}
/>
</Styled.FormElementCenter>
@ -113,7 +113,7 @@ class NotificationMenu extends BaseMenu {
icons={false}
defaultChecked={settings.chatPushAlerts}
onChange={() => this.handleToggle('chatPushAlerts')}
ariaLabel={`${intl.formatMessage(intlMessages.messagesLabel)} ${intl.formatMessage(intlMessages.pushAlertLabel)}`}
ariaLabel={`${intl.formatMessage(intlMessages.messagesLabel)} ${intl.formatMessage(intlMessages.pushAlertLabel)} - ${displaySettingsStatus(settings.chatPushAlerts, true)}`}
showToggleLabel={showToggleLabel}
data-test="chatPopupAlertsBtn"
/>
@ -124,7 +124,7 @@ class NotificationMenu extends BaseMenu {
<Styled.Row>
<Styled.Col>
<Styled.Label>
<Styled.Label aria-hidden>
{intl.formatMessage(intlMessages.userJoinLabel)}
</Styled.Label>
</Styled.Col>
@ -135,7 +135,7 @@ class NotificationMenu extends BaseMenu {
icons={false}
defaultChecked={settings.userJoinAudioAlerts}
onChange={() => this.handleToggle('userJoinAudioAlerts')}
ariaLabel={`${intl.formatMessage(intlMessages.userJoinLabel)} ${intl.formatMessage(intlMessages.audioAlertLabel)}`}
ariaLabel={`${intl.formatMessage(intlMessages.userJoinLabel)} ${intl.formatMessage(intlMessages.audioAlertLabel)} - ${displaySettingsStatus(settings.userJoinAudioAlerts, true)}`}
showToggleLabel={showToggleLabel}
/>
</Styled.FormElementCenter>
@ -147,7 +147,7 @@ class NotificationMenu extends BaseMenu {
icons={false}
defaultChecked={settings.userJoinPushAlerts}
onChange={() => this.handleToggle('userJoinPushAlerts')}
ariaLabel={`${intl.formatMessage(intlMessages.userJoinLabel)} ${intl.formatMessage(intlMessages.pushAlertLabel)}`}
ariaLabel={`${intl.formatMessage(intlMessages.userJoinLabel)} ${intl.formatMessage(intlMessages.pushAlertLabel)} - ${displaySettingsStatus(settings.userJoinPushAlerts, true)}`}
showToggleLabel={showToggleLabel}
data-test="userJoinPopupAlerts"
/>
@ -157,7 +157,7 @@ class NotificationMenu extends BaseMenu {
<Styled.Row>
<Styled.Col>
<Styled.Label>
<Styled.Label aria-hidden>
{intl.formatMessage(intlMessages.userLeaveLabel)}
</Styled.Label>
</Styled.Col>
@ -168,7 +168,7 @@ class NotificationMenu extends BaseMenu {
icons={false}
defaultChecked={settings.userLeaveAudioAlerts}
onChange={() => this.handleToggle('userLeaveAudioAlerts')}
ariaLabel={`${intl.formatMessage(intlMessages.userLeaveLabel)} ${intl.formatMessage(intlMessages.audioAlertLabel)}`}
ariaLabel={`${intl.formatMessage(intlMessages.userLeaveLabel)} ${intl.formatMessage(intlMessages.audioAlertLabel)} - ${displaySettingsStatus(settings.userLeaveAudioAlerts, true)}`}
showToggleLabel={showToggleLabel}
/>
</Styled.FormElementCenter>
@ -180,7 +180,7 @@ class NotificationMenu extends BaseMenu {
icons={false}
defaultChecked={settings.userLeavePushAlerts}
onChange={() => this.handleToggle('userLeavePushAlerts')}
ariaLabel={`${intl.formatMessage(intlMessages.userLeaveLabel)} ${intl.formatMessage(intlMessages.pushAlertLabel)}`}
ariaLabel={`${intl.formatMessage(intlMessages.userLeaveLabel)} ${intl.formatMessage(intlMessages.pushAlertLabel)} - ${displaySettingsStatus(settings.userLeavePushAlerts, true)}`}
showToggleLabel={showToggleLabel}
/>
</Styled.FormElementCenter>
@ -190,7 +190,7 @@ class NotificationMenu extends BaseMenu {
{isModerator && showGuestNotification ? (
<Styled.Row>
<Styled.Col>
<Styled.Label>
<Styled.Label aria-hidden>
{intl.formatMessage(intlMessages.guestWaitingLabel)}
</Styled.Label>
</Styled.Col>
@ -201,7 +201,7 @@ class NotificationMenu extends BaseMenu {
icons={false}
defaultChecked={settings.guestWaitingAudioAlerts}
onChange={() => this.handleToggle('guestWaitingAudioAlerts')}
ariaLabel={`${intl.formatMessage(intlMessages.guestWaitingLabel)} ${intl.formatMessage(intlMessages.audioAlertLabel)}`}
ariaLabel={`${intl.formatMessage(intlMessages.guestWaitingLabel)} ${intl.formatMessage(intlMessages.audioAlertLabel)} - ${displaySettingsStatus(settings.guestWaitingAudioAlerts, true)}`}
showToggleLabel={showToggleLabel}
/>
</Styled.FormElementCenter>
@ -213,7 +213,7 @@ class NotificationMenu extends BaseMenu {
icons={false}
defaultChecked={settings.guestWaitingPushAlerts}
onChange={() => this.handleToggle('guestWaitingPushAlerts')}
ariaLabel={`${intl.formatMessage(intlMessages.guestWaitingLabel)} ${intl.formatMessage(intlMessages.pushAlertLabel)}`}
ariaLabel={`${intl.formatMessage(intlMessages.guestWaitingLabel)} ${intl.formatMessage(intlMessages.pushAlertLabel)} - ${displaySettingsStatus(settings.guestWaitingPushAlerts, true)}`}
showToggleLabel={showToggleLabel}
/>
</Styled.FormElementCenter>
@ -224,7 +224,7 @@ class NotificationMenu extends BaseMenu {
{isModerator ? (
<Styled.Row>
<Styled.Col>
<Styled.Label>
<Styled.Label aria-hidden>
{intl.formatMessage(intlMessages.raiseHandLabel)}
</Styled.Label>
</Styled.Col>
@ -235,7 +235,7 @@ class NotificationMenu extends BaseMenu {
icons={false}
defaultChecked={settings.raiseHandAudioAlerts}
onChange={() => this.handleToggle('raiseHandAudioAlerts')}
ariaLabel={`${intl.formatMessage(intlMessages.raiseHandLabel)} ${intl.formatMessage(intlMessages.audioAlertLabel)}`}
ariaLabel={`${intl.formatMessage(intlMessages.raiseHandLabel)} ${intl.formatMessage(intlMessages.audioAlertLabel)} - ${displaySettingsStatus(settings.raiseHandAudioAlerts, true)}`}
showToggleLabel={showToggleLabel}
/>
</Styled.FormElementCenter>
@ -247,7 +247,7 @@ class NotificationMenu extends BaseMenu {
icons={false}
defaultChecked={settings.raiseHandPushAlerts}
onChange={() => this.handleToggle('raiseHandPushAlerts')}
ariaLabel={`${intl.formatMessage(intlMessages.raiseHandLabel)} ${intl.formatMessage(intlMessages.pushAlertLabel)}`}
ariaLabel={`${intl.formatMessage(intlMessages.raiseHandLabel)} ${intl.formatMessage(intlMessages.pushAlertLabel)} - ${displaySettingsStatus(settings.raiseHandPushAlerts, true)}`}
showToggleLabel={showToggleLabel}
/>
</Styled.FormElementCenter>

View File

@ -316,19 +316,19 @@ const ShortcutHelpComponent = (props) => {
//views
whiteboardShortcutItems.push(renderItem(intl.formatMessage(intlMessages.zoomIn), 'Ctrl +'));
whiteboardShortcutItems.push(renderItem(intl.formatMessage(intlMessages.zoomOut), 'Ctrl -'));
whiteboardShortcutItems.push(renderItem(intl.formatMessage(intlMessages.zoomFit), '↑ + 1'));
whiteboardShortcutItems.push(renderItem(intl.formatMessage(intlMessages.zoomSelect), '↑ + 2'));
whiteboardShortcutItems.push(renderItem(intl.formatMessage(intlMessages.zoomFit), 'Shift 1'));
whiteboardShortcutItems.push(renderItem(intl.formatMessage(intlMessages.zoomSelect), 'Shift 2'));
//transform
whiteboardShortcutItems.push(renderItem(intl.formatMessage(intlMessages.flipH), '↑ + H'));
whiteboardShortcutItems.push(renderItem(intl.formatMessage(intlMessages.flipV), '↑ + V'));
whiteboardShortcutItems.push(renderItem(intl.formatMessage(intlMessages.lock), 'Ctrl L'));
whiteboardShortcutItems.push(renderItem(intl.formatMessage(intlMessages.moveToFront), ' ]'));
whiteboardShortcutItems.push(renderItem(intl.formatMessage(intlMessages.flipH), 'Shift H'));
whiteboardShortcutItems.push(renderItem(intl.formatMessage(intlMessages.flipV), 'Shift V'));
whiteboardShortcutItems.push(renderItem(intl.formatMessage(intlMessages.lock), 'Ctrl Shift L'));
whiteboardShortcutItems.push(renderItem(intl.formatMessage(intlMessages.moveToFront), 'Shift ]'));
whiteboardShortcutItems.push(renderItem(intl.formatMessage(intlMessages.moveForward), ']'));
whiteboardShortcutItems.push(renderItem(intl.formatMessage(intlMessages.moveBackward), '['));
whiteboardShortcutItems.push(renderItem(intl.formatMessage(intlMessages.moveToBack), ' ['));
whiteboardShortcutItems.push(renderItem(intl.formatMessage(intlMessages.moveToBack), 'Shift ['));
//edit
whiteboardShortcutItems.push(renderItem(intl.formatMessage(intlMessages.undo), 'Ctrl Z'));
whiteboardShortcutItems.push(renderItem(intl.formatMessage(intlMessages.redo), 'Ctrl Z'));
whiteboardShortcutItems.push(renderItem(intl.formatMessage(intlMessages.redo), 'Ctrl Shift Z'));
whiteboardShortcutItems.push(renderItem(intl.formatMessage(intlMessages.cut), 'Ctrl X'));
whiteboardShortcutItems.push(renderItem(intl.formatMessage(intlMessages.copy), 'Ctrl C'));
whiteboardShortcutItems.push(renderItem(intl.formatMessage(intlMessages.paste), 'Ctrl V'));

View File

@ -60,8 +60,8 @@ const sortUsersByUserId = (a, b) => {
};
const sortUsersByName = (a, b) => {
const aName = a.name ? a.name.toLowerCase() : '';
const bName = b.name ? b.name.toLowerCase() : '';
const aName = a.sortName || '';
const bName = b.sortName || '';
// Extending for sorting strings with non-ASCII characters
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#sorting_non-ascii_characters

View File

@ -235,6 +235,7 @@ class UserOptions extends PureComponent {
description: intl.formatMessage(intlMessages[isMeetingMuted ? 'unmuteAllDesc' : 'muteAllDesc']),
onClick: toggleMuteAllUsers,
icon: isMeetingMuted ? 'unmute' : 'mute',
dataTest: 'muteAll',
});
if (!isMeetingMuted) {
@ -244,6 +245,7 @@ class UserOptions extends PureComponent {
description: intl.formatMessage(intlMessages.muteAllExceptPresenterDesc),
onClick: toggleMuteAllUsersExceptPresenter,
icon: 'mute',
dataTest: 'muteAllExceptPresenter',
});
}

View File

@ -533,6 +533,7 @@ class VideoProvider extends Component {
}
const peer = new WebRtcPeer('sendonly', peerOptions);
peer.bbbVideoStream = bbbVideoStream;
this.webRtcPeers[stream] = peer;
peer.stream = stream;
peer.started = false;
@ -546,7 +547,7 @@ class VideoProvider extends Component {
peer.generateOffer().then((offer) => {
// Store the media stream if necessary. The scenario here is one where
// there is no preloaded stream stored.
if (bbbVideoStream == null) {
if (peer.bbbVideoStream == null) {
bbbVideoStream = new BBBVideoStream(peer.getLocalStream());
VideoPreviewService.storeStream(
MediaStreamUtils.extractDeviceIdFromStream(
@ -614,7 +615,6 @@ class VideoProvider extends Component {
},
onicecandidate: this._getOnIceCandidateCallback(stream, isLocal),
configuration: {
iceTransportPolicy: shouldForceRelay() ? 'relay' : undefined,
},
trace: TRACE_LOGS,
networkPriorities: NETWORK_PRIORITY ? { video: NETWORK_PRIORITY } : undefined,
@ -635,6 +635,9 @@ class VideoProvider extends Component {
// Use fallback STUN server
iceServers = getMappedFallbackStun();
} finally {
// we need to set iceTransportPolicy after `fetchWebRTCMappedStunTurnServers`
// because `shouldForceRelay` uses the information from the stun API
peerOptions.configuration.iceTransportPolicy = shouldForceRelay() ? 'relay' : undefined;
if (iceServers.length > 0) {
peerOptions.configuration.iceServers = iceServers;
}
@ -928,6 +931,11 @@ class VideoProvider extends Component {
peer.attached = true;
if (isLocal) {
if (peer.bbbVideoStream == null) {
this.handleVirtualBgError(new TypeError('Undefined media stream'));
return;
}
const deviceId = MediaStreamUtils.extractDeviceIdFromStream(
peer.bbbVideoStream.mediaStream,
'video',
@ -994,7 +1002,7 @@ class VideoProvider extends Component {
},
}, `Failed to restore virtual background after reentering the room: ${error.message}`);
notify(intl.formatMessage(intlMessages.virtualBgGenericError), 'error', 'video');
notify(intl.formatMessage(intlClientErrors.virtualBgGenericError), 'error', 'video');
}
createVideoTag(stream, video) {

View File

@ -86,7 +86,7 @@ export const sortLocalPresenterAlphabetical = (s1, s2) => mandatorySorting(s1, s
// 2 - add an entry to SORTING_METHODS, the key being the name to be used
// in settings.yml and the value object like the aforementioned
const MANDATORY_DATA_TYPES = {
userId: 1, stream: 1, name: 1, deviceId: 1, floor: 1, pin: 1,
userId: 1, stream: 1, name: 1, sortName: 1, deviceId: 1, floor: 1, pin: 1,
};
const SORTING_METHODS = Object.freeze({
// Default
@ -132,6 +132,7 @@ export const sortVideoStreams = (streams, mode) => {
stream: videoStream.stream,
userId: videoStream.userId,
name: videoStream.name,
sortName: videoStream.sortName,
floor: videoStream.floor,
pin: videoStream.pin,
}));

View File

@ -452,6 +452,14 @@ export default function Whiteboard(props) {
tldrawAPI?.setSetting('language', language);
}, [language]);
// Reset zoom to default when current presentation changes.
React.useEffect(() => {
if (isPresenter && slidePosition && tldrawAPI) {
const zoom = calculateZoom(slidePosition.width, slidePosition.height);
tldrawAPI.zoomTo(zoom);
}
}, [curPres?.id]);
const onMount = (app) => {
const menu = document.getElementById("TD-Styles")?.parentElement;
if (menu) {
@ -696,30 +704,44 @@ export default function Whiteboard(props) {
}
};
const onPaste = (e) => {
// disable file pasting
const clipboardData = e.clipboardData || window.clipboardData;
const { types } = clipboardData;
const hasFiles = types && types.indexOf && types.indexOf('Files') !== -1;
if (hasFiles) {
e.preventDefault();
e.stopPropagation();
}
};
const webcams = document.getElementById('cameraDock');
const dockPos = webcams?.getAttribute("data-position");
const editableWB = (
<Tldraw
key={`wb-${isRTL}-${dockPos}-${forcePanning}`}
document={doc}
// disable the ability to drag and drop files onto the whiteboard
// until we handle saving of assets in akka.
disableAssets={true}
// Disable automatic focus. Users were losing focus on shared notes
// and chat on presentation mount.
autofocus={false}
onMount={onMount}
showPages={false}
showZoom={false}
showUI={curPres ? (isPresenter || hasWBAccess) : true}
showMenu={curPres ? false : true}
showMultiplayerMenu={false}
readOnly={false}
onPatch={onPatch}
onUndo={onUndo}
onRedo={onRedo}
onCommand={onCommand}
/>
<div onPaste={onPaste}>
<Tldraw
key={`wb-${isRTL}-${dockPos}-${forcePanning}`}
document={doc}
// disable the ability to drag and drop files onto the whiteboard
// until we handle saving of assets in akka.
disableAssets={true}
// Disable automatic focus. Users were losing focus on shared notes
// and chat on presentation mount.
autofocus={false}
onMount={onMount}
showPages={false}
showZoom={false}
showUI={curPres ? (isPresenter || hasWBAccess) : true}
showMenu={curPres ? false : true}
showMultiplayerMenu={false}
readOnly={false}
onPatch={onPatch}
onUndo={onUndo}
onRedo={onRedo}
onCommand={onCommand}
/>
</div>
);
const readOnlyWB = (

View File

@ -187,9 +187,9 @@ export default function Cursors(props) {
if (panel) xOffset += parseFloat(panel?.style?.width);
if (subPanel) xOffset += parseFloat(subPanel?.style?.width);
// disable native tldraw eraser animation
const eraserLine = document.getElementsByClassName('tl-erase-line')[0];
if (eraserLine) eraserLine.style.display = 'none';
// offset native tldraw eraser animation container
const overlay = document.getElementsByClassName('tl-overlay')[0];
if (overlay) overlay.style.left = '0px';
if (type === 'touchmove') {
calcPresOffset();

View File

@ -9,6 +9,7 @@ import PollService from '/imports/ui/components/poll/service';
import logger from '/imports/startup/client/logger';
import { defineMessages } from 'react-intl';
import { notify } from '/imports/ui/services/notification';
import caseInsensitiveReducer from '/imports/utils/caseInsensitiveReducer';
const Annotations = new Mongo.Collection(null);
@ -340,6 +341,7 @@ const getShapes = (whiteboardId, curPageId, intl) => {
annotations.forEach((annotation) => {
if (annotation.annotationInfo.questionType) {
// poll result, convert it to text and create tldraw shape
annotation.annotationInfo.answers = annotation.annotationInfo.answers.reduce(caseInsensitiveReducer, []);
const pollResult = PollService.getPollResultString(annotation.annotationInfo, intl)
.split('<br/>').join('\n').replace( /(<([^>]+)>)/ig, '');
annotation.annotationInfo = {

View File

@ -1,7 +1,8 @@
import browserInfo from '/imports/utils/browserInfo';
import deviceInfo from '/imports/utils/deviceInfo';
import { hasTurnServer } from '/imports/utils/fetchStunTurnServers';
const FORCE_RELAY_ON_FF = Meteor.settings.public.kurento.forceRelayOnFirefox;
const FORCE_RELAY_ON_FF = Meteor.settings.public.media.forceRelayOnFirefox;
const FORCE_RELAY = Meteor.settings.public.media.forceRelay;
/*
@ -16,7 +17,7 @@ const shouldForceRelay = () => {
const { isFirefox } = browserInfo;
const { isIos } = deviceInfo;
return FORCE_RELAY || ((isFirefox && !isIos) && FORCE_RELAY_ON_FF);
return FORCE_RELAY || ((isFirefox && !isIos) && FORCE_RELAY_ON_FF && hasTurnServer());
};
export {

View File

@ -7,9 +7,12 @@ const FALLBACK_STUN_SERVER = MEDIA.fallbackStunServer;
let STUN_TURN_DICT;
let MAPPED_STUN_TURN_DICT;
let TURN_CACHE_VALID_UNTIL = Math.floor(Date.now() / 1000);
let HAS_SEEN_TURN_SERVER = false;
const fetchStunTurnServers = function (sessionToken) {
if (STUN_TURN_DICT && CACHE_STUN_TURN) return Promise.resolve(STUN_TURN_DICT);
const now = Math.floor(Date.now() / 1000);
if (STUN_TURN_DICT && CACHE_STUN_TURN && now < TURN_CACHE_VALID_UNTIL) return Promise.resolve(STUN_TURN_DICT);
const handleStunTurnResponse = ({ stunServers, turnServers }) => {
if (!stunServers && !turnServers) {
@ -17,14 +20,23 @@ const fetchStunTurnServers = function (sessionToken) {
}
const turnReply = [];
let max_ttl = null;
_.each(turnServers, (turnEntry) => {
const { password, url, username } = turnEntry;
const valid_until = parseInt(username.split(':')[0]);
if (!max_ttl) {
max_ttl = valid_until;
} else if (valid_until < max_ttl) {
max_ttl = valid_until;
}
turnReply.push({
urls: url,
password,
username,
});
HAS_SEEN_TURN_SERVER = true;
});
TURN_CACHE_VALID_UNTIL = max_ttl;
const stDictionary = {
stun: stunServers.map(server => server.url),
@ -58,7 +70,8 @@ const getMappedFallbackStun = () => (FALLBACK_STUN_SERVER ? [{ urls: FALLBACK_ST
const fetchWebRTCMappedStunTurnServers = function (sessionToken) {
return new Promise(async (resolve, reject) => {
try {
if (MAPPED_STUN_TURN_DICT && CACHE_STUN_TURN) {
const now = Math.floor(Date.now() / 1000);
if (MAPPED_STUN_TURN_DICT && CACHE_STUN_TURN && now < TURN_CACHE_VALID_UNTIL) {
return resolve(MAPPED_STUN_TURN_DICT);
}
@ -72,9 +85,14 @@ const fetchWebRTCMappedStunTurnServers = function (sessionToken) {
});
};
const hasTurnServer = () => {
return HAS_SEEN_TURN_SERVER;
}
export {
fetchStunTurnServers,
fetchWebRTCMappedStunTurnServers,
getFallbackStun,
getMappedFallbackStun,
hasTurnServer,
};

View File

@ -47,6 +47,10 @@ export const safeMatch = (regex, content, defaultValue) => {
return content.match(regex) || defaultValue;
};
export const lowercaseTrim = (text) => {
return text.trim().toLowerCase();
}
export default {
capitalizeFirstLetter,
getDateString,
@ -55,4 +59,5 @@ export default {
unescapeHtml,
formatLocaleCode,
safeMatch,
lowercaseTrim,
};

View File

@ -445,6 +445,31 @@
"use-isomorphic-layout-effect": "^1.1.1"
}
},
"@fontsource/caveat-brush": {
"version": "4.5.9",
"resolved": "https://registry.npmjs.org/@fontsource/caveat-brush/-/caveat-brush-4.5.9.tgz",
"integrity": "sha512-H4uDBRSmTYX0Pman53VO8IP8JVnGd2wD4YyXHY0KTQX6jE0rs+UHuzraKGF8WTqBO7854VRCq09sPDhvLvqicQ=="
},
"@fontsource/crimson-pro": {
"version": "4.5.10",
"resolved": "https://registry.npmjs.org/@fontsource/crimson-pro/-/crimson-pro-4.5.10.tgz",
"integrity": "sha512-4L7B+woKIWiwOQrCvvpAQeEob3xoq5fVLTyt0YhXVafy2KWBTCcFVo/Y9n0UpDtGso9jN8pMo3SrYa3V6IayVw=="
},
"@fontsource/recursive": {
"version": "4.5.11",
"resolved": "https://registry.npmjs.org/@fontsource/recursive/-/recursive-4.5.11.tgz",
"integrity": "sha512-pAb+Qk1J0BysC6NTaaGDnhoorT4F8ZZKScWRUfqLpXP/wqH/lp9ccUcTxpS/pMawvmjZyNoKvQucvOvZNscUgw=="
},
"@fontsource/source-code-pro": {
"version": "4.5.12",
"resolved": "https://registry.npmjs.org/@fontsource/source-code-pro/-/source-code-pro-4.5.12.tgz",
"integrity": "sha512-6r1dykX7SH1Orm7xUh4sA8pjM1uNPKo9fV+y9/wxS+y/fwN+sMf6b1jHDUTmfEtw1OxlTaHGrr2I7dGeNqxdPA=="
},
"@fontsource/source-sans-pro": {
"version": "4.5.11",
"resolved": "https://registry.npmjs.org/@fontsource/source-sans-pro/-/source-sans-pro-4.5.11.tgz",
"integrity": "sha512-f7iw44q1EjBv3MNcHCGAgrW/QVyweaEouFsJzykPhTOGnZFSwFJRISToXornOmuAy7xUUGiVdqOLiykgZoYB8A=="
},
"@formatjs/ecma402-abstract": {
"version": "1.12.0",
"resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.12.0.tgz",
@ -1379,9 +1404,9 @@
"integrity": "sha512-9g9dWI4gsSVe8bNLlb+lMkBYsnIKCZTmvqvDG+Avnn69XfmHZKiaMrx7cgTaddq7aTPPmXiTsbFcUy0xgI4+wA=="
},
"@tldraw/core": {
"version": "1.20.0",
"resolved": "https://registry.npmjs.org/@tldraw/core/-/core-1.20.0.tgz",
"integrity": "sha512-zOQMS0bVj9x1RCCu7GzjjKzu36P577/BCuA9HF4Q9GNyZocvdoqGe0hv82AbDQIO8ktDfFSKPUGdGtlno0n+Lw==",
"version": "1.20.3",
"resolved": "https://registry.npmjs.org/@tldraw/core/-/core-1.20.3.tgz",
"integrity": "sha512-R/HqtQOg8yedcN70m75ekdm2u6dAHQpg3uxmzd7/TsdUnbfZc5UMp3TakYlTD6JwSSRV0n2huI4AD8D/NJ5jEw==",
"requires": {
"@tldraw/intersect": "^1.8.0",
"@tldraw/vec": "^1.8.0",
@ -1398,10 +1423,15 @@
}
},
"@tldraw/tldraw": {
"version": "1.26.1",
"resolved": "https://registry.npmjs.org/@tldraw/tldraw/-/tldraw-1.26.1.tgz",
"integrity": "sha512-SHskYUuZxvL0ugYeBnQ8o7UAs1yhfx/IQsmnolryPqmcFDoZ1y5K5lnkSAclDliv2HTbl9jZ/p85Zul9T4i+CQ==",
"version": "1.26.4",
"resolved": "https://registry.npmjs.org/@tldraw/tldraw/-/tldraw-1.26.4.tgz",
"integrity": "sha512-hD1lyM+TvaWkAtDKRXHu3Vt2a7OhJOlyEeaNoe0Nhgxb8BbrcdS8sTPKYL4CWjKmdFjYJ2ZfPlaiF2Dzvwk3JA==",
"requires": {
"@fontsource/caveat-brush": "^4.5.9",
"@fontsource/crimson-pro": "^4.5.10",
"@fontsource/recursive": "^4.5.11",
"@fontsource/source-code-pro": "^4.5.12",
"@fontsource/source-sans-pro": "^4.5.11",
"@radix-ui/react-alert-dialog": "^1.0.0",
"@radix-ui/react-context-menu": "^1.0.0",
"@radix-ui/react-dialog": "^1.0.0",
@ -1410,7 +1440,7 @@
"@radix-ui/react-popover": "^1.0.0",
"@radix-ui/react-tooltip": "^1.0.0",
"@stitches/react": "^1.2.8",
"@tldraw/core": "^1.20.0",
"@tldraw/core": "^1.20.3",
"@tldraw/intersect": "^1.8.0",
"@tldraw/vec": "^1.8.0",
"browser-fs-access": "^0.31.0",
@ -1424,149 +1454,109 @@
},
"dependencies": {
"@formatjs/ecma402-abstract": {
"version": "1.13.0",
"resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.13.0.tgz",
"integrity": "sha512-CQ8Ykd51jYD1n05dtoX6ns6B9n/+6ZAxnWUAonvHC4kkuAemROYBhHkEB4tm1uVrRlE7gLDqXkAnY51Y0pRCWQ==",
"version": "1.14.3",
"resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.14.3.tgz",
"integrity": "sha512-SlsbRC/RX+/zg4AApWIFNDdkLtFbkq3LNoZWXZCE/nHVKqoIJyaoQyge/I0Y38vLxowUn9KTtXgusLD91+orbg==",
"requires": {
"@formatjs/intl-localematcher": "0.2.31",
"tslib": "2.4.0"
},
"dependencies": {
"tslib": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
"integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
}
"@formatjs/intl-localematcher": "0.2.32",
"tslib": "^2.4.0"
}
},
"@formatjs/fast-memoize": {
"version": "1.2.7",
"resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-1.2.7.tgz",
"integrity": "sha512-hPeM5LXUUjtCKPybWOUAWpv8lpja8Xz+uKprFPJcg5F2Rd+/bf1E0UUsLRpaAgOReAf5HMRtoIgv/UcyPICrTQ==",
"requires": {
"tslib": "^2.4.0"
}
},
"@formatjs/icu-messageformat-parser": {
"version": "2.1.10",
"resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.1.10.tgz",
"integrity": "sha512-KkRMxhifWkRC45dhM9tqm0GXbb6NPYTGVYY3xx891IKc6p++DQrZTnmkVSNNO47OEERLfuP2KkPFPJBuu8z/wg==",
"version": "2.1.14",
"resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.1.14.tgz",
"integrity": "sha512-0KqeVOb72losEhUW+59vhZGGd14s1f35uThfEMVKZHKLEObvJdFTiI3ZQwvTMUCzLEMxnS6mtnYPmG4mTvwd3Q==",
"requires": {
"@formatjs/ecma402-abstract": "1.13.0",
"@formatjs/icu-skeleton-parser": "1.3.14",
"tslib": "2.4.0"
},
"dependencies": {
"tslib": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
"integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
}
"@formatjs/ecma402-abstract": "1.14.3",
"@formatjs/icu-skeleton-parser": "1.3.18",
"tslib": "^2.4.0"
}
},
"@formatjs/icu-skeleton-parser": {
"version": "1.3.14",
"resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.3.14.tgz",
"integrity": "sha512-7bv60HQQcBb3+TSj+45tOb/CHV5z1hOpwdtS50jsSBXfB+YpGhnoRsZxSRksXeCxMy6xn6tA6VY2601BrrK+OA==",
"version": "1.3.18",
"resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.3.18.tgz",
"integrity": "sha512-ND1ZkZfmLPcHjAH1sVpkpQxA+QYfOX3py3SjKWMUVGDow18gZ0WPqz3F+pJLYQMpS2LnnQ5zYR2jPVYTbRwMpg==",
"requires": {
"@formatjs/ecma402-abstract": "1.13.0",
"tslib": "2.4.0"
},
"dependencies": {
"tslib": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
"integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
}
"@formatjs/ecma402-abstract": "1.14.3",
"tslib": "^2.4.0"
}
},
"@formatjs/intl": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/@formatjs/intl/-/intl-2.5.1.tgz",
"integrity": "sha512-P01ZGuDDlcN8bHHBCEHspJPvs8WJeO8SXlUIcVGWhS3IN5vUgz0QKUXcKBFnJbEHhONJ+azlObVwvlDKsE+kUg==",
"version": "2.6.3",
"resolved": "https://registry.npmjs.org/@formatjs/intl/-/intl-2.6.3.tgz",
"integrity": "sha512-JaVZk14U/GypVfCZPevQ0KdruFkq16FXx7g398/Dm+YEx/W7sRiftbZeDy4wQ7WGryb45e763XycxD9o/vm9BA==",
"requires": {
"@formatjs/ecma402-abstract": "1.13.0",
"@formatjs/fast-memoize": "1.2.6",
"@formatjs/icu-messageformat-parser": "2.1.10",
"@formatjs/intl-displaynames": "6.1.4",
"@formatjs/intl-listformat": "7.1.3",
"intl-messageformat": "10.2.1",
"tslib": "2.4.0"
},
"dependencies": {
"tslib": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
"integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
}
"@formatjs/ecma402-abstract": "1.14.3",
"@formatjs/fast-memoize": "1.2.7",
"@formatjs/icu-messageformat-parser": "2.1.14",
"@formatjs/intl-displaynames": "6.2.3",
"@formatjs/intl-listformat": "7.1.7",
"intl-messageformat": "10.2.5",
"tslib": "^2.4.0"
}
},
"@formatjs/intl-displaynames": {
"version": "6.1.4",
"resolved": "https://registry.npmjs.org/@formatjs/intl-displaynames/-/intl-displaynames-6.1.4.tgz",
"integrity": "sha512-sEbziGLsWQo6nA8ZUBcsDRlZzPg+uMVjDmbTalgGqRWLbdXuxMldTYdaCK+UptyJhkmNVM/erz3csTiyqamXHQ==",
"version": "6.2.3",
"resolved": "https://registry.npmjs.org/@formatjs/intl-displaynames/-/intl-displaynames-6.2.3.tgz",
"integrity": "sha512-teB0L68MDGM8jEKQg55w7nvFjzeLHE6e3eK/04s+iuEVYYmvjjiHJKHrthKENzcJ0F6mHf/AwXrbX+1mKxT6AQ==",
"requires": {
"@formatjs/ecma402-abstract": "1.13.0",
"@formatjs/intl-localematcher": "0.2.31",
"tslib": "2.4.0"
},
"dependencies": {
"tslib": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
"integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
}
"@formatjs/ecma402-abstract": "1.14.3",
"@formatjs/intl-localematcher": "0.2.32",
"tslib": "^2.4.0"
}
},
"@formatjs/intl-listformat": {
"version": "7.1.3",
"resolved": "https://registry.npmjs.org/@formatjs/intl-listformat/-/intl-listformat-7.1.3.tgz",
"integrity": "sha512-rs0Kxl78PeRCedx2cmFoBqcun2Kf0bCQrF8ycna54sfePpDhMskvODWeI4G/xBioW01FjK7CJSvtJJ87hrr79A==",
"version": "7.1.7",
"resolved": "https://registry.npmjs.org/@formatjs/intl-listformat/-/intl-listformat-7.1.7.tgz",
"integrity": "sha512-Zzf5ruPpfJnrAA2hGgf/6pMgQ3tx9oJVhpqycFDavHl3eEzrwdHddGqGdSNwhd0bB4NAFttZNQdmKDldc5iDZw==",
"requires": {
"@formatjs/ecma402-abstract": "1.13.0",
"@formatjs/intl-localematcher": "0.2.31",
"tslib": "2.4.0"
},
"dependencies": {
"tslib": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
"integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
}
"@formatjs/ecma402-abstract": "1.14.3",
"@formatjs/intl-localematcher": "0.2.32",
"tslib": "^2.4.0"
}
},
"@formatjs/intl-localematcher": {
"version": "0.2.32",
"resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.2.32.tgz",
"integrity": "sha512-k/MEBstff4sttohyEpXxCmC3MqbUn9VvHGlZ8fauLzkbwXmVrEeyzS+4uhrvAk9DWU9/7otYWxyDox4nT/KVLQ==",
"requires": {
"tslib": "^2.4.0"
}
},
"intl-messageformat": {
"version": "10.2.1",
"resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.2.1.tgz",
"integrity": "sha512-1lrJG2qKzcC1TVzYu1VuB1yiY68LU5rwpbHa2THCzA67Vutkz7+1lv5U20K3Lz5RAiH78zxNztMEtchokMWv8A==",
"version": "10.2.5",
"resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.2.5.tgz",
"integrity": "sha512-AievYMN6WLLHwBeCTv4aRKG+w3ZNyZtkObwgsKk3Q7GNTq8zDRvDbJSBQkb2OPeVCcAKcIXvak9FF/bRNavoww==",
"requires": {
"@formatjs/ecma402-abstract": "1.13.0",
"@formatjs/fast-memoize": "1.2.6",
"@formatjs/icu-messageformat-parser": "2.1.10",
"tslib": "2.4.0"
},
"dependencies": {
"tslib": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
"integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
}
"@formatjs/ecma402-abstract": "1.14.3",
"@formatjs/fast-memoize": "1.2.7",
"@formatjs/icu-messageformat-parser": "2.1.14",
"tslib": "^2.4.0"
}
},
"react-intl": {
"version": "6.2.1",
"resolved": "https://registry.npmjs.org/react-intl/-/react-intl-6.2.1.tgz",
"integrity": "sha512-hYxcSamgoA3Mvc55nwhTF1v15T0NUSkaV/EScMNVZXg0kRyaMAoNHkCi9/9H+TnXWNiWrcWH9bjlMlJwrG2V7g==",
"version": "6.2.5",
"resolved": "https://registry.npmjs.org/react-intl/-/react-intl-6.2.5.tgz",
"integrity": "sha512-nz21POTKbE0sPEuEJU4o5YTZYY7VlIYCPNJaD6D2+xKyk6Noj6DoUK0LRO9LXuQNUuQ044IZl3m6ymzZRj8XFQ==",
"requires": {
"@formatjs/ecma402-abstract": "1.13.0",
"@formatjs/icu-messageformat-parser": "2.1.10",
"@formatjs/intl": "2.5.1",
"@formatjs/intl-displaynames": "6.1.4",
"@formatjs/intl-listformat": "7.1.3",
"@formatjs/ecma402-abstract": "1.14.3",
"@formatjs/icu-messageformat-parser": "2.1.14",
"@formatjs/intl": "2.6.3",
"@formatjs/intl-displaynames": "6.2.3",
"@formatjs/intl-listformat": "7.1.7",
"@types/hoist-non-react-statics": "^3.3.1",
"@types/react": "16 || 17 || 18",
"hoist-non-react-statics": "^3.3.2",
"intl-messageformat": "10.2.1",
"tslib": "2.4.0"
},
"dependencies": {
"tslib": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
"integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
}
"intl-messageformat": "10.2.5",
"tslib": "^2.4.0"
}
},
"tslib": {
@ -1631,16 +1621,16 @@
"integrity": "sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA=="
},
"@use-gesture/core": {
"version": "10.2.20",
"resolved": "https://registry.npmjs.org/@use-gesture/core/-/core-10.2.20.tgz",
"integrity": "sha512-4lFhHc8so4yIHkBEs641DnEsBxPyhJ5GEjB4PURFDH4p/FcZriH6w99knZgI63zN/MBFfylMyb8+PDuj6RIXKQ=="
"version": "10.2.23",
"resolved": "https://registry.npmjs.org/@use-gesture/core/-/core-10.2.23.tgz",
"integrity": "sha512-Ynap/Uh6RX1Vgn3zNmFTyKapapdf7Av+GzAe6h+RsBZaxMF1z3cK6aohHPJP6T1hLrPyH/yehxa7RBqyESG9RA=="
},
"@use-gesture/react": {
"version": "10.2.20",
"resolved": "https://registry.npmjs.org/@use-gesture/react/-/react-10.2.20.tgz",
"integrity": "sha512-KnJq9ZSqprWA6uNhWTUHZqTCh+rfa0j8ehTzqeBhktUPrmTj7yVOBvEQ/vSFU/7d72cGgWSsJ0f5T6GQCHXnvg==",
"version": "10.2.23",
"resolved": "https://registry.npmjs.org/@use-gesture/react/-/react-10.2.23.tgz",
"integrity": "sha512-anj9j3Lm4l+/s60Jv1FD2m13r+T+aYstSHUT62hTugojM64LPe9XatfEVHRyWOrGjRU2buQhlm03xN8oxkg/OQ==",
"requires": {
"@use-gesture/core": "10.2.20"
"@use-gesture/core": "10.2.23"
}
},
"acorn": {
@ -1750,9 +1740,9 @@
}
},
"aria-hidden": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.1.tgz",
"integrity": "sha512-PN344VAf9j1EAi+jyVHOJ8XidQdPVssGco39eNcsGdM4wcsILtxrKLkbuiMfLWYROK1FjRQasMWCBttrhjnr6A==",
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.2.tgz",
"integrity": "sha512-6y/ogyDTk/7YAe91T3E2PR1ALVKyM2QbTio5HwM+N1Q6CMlCKhvClyIjkckBswa0f2xJhjsfzIGa1yVSe1UMVA==",
"requires": {
"tslib": "^2.0.0"
}
@ -2592,9 +2582,9 @@
}
},
"dom-serializer": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz",
"integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==",
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
"integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
"requires": {
"domelementtype": "^2.0.1",
"domhandler": "^4.2.0",
@ -2602,22 +2592,22 @@
}
},
"domelementtype": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz",
"integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A=="
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
"integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="
},
"domhandler": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.0.tgz",
"integrity": "sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==",
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz",
"integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==",
"requires": {
"domelementtype": "^2.2.0"
}
},
"domutils": {
"version": "2.6.0",
"resolved": "https://registry.npmjs.org/domutils/-/domutils-2.6.0.tgz",
"integrity": "sha512-y0BezHuy4MDYxh6OvolXYsH+1EMGmFbwv5FKW7ovwMG6zTPWqNPq3WF9ayZssFq+UlKdffGLbOEaghNdaOm1WA==",
"version": "2.8.0",
"resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
"integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
"requires": {
"dom-serializer": "^1.0.1",
"domelementtype": "^2.2.0",
@ -3415,12 +3405,9 @@
}
},
"flat": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz",
"integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==",
"requires": {
"is-buffer": "~2.0.3"
}
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
"integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ=="
},
"flat-cache": {
"version": "3.0.4",
@ -3843,11 +3830,6 @@
"call-bind": "^1.0.2"
}
},
"is-buffer": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
"integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ=="
},
"is-callable": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz",
@ -4044,9 +4026,9 @@
"dev": true
},
"json5": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
"integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
"dev": true,
"requires": {
"minimist": "^1.2.0"
@ -4140,11 +4122,6 @@
"object.assign": "^4.1.2"
}
},
"klona": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/klona/-/klona-2.0.4.tgz",
"integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA=="
},
"kuler": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz",
@ -5271,9 +5248,9 @@
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
},
"nanoid": {
"version": "3.3.3",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz",
"integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w=="
"version": "3.3.4",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
"integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw=="
},
"natural-compare": {
"version": "1.4.0",
@ -5751,7 +5728,7 @@
"parse-srcset": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz",
"integrity": "sha1-8r0iH2zJcKk42IVWq8WJyqqiveE="
"integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q=="
},
"path-exists": {
"version": "3.0.0",
@ -5820,11 +5797,11 @@
"integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ=="
},
"postcss": {
"version": "8.4.12",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.12.tgz",
"integrity": "sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==",
"version": "8.4.20",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.20.tgz",
"integrity": "sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g==",
"requires": {
"nanoid": "^3.3.1",
"nanoid": "^3.3.4",
"picocolors": "^1.0.0",
"source-map-js": "^1.0.2"
}
@ -6313,17 +6290,16 @@
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
"sanitize-html": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.3.3.tgz",
"integrity": "sha512-DCFXPt7Di0c6JUnlT90eIgrjs6TsJl/8HYU3KLdmrVclFN4O0heTcVbJiMa23OKVr6aR051XYtsgd8EWwEBwUA==",
"version": "2.7.1",
"resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.7.1.tgz",
"integrity": "sha512-oOpe8l4J8CaBk++2haoN5yNI5beekjuHv3JRPKUx/7h40Rdr85pemn4NkvUB3TcBP7yjat574sPlcMAyv4UQig==",
"requires": {
"deepmerge": "^4.2.2",
"escape-string-regexp": "^4.0.0",
"htmlparser2": "^6.0.0",
"is-plain-object": "^5.0.0",
"klona": "^2.0.3",
"parse-srcset": "^1.0.2",
"postcss": "^8.0.2"
"postcss": "^8.3.11"
},
"dependencies": {
"escape-string-regexp": {
@ -7119,9 +7095,9 @@
"integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="
},
"zustand": {
"version": "4.1.4",
"resolved": "https://registry.npmjs.org/zustand/-/zustand-4.1.4.tgz",
"integrity": "sha512-k2jVOlWo8p4R83mQ+/uyB8ILPO2PCJOf+QVjcL+1PbMCk1w5OoPYpAIxy9zd93FSfmJqoH6lGdwzzjwqJIRU5A==",
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/zustand/-/zustand-4.2.0.tgz",
"integrity": "sha512-eNwaDoD2FYVnMgtNxiMUhTJO780wonZUzJrPQTLYI0erSIMZF8cniWFW22kGQUECd8rdHRJ/ZJL2XO54c9Ttuw==",
"requires": {
"use-sync-external-store": "1.2.0"
}

8
bigbluebutton-html5/package.json Executable file → Normal file
View File

@ -33,8 +33,8 @@
"@jitsi/sdp-interop": "0.1.14",
"@material-ui/core": "^4.12.4",
"@mconf/bbb-diff": "^1.2.0",
"@tldraw/core": "1.20.0",
"@tldraw/tldraw": "1.26.1",
"@tldraw/core": "1.20.3",
"@tldraw/tldraw": "1.26.4",
"autoprefixer": "^10.4.4",
"axios": "^0.21.3",
"babel-runtime": "~6.26.0",
@ -46,7 +46,7 @@
"eventemitter2": "~6.4.6",
"fastdom": "^1.0.10",
"fibers": "^4.0.2",
"flat": "^4.1.1",
"flat": "^5.0.2",
"hark": "^1.2.3",
"html-to-image": "^1.9.0",
"immutability-helper": "~2.8.1",
@ -79,7 +79,7 @@
"react-virtualized": "^9.22.3",
"reconnecting-websocket": "~v4.4.0",
"redis": "^3.1.2",
"sanitize-html": "2.3.3",
"sanitize-html": "2.7.1",
"scheduler": "^0.20.2",
"sdp-transform": "2.7.0",
"smile2emoji": "^2.8.0",

View File

@ -30,7 +30,7 @@ public:
appName: BigBlueButton HTML5 Client
bbbServerVersion: HTML5_FULL_BBB_VERSION
displayBbbServerVersion: true
copyright: '©2022 BigBlueButton Inc.'
copyright: '©2023 BigBlueButton Inc.'
html5ClientBuild: HTML5_CLIENT_VERSION
helpLink: https://bigbluebutton.org/html5/
bbbTabletApp:
@ -267,8 +267,6 @@ public:
# Controls whether ICE candidates should be signaled to bbb-webrtc-sfu.
# Enable this if you want to use Kurento as the media server.
signalCandidates: false
# Forces relay usage only on Firefox. Applies to listen only, webcams and screenshare.
forceRelayOnFirefox: false
# traceLogs: <Boolean> - enable trace logs in SFU peers
traceLogs: false
cameraTimeouts:
@ -587,6 +585,9 @@ public:
# Forces relay usage on all browsers, environments and media modules.
# If true, supersedes public.kurento.forceRelayOnFirefox
forceRelay: false
# Firefox has a buggy ICE implementation. With mediasoup this leads to
# connection problems unless all traffic is relayed through a turn server.
forceRelayOnFirefox: true
mediaTag: '#remote-media'
callTransferTimeout: 5000
callHangupTimeout: 2000

View File

@ -2,10 +2,11 @@
"app.home.greeting": "Ihre Präsentation beginnt in Kürze...",
"app.chat.submitLabel": "Nachricht senden",
"app.chat.loading": "Chatnachrichten geladen: {0}%",
"app.chat.errorMaxMessageLength": "Die Nachricht ist {0} Buchstabe(n) zu lang",
"app.chat.errorMaxMessageLength": "Die Nachricht ist zu lang. Sie darf maximal {0} Zeichen haben.",
"app.chat.disconnected": "Nicht verbunden, es können keine Nachrichten gesendet werden",
"app.chat.locked": "Der Chat ist gesperrt. Es können keine Nachrichten gesendet werden.",
"app.chat.inputLabel": "Chatnachricht eingeben für {0}",
"app.chat.emojiButtonLabel": "Emoji-Auswahl",
"app.chat.inputPlaceholder": "Nachricht {0}",
"app.chat.titlePublic": "Öffentlicher Chat",
"app.chat.titlePrivate": "Privater Chat mit {0}",
@ -21,6 +22,7 @@
"app.chat.offline": "Offline",
"app.chat.pollResult": "Umfrageergebnisse",
"app.chat.breakoutDurationUpdated": "Gruppenzeit beträgt jetzt {0} Minuten",
"app.chat.breakoutDurationUpdatedModerator": "Gruppenraumzeit beträgt nun {0} und eine Benachrichtigung wurde versendet.",
"app.chat.emptyLogLabel": "Chatprotokoll ist leer",
"app.chat.clearPublicChatMessage": "Der öffentliche Chatverlauf wurde durch einen Moderator gelöscht",
"app.chat.multi.typing": "Mehrere Teilnehmer tippen",
@ -28,6 +30,27 @@
"app.chat.two.typing": "{0} und {1} tippen",
"app.chat.copySuccess": "Chatprotokoll kopiert",
"app.chat.copyErr": "Kopieren des Chatprotokolls fehlgeschlagen",
"app.emojiPicker.search": "Suche",
"app.emojiPicker.notFound": "Kein Emoji gefunden",
"app.emojiPicker.skintext": "Wähle die standardmäßige Hautfarbe",
"app.emojiPicker.clear": "Leeren",
"app.emojiPicker.categories.label": "Emoji-Kategorien",
"app.emojiPicker.categories.people": "Menschen & Körper",
"app.emojiPicker.categories.nature": "Tiere & Natur",
"app.emojiPicker.categories.foods": "Essen & Trinken",
"app.emojiPicker.categories.places": "Reisen & Orte",
"app.emojiPicker.categories.activity": "Aktivitäten",
"app.emojiPicker.categories.objects": "Objekte",
"app.emojiPicker.categories.symbols": "Symbole",
"app.emojiPicker.categories.flags": "Flaggen",
"app.emojiPicker.categories.recent": "Häufig genutzt",
"app.emojiPicker.categories.search": "Suchergebnisse",
"app.emojiPicker.skintones.1": "Standardmäßige Hautfarbe",
"app.emojiPicker.skintones.2": "Heller Hautton",
"app.emojiPicker.skintones.3": "Mittelheller Hautton",
"app.emojiPicker.skintones.4": "Mittlerer Hautton",
"app.emojiPicker.skintones.5": "Mitteldunkler Hautton",
"app.emojiPicker.skintones.6": "Dunkler Hautton",
"app.captions.label": "Untertitel",
"app.captions.menu.close": "Schließen",
"app.captions.menu.start": "Start",
@ -53,12 +76,21 @@
"app.captions.speech.start": "Spracherkennung gestartet",
"app.captions.speech.stop": "Spracherkennung gestoppt",
"app.captions.speech.error": "Spracherkennung wurde aufgrund der Inkompatibilität des Browsers oder einer längeren Zeit der Stille angehalten",
"app.confirmation.skipConfirm": "Nicht nochmal fragen",
"app.confirmation.virtualBackground.title": "Neuen virtuellen Hintergrund starten",
"app.confirmation.virtualBackground.description": "{0} wird als virtueller Hintergrund hinzufügt. Fortsetzen?",
"app.confirmationModal.yesLabel": "Ja",
"app.textInput.sendLabel": "Absenden",
"app.title.defaultViewLabel": "Standardpräsentation",
"app.notes.title": "Geteilte Notizen",
"app.notes.label": "Notizen",
"app.notes.hide": "Notizen verbergen",
"app.notes.locked": "Gesperrt",
"app.notes.disabled": "Im Medienbereich angeheftet",
"app.notes.notesDropdown.covertAndUpload": "Notizen in Präsentation umwandeln",
"app.notes.notesDropdown.pinNotes": "Notizen an das Whiteboard heften",
"app.notes.notesDropdown.unpinNotes": "Notizen loslösen",
"app.notes.notesDropdown.notesOptions": "Notizoptionen",
"app.pads.hint": "Esc drücken, um die Symbolleiste des Pads auszuwählen",
"app.user.activityCheck": "Teilnehmeraktivitätsprüfung",
"app.user.activityCheck.label": "Prüfen, ob der Teilnehmer noch in der Konferenz ist ({0})",
@ -170,7 +202,7 @@
"app.presentation.endSlideContent": "Ende des Folieninhalts",
"app.presentation.changedSlideContent": "Präsentation gewechselt zur Folie: {0}",
"app.presentation.emptySlideContent": "Kein Inhalt für aktuelle Folie",
"app.presentation.options.fullscreen": "Vollbild",
"app.presentation.options.fullscreen": "Vollbild-Präsentation",
"app.presentation.options.exitFullscreen": "Vollbilddarstellung beenden",
"app.presentation.options.minimize": "Minimieren",
"app.presentation.options.snapshot": "Aktuelle Folie herunterladen",
@ -203,7 +235,18 @@
"app.presentation.presentationToolbar.goToSlide": "Folie {0}",
"app.presentation.placeholder": "Es gibt derzeit keine aktive Präsentation",
"app.presentationUploder.title": "Präsentation",
"app.presentationUploder.message": "Als Präsentator können Präsentationen als Office-Dokumente oder PDF-Dateien hochgeladen werden. PDF-Dateien haben dabei die bessere Qualität. Bitte achten Sie darauf, dass eine Präsentation über das runde Auswahlfeld auf der rechten Seite ausgewählt ist.",
"app.presentationUploder.message": "Es können Office-Dokumente oder PDFs als Präsentation hochgeladen werden. Wir empfehlen PDF für beste Ergebnisse. Bitte sicherstellen, dass die richtige Präsentation mit runden Auswahlfeld auf der linken Seite ausgewählt ist.",
"app.presentationUploader.exportHint": "Wenn Sie \"An den Chat senden\" wählen, erhalten die Nutzer einen herunterladbaren Link mit Kommentaren im öffentlichen Chat.",
"app.presentationUploader.exportToastHeader": "Sende an Chat ({0} Element)",
"app.presentationUploader.exportToastHeaderPlural": "Sende an Chat ({0} Elemente)",
"app.presentationUploader.exporting": "Sende an Chat…",
"app.presentationUploader.sending": "Sende…",
"app.presentationUploader.collecting": "Extrahiere Folie {0} von {1}…",
"app.presentationUploader.processing": "Annotiere Folie {0} von {1}...",
"app.presentationUploader.sent": "Gesendet",
"app.presentationUploader.exportingTimeout": "Der Export dauert zu lange…",
"app.presentationUploader.export": "An Chat senden",
"app.presentationUploader.currentPresentationLabel": "Aktuelle Präsentation",
"app.presentationUploder.extraHint": "WICHTIG: Jede Datei darf {0} MB und {1} Seiten nicht überschreiten.",
"app.presentationUploder.uploadLabel": "Hochladen",
"app.presentationUploder.confirmLabel": "Bestätigen",
@ -214,6 +257,8 @@
"app.presentationUploder.dropzoneImagesLabel": "Bilder zum Hochladen hierhin ziehen",
"app.presentationUploder.browseFilesLabel": "oder nach Dateien suchen",
"app.presentationUploder.browseImagesLabel": "oder nach Bildern suchen/aufnehmen",
"app.presentationUploder.externalUploadTitle": "Füge Inhalte aus anderen Apps hinzu",
"app.presentationUploder.externalUploadLabel": "Dateien durchsuchen",
"app.presentationUploder.fileToUpload": "Bereit zum Hochladen...",
"app.presentationUploder.currentBadge": "Aktuell",
"app.presentationUploder.rejectedError": "Die ausgewählten Dateien wurden zurückgewiesen. Bitte die zulässigen Dateitypen prüfen.",
@ -230,14 +275,14 @@
"app.presentationUploder.conversion.generatedSlides": "Folien wurden generiert...",
"app.presentationUploder.conversion.generatingSvg": "SVG-Bilder werden generiert...",
"app.presentationUploder.conversion.pageCountExceeded": "Maximale Seitenanzahl von {0} Seiten wurde überschritten",
"app.presentationUploder.conversion.invalidMimeType": "Ungültiges Format entdeckt (Dateiendung={0}, Content-Type={1})",
"app.presentationUploder.conversion.conversionTimeout": "Folie {0} konnte nicht innerhalb von {1} Versuchen konvertiert werden.",
"app.presentationUploder.conversion.officeDocConversionInvalid": "Die Verarbeitung des Office-Dokuments ist fehlgeschlagen, bitte eine PDF-Datei hochladen versuchen.",
"app.presentationUploder.conversion.officeDocConversionFailed": "Die Verarbeitung des Office-Dokuments ist fehlgeschlagen, bitte eine PDF-Datei hochladen.",
"app.presentationUploder.conversion.pdfHasBigPage": "Die PDF-Datei konnte nicht konvertiert werden, bitte versuchen Sie die Datei zu optimieren. Die maximale Seitenzahl beträgt {0} Seiten.",
"app.presentationUploder.conversion.timeout": "Ups, die Konvertierung hat zu lange gedauert",
"app.presentationUploder.conversion.pageCountFailed": "Die Seitenanzahl konnte nicht ermittelt werden.",
"app.presentationUploder.conversion.unsupportedDocument": "Dateityp wird nicht unterstützt",
"app.presentationUploder.isDownloadableLabel": "Das Herunterladen der Präsentation ist nicht zugelassen - hier das Herunterladen der Präsentation erlauben",
"app.presentationUploder.isNotDownloadableLabel": "Das Herunterladen der Präsentation ist zugelassen - hier das Herunterladen der Präsentation verbieten",
"app.presentationUploder.removePresentationLabel": "Präsentation entfernen",
"app.presentationUploder.setAsCurrentPresentation": "Diese Präsentation auswählen",
"app.presentationUploder.tableHeading.filename": "Dateiname",
@ -251,6 +296,10 @@
"app.presentationUploder.clearErrors": "Fehler löschen",
"app.presentationUploder.clearErrorsDesc": "Löscht fehlgeschlagene Präsentationsuploads",
"app.presentationUploder.uploadViewTitle": "Präsentation hochladen",
"app.poll.questionAndoptions.label" : "Zu zeigender Fragetext.\nA. Umfrageoption *\nB. Umfrageoption (optional)\nC. Abfrageoption (optional)\nD. Abfrageoption (optional)\nE. Abfrageoption (optional)",
"app.poll.customInput.label": "benutzerdefinierte Eingabe",
"app.poll.customInputInstructions.label": "Die benutzerdefinierte Eingabe ist aktiviert - schreiben Sie die Frage und die Option(en) der Umfrage im vorgegebenen Format oder wählen Sie eine Textdatei im gleichen Format per Drag & Drop aus. ",
"app.poll.maxOptionsWarning.label": "Nur die ersten fünf Optionen können genutzt werden!",
"app.poll.pollPaneTitle": "Umfrage",
"app.poll.enableMultipleResponseLabel": "Mehrere Antworten pro Befragten zulassen?",
"app.poll.quickPollTitle": "Schnellumfrage",
@ -270,7 +319,7 @@
"app.poll.clickHereToSelect": "Zum Auswählen hier klicken",
"app.poll.question.label" : "Eine Frage stellen...",
"app.poll.optionalQuestion.label" : "Eine Frage stellen (optional)...",
"app.poll.userResponse.label" : "Teilnehmerantwort",
"app.poll.userResponse.label" : "Freie Antwort",
"app.poll.responseTypes.label" : "Antworttypen",
"app.poll.optionDelete.label" : "Löschen",
"app.poll.responseChoices.label" : "Antwortmöglichkeiten",
@ -311,8 +360,8 @@
"app.poll.liveResult.secretLabel": "Dies ist eine anonyme Umfrage. Individuelle Antworten werden nicht angezeigt.",
"app.poll.removePollOpt": "Entfernt die Option {0}",
"app.poll.emptyPollOpt": "Leer",
"app.polling.pollingTitle": "Umfrageoptionen",
"app.polling.pollQuestionTitle": "Frage der Umfrage",
"app.polling.pollingTitle": "Antworten",
"app.polling.pollQuestionTitle": "Umfrage",
"app.polling.submitLabel": "Absenden",
"app.polling.submitAriaLabel": "Umfrageantwort absenden",
"app.polling.responsePlaceholder": "Antwort eingeben",
@ -329,11 +378,11 @@
"app.muteWarning.disableMessage": "Hinweis auf Stummschaltung deaktiviert, bis die Stummschaltung aufgehoben wird",
"app.muteWarning.tooltip": "Klicken, um den Hinweis bis zur nächsten Aufhebung der Stummschaltung zu schließen",
"app.navBar.settingsDropdown.optionsLabel": "Optionen",
"app.navBar.settingsDropdown.fullscreenLabel": "Als Vollbild darstellen",
"app.navBar.settingsDropdown.fullscreenLabel": "Vollbild-Anwendung",
"app.navBar.settingsDropdown.settingsLabel": "Einstellungen öffnen",
"app.navBar.settingsDropdown.aboutLabel": "Versionsinfo",
"app.navBar.settingsDropdown.leaveSessionLabel": "Konferenz verlassen",
"app.navBar.settingsDropdown.exitFullscreenLabel": "Vollbilddarstellung beenden",
"app.navBar.settingsDropdown.exitFullscreenLabel": "Vollbild beenden",
"app.navBar.settingsDropdown.fullscreenDesc": "Einstellungsmenü als Vollbild darstellen",
"app.navBar.settingsDropdown.settingsDesc": "Basiseinstellungen ändern",
"app.navBar.settingsDropdown.aboutDesc": "Informationen über den Client anzeigen",
@ -342,6 +391,7 @@
"app.navBar.settingsDropdown.hotkeysLabel": "Tastenkombinationen",
"app.navBar.settingsDropdown.hotkeysDesc": "Liste verfügbarer Tastenkombinationen",
"app.navBar.settingsDropdown.helpLabel": "Hilfe",
"app.navBar.settingsDropdown.openAppLabel": "In \"BigBlueButton Tablet\"-App öffnen",
"app.navBar.settingsDropdown.helpDesc": "Link zu Videoanleitungen (öffnet neuen Browsertab)",
"app.navBar.settingsDropdown.endMeetingDesc": "Beendet die aktuelle Konferenz",
"app.navBar.settingsDropdown.endMeetingLabel": "Konferenz beenden",
@ -359,7 +409,7 @@
"app.endMeeting.description": "Mit dieser Aktion wird die Konferenz für {0} aktive(n) Teilnehmer beendet. Sind Sie sicher, dass Sie diese Konferenz beenden möchten?",
"app.endMeeting.noUserDescription": "Sind Sie sicher, dass Sie die Konferenz beenden wollen?",
"app.endMeeting.contentWarning": "Chatnachrichten, geteilte Notizen, Whiteboard-Inhalte und geteilte Dokumente dieser Konferenz sind nicht mehr direkt zugänglich",
"app.endMeeting.yesLabel": "Ja",
"app.endMeeting.yesLabel": "Sitzung für alle beenden",
"app.endMeeting.noLabel": "Nein",
"app.about.title": "Versionsinfo",
"app.about.version": "Clientversion:",
@ -369,6 +419,15 @@
"app.about.confirmDesc": "OK",
"app.about.dismissLabel": "Abbrechen",
"app.about.dismissDesc": "Informationen über Client schließen",
"app.mobileAppModal.title": "\"BigBlueButton Tablet\"-App öffnen",
"app.mobileAppModal.description": "Ist die \"BigBlueButton Tablet\"-App auf diesem Gerät installiert?",
"app.mobileAppModal.openApp": "Ja, App jetzt öffnen.",
"app.mobileAppModal.obtainUrlMsg": "Hole Sitzungs-URL",
"app.mobileAppModal.obtainUrlErrorMsg": "Fehler beim Versuch, die URL einer Sitzung abzurufen",
"app.mobileAppModal.openStore": "Nein, App-Store öffnen",
"app.mobileAppModal.dismissLabel": "Abbrechen",
"app.mobileAppModal.dismissDesc": "Schließen",
"app.mobileAppModal.userConnectedWithSameId": "Der Teilnehmer {0} hat sich gerade mit der gleichen ID wie Sie verbunden.",
"app.actionsBar.changeStatusLabel": "Status ändern",
"app.actionsBar.muteLabel": "Stummschalten",
"app.actionsBar.unmuteLabel": "Freischalten",
@ -379,10 +438,12 @@
"app.actionsBar.actionsDropdown.restorePresentationDesc": "Schaltfläche zum Wiederherstellen der Präsentation, nachdem sie minimiert wurde",
"app.actionsBar.actionsDropdown.minimizePresentationLabel": "Präsentation minimieren",
"app.actionsBar.actionsDropdown.minimizePresentationDesc": "Schaltfläche zum Minimieren der Präsentation",
"app.actionsBar.actionsDropdown.layoutModal": "Layout-Einstellungen",
"app.screenshare.screenShareLabel" : "Bildschirmfreigabe",
"app.submenu.application.applicationSectionTitle": "Anwendung",
"app.submenu.application.animationsLabel": "Animationen",
"app.submenu.application.audioFilterLabel": "Audiofilter für das Mikrofon",
"app.submenu.application.darkThemeLabel": "Dark-Mode",
"app.submenu.application.fontSizeControlLabel": "Schriftgröße",
"app.submenu.application.increaseFontBtnLabel": "Schriftgröße erhöhen",
"app.submenu.application.decreaseFontBtnLabel": "Schriftgröße verringern",
@ -392,6 +453,7 @@
"app.submenu.application.noLocaleOptionLabel": "Keine Sprachschemata verfügbar",
"app.submenu.application.paginationEnabledLabel": "Seitenweises Anzeigen von Webcams",
"app.submenu.application.layoutOptionLabel": "Layout-Modus",
"app.submenu.application.pushLayoutLabel": "Layout verteilen",
"app.submenu.notification.SectionTitle": "Benachrichtigungen",
"app.submenu.notification.Desc": "Bitte definieren, wie und was mitgeteilt werden soll.",
"app.submenu.notification.audioAlertLabel": "Audio-Hinweise",
@ -420,7 +482,7 @@
"app.settings.main.save.label.description": "Speichert die Einstellungen und schließt das Einstellungsmenü",
"app.settings.dataSavingTab.label": "Datensparmodus",
"app.settings.dataSavingTab.webcam": "Webcams aktiviert",
"app.settings.dataSavingTab.screenShare": "Bildschirmfreigabe aktiviert",
"app.settings.dataSavingTab.screenShare": "Freigabe des Desktops für andere Teilnehmer",
"app.settings.dataSavingTab.description": "Um Datentransfervolumen zu sparen, können hier eingestellt werden, was angezeigt wird.",
"app.settings.save-notification.label": "Einstellungen wurden gespeichert",
"app.statusNotifier.lowerHands": "Hände senken",
@ -440,7 +502,6 @@
"app.actionsBar.actionsDropdown.presentationLabel": "Präsentationen verwalten",
"app.actionsBar.actionsDropdown.initPollLabel": "Eine Umfrage starten",
"app.actionsBar.actionsDropdown.desktopShareLabel": "Bildschirm freigeben",
"app.actionsBar.actionsDropdown.lockedDesktopShareLabel": "Bildschirmfreigabe gesperrt",
"app.actionsBar.actionsDropdown.stopDesktopShareLabel": "Bildschirmfreigabe beenden",
"app.actionsBar.actionsDropdown.presentationDesc": "Präsentation hochladen",
"app.actionsBar.actionsDropdown.initPollDesc": "Eine Umfrage starten",
@ -457,6 +518,7 @@
"app.actionsBar.actionsDropdown.takePresenterDesc": "Sich selbst zum neuen Präsentator machen",
"app.actionsBar.actionsDropdown.selectRandUserLabel": "Zufälligen Teilnehmer auswählen",
"app.actionsBar.actionsDropdown.selectRandUserDesc": "Wählt einen Teilnehmer nach dem Zufallsprinzip aus",
"app.actionsBar.actionsDropdown.propagateLayoutLabel": "Layout verbreiten",
"app.actionsBar.emojiMenu.statusTriggerLabel": "Status setzen",
"app.actionsBar.emojiMenu.awayLabel": "Abwesend",
"app.actionsBar.emojiMenu.awayDesc": "Ihren Status auf abwesend setzen",
@ -496,6 +558,7 @@
"app.audioNotification.audioFailedError1012": "Verbindung beendet (Fehler 1012)",
"app.audioNotification.audioFailedMessage": "Audioverbindung konnte nicht hergestellt werden",
"app.audioNotification.mediaFailedMessage": "getUserMicMedia fehlgeschlagen, weil nur sichere Quellen erlaubt sind",
"app.audioNotification.deviceChangeFailed": "Wechsel des Audiogeräts gescheitert. Bite prüfen, ob das gewählte Gerät korrekt eingerichtet und verfügbar ist.",
"app.audioNotification.closeLabel": "Schließen",
"app.audioNotificaion.reconnectingAsListenOnly": "Mikrofone sind für Teilnehmer:innen gesperrt, in dieser Konferenz ist nur Zuhören möglich",
"app.breakoutJoinConfirmation.title": "Gruppenraum beitreten",
@ -509,6 +572,7 @@
"app.breakout.dropdown.manageDuration": "Dauer ändern",
"app.breakout.dropdown.destroyAll": "Gruppenräume beenden",
"app.breakout.dropdown.options": "Gruppenraumoptionen",
"app.breakout.dropdown.manageUsers": "Benutzer verwalten",
"app.calculatingBreakoutTimeRemaining": "Berechne verbleibende Zeit...",
"app.audioModal.ariaTitle": "Audioteilnahmedialog",
"app.audioModal.microphoneLabel": "Mit Mikrofon",
@ -555,6 +619,7 @@
"app.audio.changeAudioDevice": "Audiogerät wechseln",
"app.audio.enterSessionLabel": "An Konferenz teilnehmen",
"app.audio.playSoundLabel": "Testton abspielen",
"app.audio.stopAudioFeedback": "Audio Feedback stoppen",
"app.audio.backLabel": "Zurück",
"app.audio.loading": "Laden",
"app.audio.microphones": "Mikrofone",
@ -567,10 +632,32 @@
"app.audio.audioSettings.testSpeakerLabel": "Lautsprecher testen",
"app.audio.audioSettings.microphoneStreamLabel": "Lautstärke des Audiosignals",
"app.audio.audioSettings.retryLabel": "Erneut versuchen",
"app.audio.audioSettings.fallbackInputLabel": "Audioeingabe {0}",
"app.audio.audioSettings.fallbackOutputLabel": "Audioausgabe {0}",
"app.audio.audioSettings.defaultOutputDeviceLabel": "Standard",
"app.audio.audioSettings.findingDevicesLabel": "Suche Geräte…",
"app.audio.listenOnly.backLabel": "Zurück",
"app.audio.listenOnly.closeLabel": "Schließen",
"app.audio.permissionsOverlay.title": "Zugriff auf das Mikrofon erlauben",
"app.audio.permissionsOverlay.hint": "Zugriff auf die Mediengeräte muss im Browser erlaubt werden, um an einer Audiokonferenz teilnehmen zu können.",
"app.audio.captions.button.start": "Untertitel anzeigen",
"app.audio.captions.button.stop": "Untertitel verbergen",
"app.audio.captions.button.language": "Sprache",
"app.audio.captions.button.transcription": "Transkription",
"app.audio.captions.button.transcriptionSettings": "Transkriptions-Einstellungen",
"app.audio.captions.speech.title": "automatische Transkription",
"app.audio.captions.speech.disabled": "Deaktiviert",
"app.audio.captions.speech.unsupported": "Dieser Browser unterstützt keine Spracherkennung. Ihr Audio wird nicht untertitelt.",
"app.audio.captions.select.de-DE": "Deutsch",
"app.audio.captions.select.en-US": "Englisch",
"app.audio.captions.select.es-ES": "Spanisch",
"app.audio.captions.select.fr-FR": "Französisch",
"app.audio.captions.select.hi-ID": "Hindi",
"app.audio.captions.select.it-IT": "Italienisch",
"app.audio.captions.select.ja-JP": "Japanisch",
"app.audio.captions.select.pt-BR": "Portugiesisch",
"app.audio.captions.select.ru-RU": "Russisch",
"app.audio.captions.select.zh-CN": "Chinesisch/Mandarin",
"app.error.removed": "Sie wurden aus der Konferenz entfernt",
"app.error.meeting.ended": "Sie haben die Konferenz verlassen",
"app.meeting.logout.duplicateUserEjectReason": "Bereits anwesender Teilnehmer versucht erneut der Konferenz beizutreten",
@ -578,6 +665,7 @@
"app.meeting.logout.ejectedFromMeeting": "Sie wurden aus der Konferenz entfernt",
"app.meeting.logout.validateTokenFailedEjectReason": "Verifikation des Autorisierungsmerkmals fehlgeschlagen",
"app.meeting.logout.userInactivityEjectReason": "Teilnehmer war zu lange inaktiv",
"app.meeting.logout.maxParticipantsReached": "Die maximal zulässige Teilnehmerzahl für diese Sitzung ist erreicht",
"app.meeting-ended.rating.legendLabel": "Feedbackbewertung",
"app.meeting-ended.rating.starLabel": "Stern",
"app.modal.close": "Schließen",
@ -599,8 +687,11 @@
"app.error.403": "Sie wurden aus der Konferenz entfernt",
"app.error.404": "Nicht gefunden",
"app.error.408": "Authentifizierung fehlgeschlagen",
"app.error.409": "Konflikt",
"app.error.410": "Die Konferenz ist zu Ende",
"app.error.500": "Ups, irgendwas ist schiefgelaufen",
"app.error.503": "Verbindung wurde getrennt",
"app.error.disconnected.rejoin": "Bitte Seite neu laden um wieder beizutreten.",
"app.error.userLoggedOut": "Teilnehmer hat einen ungültigen Konferenz-Token, weil er sich ausgeloggt hat",
"app.error.ejectedUser": "Teilnehmer hat einen ungültigen Konferenz-Token, weil er gesperrt wurde",
"app.error.joinedAnotherWindow": "Diese Konferenz scheint in einem anderen Browserfenster geöffnet zu sein.",
@ -644,14 +735,18 @@
"app.userList.guest.privateMessageLabel": "Nachricht",
"app.userList.guest.acceptLabel": "Akzeptieren",
"app.userList.guest.denyLabel": "Ablehnen",
"app.userList.guest.feedbackMessage": "Angewendet:",
"app.user-info.title": "Verzeichnissuche",
"app.toast.breakoutRoomEnded": "Gruppenraum wurde geschlossen. Bitte treten der Audiokonferenz erneut beitreten.",
"app.toast.chat.public": "Neue öffentliche Chatnachricht",
"app.toast.chat.private": "Neue private Chatnachricht",
"app.toast.chat.system": "System",
"app.toast.chat.poll": "Umfrageergebnisse",
"app.toast.chat.pollClick": "Umfrageergebnisse wurden veröffentlicht. Hier klicken, um sie anzusehen.",
"app.toast.clearedEmoji.label": "Emojistatus zurückgesetzt",
"app.toast.setEmoji.label": "Emojistatus auf {0} gesetzt",
"app.toast.meetingMuteOn.label": "Alle Teilnehmer wurden stummgeschaltet",
"app.toast.meetingMuteOnViewers.label": "Alle Teilnehmer wurden stummgeschaltet",
"app.toast.meetingMuteOff.label": "Konferenz-Stummschaltung ausgeschaltet",
"app.toast.setEmoji.raiseHand": "Sie haben Ihre Hand gehoben",
"app.toast.setEmoji.lowerHand": "Ihre Hand wurde gesenkt",
@ -688,6 +783,38 @@
"app.shortcut-help.toggleFullscreenKey": "Enter",
"app.shortcut-help.nextSlideKey": "Pfeil rechts",
"app.shortcut-help.previousSlideKey": "Pfeil links",
"app.shortcut-help.select": "Werkzeug auswählen",
"app.shortcut-help.pencil": "Stift",
"app.shortcut-help.eraser": "Radierer",
"app.shortcut-help.rectangle": "Rechteck",
"app.shortcut-help.elipse": "Ellipse",
"app.shortcut-help.triangle": "Dreieck",
"app.shortcut-help.line": "Linie",
"app.shortcut-help.arrow": "Pfeil",
"app.shortcut-help.text": "Text",
"app.shortcut-help.note": "Haftnotiz",
"app.shortcut-help.general": "Allgemein",
"app.shortcut-help.presentation": "Präsentation",
"app.shortcut-help.whiteboard": "Whiteboard",
"app.shortcut-help.zoomIn": "Vergrößern",
"app.shortcut-help.zoomOut": "Verkleinern",
"app.shortcut-help.zoomFit": "Zoom zurücksetzen",
"app.shortcut-help.zoomSelect": "Auf Auswahl zoomen",
"app.shortcut-help.flipH": "Horizontal wenden",
"app.shortcut-help.flipV": "Vertikal spiegeln",
"app.shortcut-help.lock": "Sperren / Entsperren",
"app.shortcut-help.moveToFront": "Ganz nach vorne bringen",
"app.shortcut-help.moveToBack": "Ganz nach hinten schieben",
"app.shortcut-help.moveForward": "Eine Ebene nach vorne",
"app.shortcut-help.moveBackward": "Eine Ebene nach hinten",
"app.shortcut-help.undo": "Rückgängig",
"app.shortcut-help.redo": "Wiederherstellen",
"app.shortcut-help.cut": "Ausschneiden",
"app.shortcut-help.copy": "Kopieren",
"app.shortcut-help.paste": "Einfügen",
"app.shortcut-help.selectAll": "Alles auswählen",
"app.shortcut-help.delete": "Löschen",
"app.shortcut-help.duplicate": "Duplizieren",
"app.lock-viewers.title": "Teilnehmerrechte einschränken",
"app.lock-viewers.description": "Diese Optionen ermöglichen es, bestimmte Funktionen für Teilnehmer einzuschränken.",
"app.lock-viewers.featuresLable": "Funktion",
@ -737,13 +864,19 @@
"app.connection-status.next": "Nächste Seite",
"app.connection-status.prev": "Vorherige Seite",
"app.learning-dashboard.label": "Lernanalyse-Dashboard",
"app.learning-dashboard.description": "Übersichtsseite mit Benutzeraktivitäten öffnen",
"app.learning-dashboard.description": "Dashboard mit Nutzeraktivitäten",
"app.learning-dashboard.clickHereToOpen": "Lernanalyse-Dashboard öffnen",
"app.recording.startTitle": "Aufzeichnung starten",
"app.recording.stopTitle": "Aufzeichnung pausieren",
"app.recording.resumeTitle": "Aufzeichnung fortsetzen",
"app.recording.startDescription": "Durch erneutes Drücken des Aufnahmeknopfs Aufnahme pausieren.",
"app.recording.stopDescription": "Aufnahme pausieren? Diese kann durch erneutes Drücken des Aufnahmeknopfs jederzeit fortgesetzt werden.",
"app.recording.notify.title": "Aufzeichnung hat begonnen",
"app.recording.notify.description": "Eine Aufzeichnung der restlichen Sitzung wird verfügbar sein",
"app.recording.notify.continue": "Fortsetzen",
"app.recording.notify.leave": "Konferenz verlassen",
"app.recording.notify.continueLabel" : "Aufzeichnung akzeptieren und fortsetzen",
"app.recording.notify.leaveLabel" : "Aufzeichnung nicht akzeptieren und Konferenz verlassen",
"app.videoPreview.cameraLabel": "Kamera",
"app.videoPreview.profileLabel": "Qualität",
"app.videoPreview.quality.low": "Niedrige",
@ -760,13 +893,20 @@
"app.videoPreview.webcamOptionLabel": "Webcam auswählen",
"app.videoPreview.webcamPreviewLabel": "Webcamvorschau",
"app.videoPreview.webcamSettingsTitle": "Webcameinstellungen",
"app.videoPreview.webcamEffectsTitle": "Grafische Effekte für Webcam",
"app.videoPreview.webcamVirtualBackgroundLabel": "Einstellungen zum virtuellen Hintergrund",
"app.videoPreview.webcamVirtualBackgroundDisabledLabel": "Dieses Gerät unterstützt keine virtuellen Hintergründe",
"app.videoPreview.webcamNotFoundLabel": "Keine Webcam gefunden",
"app.videoPreview.profileNotFoundLabel": "Keine unterstützten Kameraprofile",
"app.videoPreview.brightness": "Helligkeit",
"app.videoPreview.wholeImageBrightnessLabel": "Ganzes Bild",
"app.videoPreview.wholeImageBrightnessDesc": "Wendet Helligkeit auf Stream und Hintergrundbild an",
"app.videoPreview.sliderDesc": "Helligkeitsstufen regeln",
"app.video.joinVideo": "Webcam freigeben",
"app.video.connecting": "Webcamfreigabe wird gestartet ...",
"app.video.leaveVideo": "Webcamfreigabe beenden",
"app.video.videoSettings": "Videoeinstellungen",
"app.video.visualEffects": "Grafische Effekte",
"app.video.advancedVideo": "Erweiterte Einstellungen öffnen",
"app.video.iceCandidateError": "Fehler beim Hinzufügen vom ice candidate",
"app.video.iceConnectionStateError": "Verbindungsfehler (Fehler 1107)",
@ -782,6 +922,7 @@
"app.video.notReadableError": "Konnte nicht auf die Webcam zugreifen. Bitte prüfen, dass kein anderes Programm auf die Webcam zugreift",
"app.video.timeoutError": "Der Browser hat nicht rechtzeitig reagiert.",
"app.video.genericError": "Ein unbekannter Fehler ist mit der Kamera aufgetreten (Fehler {0})",
"app.video.inactiveError": "Die Webcam stoppte unerwartet. Bitte die Browserbrechtigungen prüfen.",
"app.video.mediaTimedOutError": "Ihre Webcam-Freigabe wurde unterbrochen. Bitte erneut starten.",
"app.video.mediaFlowTimeout1020": "Verbindung zum Server konnte nicht hergestellt werden (Fehler 1020)",
"app.video.suggestWebcamLock": "Sperrung der Teilnehmerwebcams aktivieren?",
@ -804,8 +945,17 @@
"app.video.virtualBackground.board": "Tafel",
"app.video.virtualBackground.coffeeshop": "Café",
"app.video.virtualBackground.background": "Hintergrund",
"app.video.virtualBackground.backgroundWithIndex": "Hintergrund {0}",
"app.video.virtualBackground.custom": "Vom Gerät hochladen",
"app.video.virtualBackground.remove": "Hinzugefügtes Bild entfernen",
"app.video.virtualBackground.genericError": "Virtueller Hintergrund konnte nicht angewendet werden. Bitte erneut versuchen.",
"app.video.virtualBackground.camBgAriaDesc": "Setzt den virtuellen Hintergrund der Webcam auf {0}",
"app.video.virtualBackground.maximumFileSizeExceeded": "Maximale Dateigröße von {0} MB überschritten.",
"app.video.virtualBackground.typeNotAllowed": "Dateityp nicht erlaubt.",
"app.video.virtualBackground.errorOnRead": "Etwas ist beim Verarbeitung der Datei schiefgelaufen.",
"app.video.virtualBackground.uploaded": "Hochgeladen",
"app.video.virtualBackground.uploading": "Lade hoch…",
"app.video.virtualBackground.button.customDesc": "Fügt ein neues virtuelles Hintergrundbild hinzu.",
"app.video.camCapReached": "Sie können keine weiteren Kameras freigeben",
"app.video.meetingCamCapReached": "Konferenz hat die maximale Anzahl gleichzeitiger Kameras erreicht",
"app.video.dropZoneLabel": "Hier loslassen",
@ -826,6 +976,7 @@
"app.whiteboard.annotations.poll": "Umfrageergebnisse wurden veröffentlicht",
"app.whiteboard.annotations.pollResult": "Umfrageergebnis",
"app.whiteboard.annotations.noResponses": "Keine Antworten",
"app.whiteboard.annotations.notAllowed": "Keine Berechtigung für diese Änderung",
"app.whiteboard.toolbar.tools": "Werkzeuge",
"app.whiteboard.toolbar.tools.hand": "Verschieben",
"app.whiteboard.toolbar.tools.pencil": "Stift",
@ -852,6 +1003,7 @@
"app.whiteboard.toolbar.color.silver": "Silber",
"app.whiteboard.toolbar.undo": "Anmerkung zurücknehmen",
"app.whiteboard.toolbar.clear": "Alle Anmerkungen löschen",
"app.whiteboard.toolbar.clearConfirmation": "Sollen sämtliche Anmerkungen wirklich gelöscht werden?",
"app.whiteboard.toolbar.multiUserOn": "Mehrbenutzermodus starten",
"app.whiteboard.toolbar.multiUserOff": "Mehrbenutzermodus beenden",
"app.whiteboard.toolbar.palmRejectionOn": "Handballenerkennung einschalten",
@ -871,13 +1023,13 @@
"app.videoDock.webcamUnfocusDesc": "Ausgewählte Webcam auf Normalgröße verkleinern",
"app.videoDock.webcamPinLabel": "Anheften",
"app.videoDock.webcamPinDesc": "Ausgewählte Webcam anheften",
"app.videoDock.webcamFullscreenLabel": "Webcam als Vollbild",
"app.videoDock.webcamSqueezedButtonLabel": "Webcameinstellungen",
"app.videoDock.webcamUnpinLabel": "Lösen",
"app.videoDock.webcamUnpinLabelDisabled": "Nur Moderatoren können Teilnehmer lösen",
"app.videoDock.webcamUnpinDesc": "Ausgewählte Webcam lösen",
"app.videoDock.autoplayBlockedDesc": "Wir benötigen Ihre Zustimmung, um Ihnen die Webcams anderer Teilnehmer zu zeigen.",
"app.videoDock.autoplayAllowLabel": "Webcams zeigen",
"app.invitation.title": "Gruppenraumeinladung",
"app.invitation.confirm": "Einladen",
"app.createBreakoutRoom.title": "Gruppenräume",
"app.createBreakoutRoom.ariaTitle": "Gruppenräume verbergen",
"app.createBreakoutRoom.breakoutRoomLabel": "Gruppenräume {0}",
@ -909,6 +1061,8 @@
"app.createBreakoutRoom.addRoomTime": "Gruppenraumzeit erhöhen auf",
"app.createBreakoutRoom.addParticipantLabel": "+ Teilnehmer hinzufügen",
"app.createBreakoutRoom.freeJoin": "Den Teilnehmern erlauben, sich selbst einen Gruppenraum auszusuchen.",
"app.createBreakoutRoom.captureNotes": "Übertragen der gemeinsamen Notizen nach Beendigung der Arbeitsgruppenräume",
"app.createBreakoutRoom.captureSlides": "Whiteboard erfassen, wenn Breakout-Räume enden",
"app.createBreakoutRoom.leastOneWarnBreakout": "Jedem Gruppenraum muss wenigstens ein Teilnehmer zugeordnet sein.",
"app.createBreakoutRoom.minimumDurationWarnBreakout": "Die Mindestdauer für einen Gruppenraum beträgt {0} Minuten.",
"app.createBreakoutRoom.modalDesc": "Tipp: Sie können die Teilnehmer per Drag-and-Drop einem bestimmten Gruppenraum zuweisen.",
@ -921,6 +1075,14 @@
"app.createBreakoutRoom.setTimeCancel": "Abbrechen",
"app.createBreakoutRoom.setTimeHigherThanMeetingTimeError": "Die Dauer der Gruppenräume darf die verbleibende Zeit der Konferenz nicht überschreiten.",
"app.createBreakoutRoom.roomNameInputDesc": "Gruppenraumname ändern",
"app.createBreakoutRoom.movedUserLabel": "{0} in Raum {1} verschoben.",
"app.updateBreakoutRoom.modalDesc": "Um einen Teilnehmer zu aktualisieren oder einzuladen, ziehen Sie ihn einfach in den gewünschten Raum.",
"app.updateBreakoutRoom.cancelLabel": "Abbrechen",
"app.updateBreakoutRoom.title": "Gruppenräume aktualisieren",
"app.updateBreakoutRoom.confirm": "Anwenden",
"app.updateBreakoutRoom.userChangeRoomNotification": "Du wurdest in Raum {0} verschoben.",
"app.smartMediaShare.externalVideo": "Externe Video(s)",
"app.update.resetRoom": "Nutzerraum zurücksetzen",
"app.externalVideo.start": "Neues Video teilen",
"app.externalVideo.title": "Externes Video teilen",
"app.externalVideo.input": "Externe Video-URL",
@ -946,6 +1108,15 @@
"app.debugWindow.form.enableAutoarrangeLayoutDescription": "(es wird deaktiviert, wenn der Webcambereich gezogen oder in der Größe verändert wird)",
"app.debugWindow.form.chatLoggerLabel": "Test der Chatprotokollierungsstufen",
"app.debugWindow.form.button.apply": "Anwenden",
"app.layout.modal.title": "Layouts",
"app.layout.modal.confirm": "Bestätigen",
"app.layout.modal.cancel": "Abbrechen",
"app.layout.modal.layoutLabel": "Layout auswählen",
"app.layout.modal.keepPushingLayoutLabel": "Layout bei allen anwenden",
"app.layout.modal.pushLayoutLabel": "An alle verteilen",
"app.layout.modal.layoutToastLabel": "Layouteinstellungen geändert",
"app.layout.modal.layoutSingular": "Layout",
"app.layout.modal.layoutBtnDesc": "Legt Layout als ausgewählte Option fest",
"app.layout.style.custom": "Benutzerdefiniertes Layout",
"app.layout.style.smart": "Automatisches Layout",
"app.layout.style.presentationFocus": "Präsentation im Zentrum",
@ -995,6 +1166,7 @@
"playback.player.thumbnails.wrapper.aria": "Vorschaubildbereich",
"playback.player.webcams.wrapper.aria": "Webcambereich",
"app.learningDashboard.dashboardTitle": "Lernanalyse-Dashboard",
"app.learningDashboard.bigbluebuttonTitle": "BigBlueButton",
"app.learningDashboard.downloadSessionDataLabel": "Konferenzdaten herunterladen",
"app.learningDashboard.lastUpdatedLabel": "Zuletzt aktualisiert um",
"app.learningDashboard.sessionDataDownloadedLabel": "Heruntergeladen!",
@ -1019,6 +1191,12 @@
"app.learningDashboard.userDetails.response": "Antwort",
"app.learningDashboard.userDetails.mostCommonAnswer": "Häufigste Antwort",
"app.learningDashboard.userDetails.anonymousAnswer": "Anonyme Umfrage",
"app.learningDashboard.userDetails.talkTime": "Sprechzeit",
"app.learningDashboard.userDetails.messages": "Nachrichten",
"app.learningDashboard.userDetails.emojis": "Emojis",
"app.learningDashboard.userDetails.raiseHands": "Hand heben",
"app.learningDashboard.userDetails.pollVotes": "Abstimmungen",
"app.learningDashboard.userDetails.onlineIndicator": "{0} Online-Zeit",
"app.learningDashboard.usersTable.title": "Übersicht",
"app.learningDashboard.usersTable.colOnline": "Onlinezeit",
"app.learningDashboard.usersTable.colTalk": "Redezeit",
@ -1042,8 +1220,13 @@
"app.learningDashboard.pollsTable.anonymousRowName": "Anonym",
"app.learningDashboard.pollsTable.noPollsCreatedHeading": "Es wurden keine Umfragen erstellt",
"app.learningDashboard.pollsTable.noPollsCreatedMessage": "Sobald eine Umfrage an die Teilnehmer gesendet wurde, werden die Ergebnisse in dieser Liste angezeigt.",
"app.learningDashboard.pollsTable.answerTotal": "Insgesamt",
"app.learningDashboard.pollsTable.userLabel": "Teilnehmer",
"app.learningDashboard.statusTimelineTable.title": "Zeitverlauf",
"app.learningDashboard.statusTimelineTable.thumbnail": "Vorschaubild der Präsentation",
"app.learningDashboard.statusTimelineTable.presentation": "Präsentation",
"app.learningDashboard.statusTimelineTable.pageNumber": "Seite",
"app.learningDashboard.statusTimelineTable.setAt": "Setzen bei",
"app.learningDashboard.errors.invalidToken": "Ungültiger Konferenz-Token",
"app.learningDashboard.errors.dataUnavailable": "Die Daten sind nicht mehr verfügbar",
"mobileApp.portals.list.empty.addFirstPortal.label": "Fügen Sie Ihr erstes Portal über die Schaltfläche oben hinzu,",
@ -1057,6 +1240,4 @@
"mobileApp.portals.addPortalPopup.validation.emptyFields": "Benötigte Felder",
"mobileApp.portals.addPortalPopup.validation.portalNameAlreadyExists": "Name existiert bereits",
"mobileApp.portals.addPortalPopup.validation.urlInvalid": "Fehler beim Laden der Seite - URL und Netzwerkverbindung prüfen"
}

View File

@ -652,7 +652,7 @@
"app.audio.captions.select.en-US": "English",
"app.audio.captions.select.es-ES": "Spanish",
"app.audio.captions.select.fr-FR": "French",
"app.audio.captions.select.hi-ID": "Indian",
"app.audio.captions.select.hi-ID": "Hindi",
"app.audio.captions.select.it-IT": "Italian",
"app.audio.captions.select.ja-JP": "Japanese",
"app.audio.captions.select.pt-BR": "Portuguese",
@ -798,9 +798,9 @@
"app.shortcut-help.whiteboard": "Whiteboard",
"app.shortcut-help.zoomIn": "Zoom In",
"app.shortcut-help.zoomOut": "Zoom Out",
"app.shortcut-help.zoomFit": "Zoom to Fit",
"app.shortcut-help.zoomFit": "Reset Zoom",
"app.shortcut-help.zoomSelect": "Zoom to Selection",
"app.shortcut-help.flipH": "Flip Horozontal",
"app.shortcut-help.flipH": "Flip Horizontal",
"app.shortcut-help.flipV": "Flip Vertical",
"app.shortcut-help.lock": "Lock / Unlock",
"app.shortcut-help.moveToFront": "Move to Front",
@ -900,7 +900,7 @@
"app.videoPreview.profileNotFoundLabel": "No supported camera profile",
"app.videoPreview.brightness": "Brightness",
"app.videoPreview.wholeImageBrightnessLabel": "Whole image",
"app.videoPreview.wholeImageBrightnessDesc": "Applies brighteness to stream and background image",
"app.videoPreview.wholeImageBrightnessDesc": "Applies brightness to stream and background image",
"app.videoPreview.sliderDesc": "Increase or decrease levels of brightness",
"app.video.joinVideo": "Share webcam",
"app.video.connecting": "Webcam sharing is starting ...",

View File

@ -2,10 +2,11 @@
"app.home.greeting": "Su presentación se iniciará pronto...",
"app.chat.submitLabel": "Enviar mensaje",
"app.chat.loading": "Mensajes de chat cargados: {0}%",
"app.chat.errorMaxMessageLength": "El mensaje es {0} carácter(es) más largo de lo esperado",
"app.chat.errorMaxMessageLength": "El mensaje es demasiado largo, excedió el máximo de {0} caracteres",
"app.chat.disconnected": "Está desconectado, los mensajes no pueden ser enviados",
"app.chat.locked": "Chat bloqueado, los mensajes no pueden ser enviados",
"app.chat.inputLabel": "Entrada de mensaje para chat {0}",
"app.chat.emojiButtonLabel": "Selector de emojis",
"app.chat.inputPlaceholder": "Mensaje {0}",
"app.chat.titlePublic": "Chat público",
"app.chat.titlePrivate": "Chat privado con {0}",
@ -21,6 +22,7 @@
"app.chat.offline": "Desconectado",
"app.chat.pollResult": "Resultados de la encuesta/votación",
"app.chat.breakoutDurationUpdated": "La duración del grupo de trabajo es ahora de {0} minutos",
"app.chat.breakoutDurationUpdatedModerator": "El tiempo de las salas de reuniones ahora es de {0} minutos, y se ha enviado una notificación.",
"app.chat.emptyLogLabel": "Registro de chat vacío",
"app.chat.clearPublicChatMessage": "El chat público fue borrado por un moderador",
"app.chat.multi.typing": "Varios usuarios están escribiendo",
@ -28,6 +30,27 @@
"app.chat.two.typing": "{0} y {1} están escribiendo",
"app.chat.copySuccess": "Transcripción de chat copiada",
"app.chat.copyErr": "Copiar la transcripción del chat ha fallado",
"app.emojiPicker.search": "Buscar",
"app.emojiPicker.notFound": " No se encontraron emojis",
"app.emojiPicker.skintext": " Elige tu tono de piel predeterminado",
"app.emojiPicker.clear": "Limpiar",
"app.emojiPicker.categories.label": "Categorías de los emojis",
"app.emojiPicker.categories.people": "Personas y cuerpo",
"app.emojiPicker.categories.nature": "Animales y Naturaleza",
"app.emojiPicker.categories.foods": "Comida y bebida",
"app.emojiPicker.categories.places": "Viajes y lugares",
"app.emojiPicker.categories.activity": "Actividad",
"app.emojiPicker.categories.objects": "Objetos",
"app.emojiPicker.categories.symbols": "Símbolos",
"app.emojiPicker.categories.flags": "Banderas",
"app.emojiPicker.categories.recent": "Usados frecuentemente",
"app.emojiPicker.categories.search": "Resultados de la búsqueda",
"app.emojiPicker.skintones.1": " Tono de piel predeterminado",
"app.emojiPicker.skintones.2": "Tono de piel claro",
"app.emojiPicker.skintones.3": "Tono de piel medio-claro",
"app.emojiPicker.skintones.4": "Tono de piel medio",
"app.emojiPicker.skintones.5": "Tono de piel medio-oscuro",
"app.emojiPicker.skintones.6": "Tono de piel oscuro",
"app.captions.label": "Subtítulos",
"app.captions.menu.close": "Cerrar",
"app.captions.menu.start": "Iniciar",
@ -53,12 +76,21 @@
"app.captions.speech.start": "Reconocimiento de voz iniciado",
"app.captions.speech.stop": "Reconocimiento de voz detenido",
"app.captions.speech.error": "Reconocimiento de voz detenido debido a incompatibilidad con el navegador o algún tiempo de silencio",
"app.confirmation.skipConfirm": "No preguntar de nuevo",
"app.confirmation.virtualBackground.title": "Comenzar nuevo fondo virtual",
"app.confirmation.virtualBackground.description": "{0} se añadirá como fondo virtual. ¿Continuar?",
"app.confirmationModal.yesLabel": "Sí",
"app.textInput.sendLabel": "Enviar",
"app.title.defaultViewLabel": "Vista de presentación predeterminada",
"app.notes.title": "Notas compartidas",
"app.notes.label": "Notas",
"app.notes.hide": "Ocultar notas",
"app.notes.locked": "Bloqueado",
"app.notes.disabled": "Fijado en el área de medios",
"app.notes.notesDropdown.covertAndUpload": "Convertir notas en presentación",
"app.notes.notesDropdown.pinNotes": "Fijar notas en la pizarra",
"app.notes.notesDropdown.unpinNotes": "Desanclar notas",
"app.notes.notesDropdown.notesOptions": "Opciones de notas",
"app.pads.hint": "Pulsa Esc para enfocar la barra de herramientas del pad",
"app.user.activityCheck": "Comprobar actividad del usuario",
"app.user.activityCheck.label": "Comprobar si el usuario continúa en la reunión ({0})",
@ -170,7 +202,7 @@
"app.presentation.endSlideContent": "Fin del pase de diapositivas",
"app.presentation.changedSlideContent": "Presentación cambiada a diapositiva: {0}",
"app.presentation.emptySlideContent": "Diapositiva actual sin contenido",
"app.presentation.options.fullscreen": "Pantalla completa",
"app.presentation.options.fullscreen": "Presentación a pantalla completa",
"app.presentation.options.exitFullscreen": "Salir de pantalla completa",
"app.presentation.options.minimize": "Minimizar",
"app.presentation.options.snapshot": "Realizar instantánea de la diapositiva actual",
@ -203,7 +235,18 @@
"app.presentation.presentationToolbar.goToSlide": "Diapositiva {0}",
"app.presentation.placeholder": "No hay actualmente una presentación activa",
"app.presentationUploder.title": "Presentación",
"app.presentationUploder.message": "Como presentador tiene la habilidad de subir cualquier documento ofimático o PDF. Le recomendamos el formato PDF para obtener los mejores resultados. Por favor asegúrese de que la presentación está seleccionada usando el selector circular en la parte derecha.",
"app.presentationUploder.message": "Como presentador, tiene la posibilidad de cargar cualquier documento de oficina o archivo PDF. Se recomienda el archivo PDF para obtener los mejores resultados. Asegúrese de seleccionar una presentación usando la casilla de verificación círcular en el lado izquierdo.",
"app.presentationUploader.exportHint": "Al seleccionar \"Enviar al chat\", los usuarios recibirán un enlace en el chat público para descargar las anotaciones .",
"app.presentationUploader.exportToastHeader": "Enviando al chat (elemento {0})",
"app.presentationUploader.exportToastHeaderPlural": "Enviando al chat ({0} elementos)",
"app.presentationUploader.exporting": "Enviando al chat",
"app.presentationUploader.sending": "Enviando...",
"app.presentationUploader.collecting": "Extrayendo la diapositiva {0} de {1}...",
"app.presentationUploader.processing": "Anotando la diapositiva {0} de {1}...",
"app.presentationUploader.sent": "Enviado",
"app.presentationUploader.exportingTimeout": "La exportación está tardando demasiado...",
"app.presentationUploader.export": "Enviar al chat",
"app.presentationUploader.currentPresentationLabel": "Presentación actual",
"app.presentationUploder.extraHint": "IMPORTANTE: cada fichero no puede exceder {0} MB y {1} páginas",
"app.presentationUploder.uploadLabel": "Cargar",
"app.presentationUploder.confirmLabel": "Confirmar",
@ -214,6 +257,8 @@
"app.presentationUploder.dropzoneImagesLabel": "Arrastrar imágenes aquí para cargarlas",
"app.presentationUploder.browseFilesLabel": "o buscar archivos",
"app.presentationUploder.browseImagesLabel": "o buscar imagenes",
"app.presentationUploder.externalUploadTitle": "Agregar contenido desde una aplicación de terceros",
"app.presentationUploder.externalUploadLabel": "Buscar ficheros",
"app.presentationUploder.fileToUpload": "En proceso de ser cargado ...",
"app.presentationUploder.currentBadge": "Actual",
"app.presentationUploder.rejectedError": "El(los) archivo(s) seleccionado(s) ha(n) sido rechazado(s). Por favor, revise el(los) tipo(s) de archivo.",
@ -230,14 +275,14 @@
"app.presentationUploder.conversion.generatedSlides": "Diapositivas han sido generadas ...",
"app.presentationUploder.conversion.generatingSvg": "Generando imágenes SVG ...",
"app.presentationUploder.conversion.pageCountExceeded": "El número de páginas excede el máximo de {0}",
"app.presentationUploder.conversion.invalidMimeType": "Formato no válido detectado (extensión={0}, tipo de contenido={1})",
"app.presentationUploder.conversion.conversionTimeout": "La diapositiva {0} no se pudo procesar en {1} intentos.",
"app.presentationUploder.conversion.officeDocConversionInvalid": "Error en procesar el documento de Office. Por favor, suba un archivo PDF en su lugar.",
"app.presentationUploder.conversion.officeDocConversionFailed": "Error en procesar el documento de Office. Por favor, suba un archivo PDF en su lugar.",
"app.presentationUploder.conversion.pdfHasBigPage": "No se pudo convertir el archivo PDF. Por favor, intente optimizarlo. Máximo número de páginas {0}",
"app.presentationUploder.conversion.timeout": "La conversión tomó demasiado tiempo ...",
"app.presentationUploder.conversion.pageCountFailed": "Error en determinar el número de páginas.",
"app.presentationUploder.conversion.unsupportedDocument": "Extensión (tipo) de archivo no soportado",
"app.presentationUploder.isDownloadableLabel": "No se permite la descarga de la presentación - click para permitir descargar la presentación",
"app.presentationUploder.isNotDownloadableLabel": "Se permite descargar la presentación - click para denegar la descarga de la presentación",
"app.presentationUploder.removePresentationLabel": "Borrar presentación",
"app.presentationUploder.setAsCurrentPresentation": "Establecer presentación como actual",
"app.presentationUploder.tableHeading.filename": "Nombre de archivo",
@ -251,6 +296,10 @@
"app.presentationUploder.clearErrors": "Limpiar errores",
"app.presentationUploder.clearErrorsDesc": "Limpiar las presentaciones cuya subida ha fallado",
"app.presentationUploder.uploadViewTitle": "Subir presentación",
"app.poll.questionAndoptions.label" : "Texto de la pregunta que se mostrará.\nA. Opción de encuesta\nB. Opción de encuesta (opcional)\nC. Opción de encuesta (opcional)\nD. Opción de encuesta (opcional )\nE. Opción de encuesta (opcional)",
"app.poll.customInput.label": "Entrada personalizada",
"app.poll.customInputInstructions.label": "La entrada personalizada está habilitada: escriba la pregunta de la encuesta y las opciones en el formato dado o arrastre y suelte un archivo de texto en el mismo formato.",
"app.poll.maxOptionsWarning.label": "¡Solo se pueden usar las primeras 5 opciones!",
"app.poll.pollPaneTitle": "Encuesta",
"app.poll.enableMultipleResponseLabel": "¿Permitir múltiples respuestas por cada persona?",
"app.poll.quickPollTitle": "Encuesta rápida",
@ -270,7 +319,7 @@
"app.poll.clickHereToSelect": "'Click' aquí para seleccionar",
"app.poll.question.label" : "Escribe tu pregunta...",
"app.poll.optionalQuestion.label" : "Escribe tu pregunta (opcional)...",
"app.poll.userResponse.label" : "Respuesta del usuario",
"app.poll.userResponse.label" : "Respuesta escrita",
"app.poll.responseTypes.label" : "Tipos de respuesta",
"app.poll.optionDelete.label" : "Borrar",
"app.poll.responseChoices.label" : "Opciones de respuesta",
@ -329,7 +378,7 @@
"app.muteWarning.disableMessage": "Silenciar alertas inhabilitadas hasta dejar de silenciar",
"app.muteWarning.tooltip": "Haga clic para cerrar y deshabilitar la advertencia hasta la próxima activación del sonido",
"app.navBar.settingsDropdown.optionsLabel": "Opciones",
"app.navBar.settingsDropdown.fullscreenLabel": "Desplegar a pantalla completa",
"app.navBar.settingsDropdown.fullscreenLabel": "Aplicación a pantalla completa",
"app.navBar.settingsDropdown.settingsLabel": "Abrir configuración",
"app.navBar.settingsDropdown.aboutLabel": "Acerca de",
"app.navBar.settingsDropdown.leaveSessionLabel": "Abandonar la reunión",
@ -342,6 +391,7 @@
"app.navBar.settingsDropdown.hotkeysLabel": "Atajos de teclado",
"app.navBar.settingsDropdown.hotkeysDesc": "Listado de atajos de teclado disponibles",
"app.navBar.settingsDropdown.helpLabel": "Ayuda",
"app.navBar.settingsDropdown.openAppLabel": "Abrir en la aplicación BigBlueButton Tablet",
"app.navBar.settingsDropdown.helpDesc": "Enlaces a videotutoriales (abre una nueva pestaña)",
"app.navBar.settingsDropdown.endMeetingDesc": "Finaliza la sesión actual",
"app.navBar.settingsDropdown.endMeetingLabel": "Finalizar sesión",
@ -359,7 +409,7 @@
"app.endMeeting.description": "Esta acción finalizará la sesión para {0} usuarios activos. ¿Está seguro de querer finalizar esta sesión?",
"app.endMeeting.noUserDescription": "¿Está seguro/a de querer terminar esta sesión?",
"app.endMeeting.contentWarning": "Ya no se podrá acceder directamente a los mensajes de chat, las notas compartidas, el contenido de la pizarra y los documentos compartidos de esta sesión.",
"app.endMeeting.yesLabel": "",
"app.endMeeting.yesLabel": "Finalizar la sesión para todos los usuarios",
"app.endMeeting.noLabel": "No",
"app.about.title": "Acerca de",
"app.about.version": "Versión del cliente:",
@ -369,6 +419,15 @@
"app.about.confirmDesc": "OK",
"app.about.dismissLabel": "Cancelar",
"app.about.dismissDesc": "Cerrar información acerca del cliente",
"app.mobileAppModal.title": "Abrir la aplicación Bigbluebutton Tablet.",
"app.mobileAppModal.description": "¿Tienes la aplicación Bigbluebutton Tablet instalada en tu dispositivo?",
"app.mobileAppModal.openApp": "Sí, abrir la app ahora.",
"app.mobileAppModal.obtainUrlMsg": "Obteniendo URL de la reunión",
"app.mobileAppModal.obtainUrlErrorMsg": "Error al tratar de obtener la URL de la reunión",
"app.mobileAppModal.openStore": "No, abre la App Store para descargarla",
"app.mobileAppModal.dismissLabel": "Cancelar",
"app.mobileAppModal.dismissDesc": "Cerrar",
"app.mobileAppModal.userConnectedWithSameId": "El usuario {0} acaba de conectarse con el mismo ID que usted.",
"app.actionsBar.changeStatusLabel": "Cambiar estado",
"app.actionsBar.muteLabel": "Deshabilitar audio",
"app.actionsBar.unmuteLabel": "Habilitar audio",
@ -379,10 +438,12 @@
"app.actionsBar.actionsDropdown.restorePresentationDesc": "Botón para restaurar la presentación después de haber sido minimizada",
"app.actionsBar.actionsDropdown.minimizePresentationLabel": "Minimizar presentación",
"app.actionsBar.actionsDropdown.minimizePresentationDesc": "Botón usado para minimizar presentación",
"app.actionsBar.actionsDropdown.layoutModal": "Configuración del diseño",
"app.screenshare.screenShareLabel" : "Compartir pantalla",
"app.submenu.application.applicationSectionTitle": "Aplicación",
"app.submenu.application.animationsLabel": "Animaciones",
"app.submenu.application.audioFilterLabel": "Filtros de audio para el micrófono",
"app.submenu.application.darkThemeLabel": "Modo oscuro",
"app.submenu.application.fontSizeControlLabel": "Tamaño de fuente",
"app.submenu.application.increaseFontBtnLabel": "Incrementar tamaño de fuente",
"app.submenu.application.decreaseFontBtnLabel": "Reducir tamaño de fuente",
@ -392,6 +453,7 @@
"app.submenu.application.noLocaleOptionLabel": "No hay locales activos",
"app.submenu.application.paginationEnabledLabel": "Paginación de vídeo",
"app.submenu.application.layoutOptionLabel": "Tipo de diseño",
"app.submenu.application.pushLayoutLabel": "Forzar diseño",
"app.submenu.notification.SectionTitle": "Notificaciones",
"app.submenu.notification.Desc": "Defina cómo y de qué será notificado.",
"app.submenu.notification.audioAlertLabel": "Alertas audibles",
@ -420,7 +482,7 @@
"app.settings.main.save.label.description": "Gurada cambios y cierra el menú de configuración",
"app.settings.dataSavingTab.label": "Ahorro de datos",
"app.settings.dataSavingTab.webcam": "Habilitar webcams",
"app.settings.dataSavingTab.screenShare": "Habilitar escritorio compartido",
"app.settings.dataSavingTab.screenShare": "Permitir que otros participantes compartan el escritorio",
"app.settings.dataSavingTab.description": "Para ahorrar ancho de banda ajusta lo que se se está mostrando",
"app.settings.save-notification.label": "La configuración se ha guardado",
"app.statusNotifier.lowerHands": "Manos bajadas",
@ -440,7 +502,6 @@
"app.actionsBar.actionsDropdown.presentationLabel": "Gestionar presentaciones",
"app.actionsBar.actionsDropdown.initPollLabel": "Iniciar una encuesta",
"app.actionsBar.actionsDropdown.desktopShareLabel": "Compartir tu pantalla",
"app.actionsBar.actionsDropdown.lockedDesktopShareLabel": "Compartir pantalla está bloqueado",
"app.actionsBar.actionsDropdown.stopDesktopShareLabel": "Dejar de compartir tu pantalla",
"app.actionsBar.actionsDropdown.presentationDesc": "Subir tu presentación",
"app.actionsBar.actionsDropdown.initPollDesc": "Iniciar una encuesta",
@ -457,6 +518,7 @@
"app.actionsBar.actionsDropdown.takePresenterDesc": "Asignarte a ti mismo el rol de presentador",
"app.actionsBar.actionsDropdown.selectRandUserLabel": "Seleccionar usuario al azar",
"app.actionsBar.actionsDropdown.selectRandUserDesc": "Elige a un usuario al azar entre los espectadores",
"app.actionsBar.actionsDropdown.propagateLayoutLabel": "Propagar el diseño",
"app.actionsBar.emojiMenu.statusTriggerLabel": "Establecer estado",
"app.actionsBar.emojiMenu.awayLabel": "Ausente",
"app.actionsBar.emojiMenu.awayDesc": "Cambiar tu estado a ausente",
@ -496,6 +558,7 @@
"app.audioNotification.audioFailedError1012": "Conexión cerrada (ICE error 1012)",
"app.audioNotification.audioFailedMessage": "Tu conexión de audio falló en conectarse",
"app.audioNotification.mediaFailedMessage": "getUserMicMedia falló porque sólo se admiten orígenes seguros",
"app.audioNotification.deviceChangeFailed": "Falló el cambio de dispositivo de audio. Compruebe si el dispositivo elegido está correctamente configurado y disponible",
"app.audioNotification.closeLabel": "Cerrar",
"app.audioNotificaion.reconnectingAsListenOnly": "El micrófono ha sido bloqueado para todos los espectadores, tu conexión es en modo 'solo escuchar'",
"app.breakoutJoinConfirmation.title": "Ingresar a un grupo de trabajo",
@ -509,6 +572,7 @@
"app.breakout.dropdown.manageDuration": "Cambiar duración",
"app.breakout.dropdown.destroyAll": "Finalizar grupos de trabajo",
"app.breakout.dropdown.options": "Opciones de las salas de grupos de trabajo",
"app.breakout.dropdown.manageUsers": "Gestionar usuarios",
"app.calculatingBreakoutTimeRemaining": "Calculando tiempo restante ...",
"app.audioModal.ariaTitle": "Unirse en modo audio",
"app.audioModal.microphoneLabel": "Micrófono",
@ -555,6 +619,7 @@
"app.audio.changeAudioDevice": "Cambiar dispositivo de audio",
"app.audio.enterSessionLabel": "Entrar a la sesión",
"app.audio.playSoundLabel": "Reproducir sonido",
"app.audio.stopAudioFeedback": "Detener retroalimentación de audio",
"app.audio.backLabel": "Atrás",
"app.audio.loading": "Cargando",
"app.audio.microphones": "Micrófonos",
@ -567,10 +632,32 @@
"app.audio.audioSettings.testSpeakerLabel": "Comprobar tu altavoz",
"app.audio.audioSettings.microphoneStreamLabel": "Tu volúmen del flujo de audio",
"app.audio.audioSettings.retryLabel": "Intentar de nuevo",
"app.audio.audioSettings.fallbackInputLabel": "Entrada de audio {0}",
"app.audio.audioSettings.fallbackOutputLabel": "Salida de audio {0}",
"app.audio.audioSettings.defaultOutputDeviceLabel": "Por defecto",
"app.audio.audioSettings.findingDevicesLabel": "Encontrando dispositivos...",
"app.audio.listenOnly.backLabel": "Atrás",
"app.audio.listenOnly.closeLabel": "Cerrar",
"app.audio.permissionsOverlay.title": "Permitir acceso a tu micrófono",
"app.audio.permissionsOverlay.hint": "Necesitamos tu autorización para acceder tus dipositivos de medios para poder ingresar a la conferencia de voz :)",
"app.audio.captions.button.start": "Iniciar subtítulos",
"app.audio.captions.button.stop": "Detener subtítulos",
"app.audio.captions.button.language": "Idioma",
"app.audio.captions.button.transcription": "Transcripción",
"app.audio.captions.button.transcriptionSettings": "Ajustes de transcripción",
"app.audio.captions.speech.title": "Transcripción automática",
"app.audio.captions.speech.disabled": "Desactivado",
"app.audio.captions.speech.unsupported": "Su navegador no es compatible con el reconocimiento de voz. Tu audio no se transcribirá",
"app.audio.captions.select.de-DE": "Alemán",
"app.audio.captions.select.en-US": "Inglés",
"app.audio.captions.select.es-ES": "Español",
"app.audio.captions.select.fr-FR": "Francés",
"app.audio.captions.select.hi-ID": "Hindi",
"app.audio.captions.select.it-IT": "Italiano",
"app.audio.captions.select.ja-JP": "Japonés",
"app.audio.captions.select.pt-BR": "Portugués",
"app.audio.captions.select.ru-RU": "Ruso",
"app.audio.captions.select.zh-CN": "Chino",
"app.error.removed": "Has sido eliminado de la conferencia",
"app.error.meeting.ended": "Has salido de la conferencia",
"app.meeting.logout.duplicateUserEjectReason": "Usuario duplicado intentando unirse a la reunión",
@ -578,6 +665,7 @@
"app.meeting.logout.ejectedFromMeeting": "Usted ha sido expulsado/a de la reunión",
"app.meeting.logout.validateTokenFailedEjectReason": "Error al validar el token de autorización",
"app.meeting.logout.userInactivityEjectReason": "Usuario inactivo por mucho tiempo",
"app.meeting.logout.maxParticipantsReached": "Se ha alcanzado el número máximo de participantes permitidos para esta reunión",
"app.meeting-ended.rating.legendLabel": "Calificación de votos",
"app.meeting-ended.rating.starLabel": "Estrella",
"app.modal.close": "Cerrar",
@ -599,8 +687,11 @@
"app.error.403": "Usted ha sido expulsado/a de la reunión",
"app.error.404": "No se encontró",
"app.error.408": "Autentificación fallida",
"app.error.409": "Conflicto",
"app.error.410": "La reunión ha finalizado",
"app.error.500": "¡Vaya!, algo salio mal",
"app.error.503": "Has sido desconectado",
"app.error.disconnected.rejoin": "Puedes refrescar la página para unirte de nuevo.",
"app.error.userLoggedOut": "El usuario tiene un Token de sesión no válido debido al cierre de sesión",
"app.error.ejectedUser": "El usuario tiene un Token de sesión no válido debido a su expulsión",
"app.error.joinedAnotherWindow": "Parece que esta sesión ya está abierta en otra ventana del navegador.",
@ -644,14 +735,18 @@
"app.userList.guest.privateMessageLabel": "Mensaje",
"app.userList.guest.acceptLabel": "Aceptar",
"app.userList.guest.denyLabel": "Denegar",
"app.userList.guest.feedbackMessage": "Acción aplicada:",
"app.user-info.title": "Búsqueda de directorio",
"app.toast.breakoutRoomEnded": "La sesión de grupo de trabajo ha finalizado. Ingresa al audio nuevamente.",
"app.toast.chat.public": "Nuevo mensaje en chat público",
"app.toast.chat.private": "Nuevo mensaje en chat privado",
"app.toast.chat.system": "Sistema",
"app.toast.chat.poll": "Resultados de la encuesta",
"app.toast.chat.pollClick": "Se han publicado los resultados de la encuesta. Click aquí para verlos.",
"app.toast.clearedEmoji.label": "Estado del emoji borrado",
"app.toast.setEmoji.label": "Estado del emoji cambiado a {0}",
"app.toast.meetingMuteOn.label": "Todos los usuarios han sido silenciados",
"app.toast.meetingMuteOnViewers.label": "Se ha enmudecido a todos los usuarios",
"app.toast.meetingMuteOff.label": "Todos los usuarios pueden hablar",
"app.toast.setEmoji.raiseHand": "Ud. ha levantado la mano",
"app.toast.setEmoji.lowerHand": "Se ha bajado tu mano",
@ -688,6 +783,38 @@
"app.shortcut-help.toggleFullscreenKey": "Enter",
"app.shortcut-help.nextSlideKey": "Flecha derecha",
"app.shortcut-help.previousSlideKey": "Flecha izquierda",
"app.shortcut-help.select": "Seleccionar herramienta",
"app.shortcut-help.pencil": "Lápiz",
"app.shortcut-help.eraser": "Goma de borrar",
"app.shortcut-help.rectangle": "Rectángulo",
"app.shortcut-help.elipse": "Elipse",
"app.shortcut-help.triangle": "Triángulo",
"app.shortcut-help.line": "Línea",
"app.shortcut-help.arrow": "Flecha",
"app.shortcut-help.text": "Herramienta de texto",
"app.shortcut-help.note": "Post-it",
"app.shortcut-help.general": "General",
"app.shortcut-help.presentation": "Presentación",
"app.shortcut-help.whiteboard": "Encerado",
"app.shortcut-help.zoomIn": "Acercar",
"app.shortcut-help.zoomOut": "Alejar",
"app.shortcut-help.zoomFit": "Reiniciar zoom",
"app.shortcut-help.zoomSelect": "Acercar a la selección",
"app.shortcut-help.flipH": "Rotar horizontalmente",
"app.shortcut-help.flipV": "Rotar verticalmente",
"app.shortcut-help.lock": "Bloquear / Desbloquear",
"app.shortcut-help.moveToFront": "Mover al frente",
"app.shortcut-help.moveToBack": "Mover detrás",
"app.shortcut-help.moveForward": "Mover delante",
"app.shortcut-help.moveBackward": "Mover hacia atrás",
"app.shortcut-help.undo": "Deshacer",
"app.shortcut-help.redo": "Rehacer",
"app.shortcut-help.cut": "Cortar",
"app.shortcut-help.copy": "Copiar",
"app.shortcut-help.paste": "Pegar",
"app.shortcut-help.selectAll": "Seleccionar todo",
"app.shortcut-help.delete": "Borrar",
"app.shortcut-help.duplicate": "Duplicar",
"app.lock-viewers.title": "Bloquear espectadores",
"app.lock-viewers.description": "Estas opciones le permiten restringir ciertas características a observadores.",
"app.lock-viewers.featuresLable": "Función",
@ -737,13 +864,19 @@
"app.connection-status.next": "Página siguiente",
"app.connection-status.prev": "Página anterior",
"app.learning-dashboard.label": "Panel de análisis del aprendizaje",
"app.learning-dashboard.description": "Abrir panel con actividades de los usuarios",
"app.learning-dashboard.description": "Panel con las actividades de los usuarios",
"app.learning-dashboard.clickHereToOpen": "Abrir Panel de análisis del aprendizaje",
"app.recording.startTitle": "Iniciar grabación",
"app.recording.stopTitle": "Pausar grabación",
"app.recording.resumeTitle": "Continuar grabación",
"app.recording.startDescription": "Puede volver a presionar el botón de grabación para pausar la grabación actual.",
"app.recording.stopDescription": "¿Está seguro de querer pausar la grabación? Puede continuarla volviendo a presionar el botón de grabación nuevamente.",
"app.recording.notify.title": "Se ha iniciado la grabación",
"app.recording.notify.description": "Habrá una grabación disponible basada en el resto de esta sesión.",
"app.recording.notify.continue": "Continuar",
"app.recording.notify.leave": "Abandonar la sesión",
"app.recording.notify.continueLabel" : "Aceptar la grabación y continuar",
"app.recording.notify.leaveLabel" : "No aceptar la grabación y abandonar la reunión",
"app.videoPreview.cameraLabel": "Webcam",
"app.videoPreview.profileLabel": "Calidad",
"app.videoPreview.quality.low": "Bajo",
@ -760,13 +893,20 @@
"app.videoPreview.webcamOptionLabel": "Selecciona la webcam",
"app.videoPreview.webcamPreviewLabel": "Vista preliminar de webcam",
"app.videoPreview.webcamSettingsTitle": "Configuración de webcam",
"app.videoPreview.webcamEffectsTitle": "Efectos visuales de la cámara web",
"app.videoPreview.webcamVirtualBackgroundLabel": "Ajustes del fondo virtual",
"app.videoPreview.webcamVirtualBackgroundDisabledLabel": "Este dispositivo no soporta fondos virtuales",
"app.videoPreview.webcamNotFoundLabel": "Webcam no encontrada",
"app.videoPreview.profileNotFoundLabel": "Perfil de cámara no soportado",
"app.videoPreview.brightness": "Brillo",
"app.videoPreview.wholeImageBrightnessLabel": "Toda la imagen",
"app.videoPreview.wholeImageBrightnessDesc": "Aplica brillo a la transmisión y a la imagen de fondo.",
"app.videoPreview.sliderDesc": "Aumentar o disminuir los niveles de brillo",
"app.video.joinVideo": "Compartir webcam",
"app.video.connecting": "Comenzando a compartir la cámara...",
"app.video.leaveVideo": "Dejar de compartir webcam",
"app.video.videoSettings": "Ajustes de vídeo",
"app.video.visualEffects": "Efectos visuales",
"app.video.advancedVideo": "Abrir ajustes avanzados",
"app.video.iceCandidateError": "Error al agregar candidato ICE",
"app.video.iceConnectionStateError": "Conexión fallida (ICE error 1107)",
@ -782,6 +922,7 @@
"app.video.notReadableError": "No se pudo obtener video de webcam. Asegurate de que ninguna otra aplicación esté utilizandola.",
"app.video.timeoutError": "El navegador no respondió a tiempo.",
"app.video.genericError": "Un error desconocido ocurrió con el dispositivo (Error {0})",
"app.video.inactiveError": "Su cámara web se detuvo inesperadamente. Por favor revise los permisos de su navegador",
"app.video.mediaTimedOutError": "Se ha interrumpido la transmisión de tu cámara web. Prueba a compartirla de nuevo",
"app.video.mediaFlowTimeout1020": "Los datos no alcanzaron el servidor (error 1020)",
"app.video.suggestWebcamLock": "¿Aplicar la configuración de bloqueo a las cámaras web de los observadores?",
@ -804,8 +945,17 @@
"app.video.virtualBackground.board": "Pizarra",
"app.video.virtualBackground.coffeeshop": "Cafetería",
"app.video.virtualBackground.background": "Fondo",
"app.video.virtualBackground.backgroundWithIndex": "Fondo {0}",
"app.video.virtualBackground.custom": "Subir desde tu computadora",
"app.video.virtualBackground.remove": "Borrar imagen añadida",
"app.video.virtualBackground.genericError": "No se pudo aplicar el efecto de la cámara. Inténtalo de nuevo.",
"app.video.virtualBackground.camBgAriaDesc": "Ajusta el fondo virtual de la cámara web a {0}",
"app.video.virtualBackground.maximumFileSizeExceeded": "Se excedió el tamaño máximo de archivo. ({0}MB)",
"app.video.virtualBackground.typeNotAllowed": "Tipo de archivo no permitido.",
"app.video.virtualBackground.errorOnRead": "Algo salió mal al leer el archivo.",
"app.video.virtualBackground.uploaded": "Subido",
"app.video.virtualBackground.uploading": "Subiendo...",
"app.video.virtualBackground.button.customDesc": "Añade una nueva imagen de fondo virtual",
"app.video.camCapReached": "No puedes compartir más cámaras",
"app.video.meetingCamCapReached": "Se ha alcanzado el límite de cámaras web simultáneas para esta reunión.",
"app.video.dropZoneLabel": "Soltar aquí",
@ -826,6 +976,7 @@
"app.whiteboard.annotations.poll": "Se han publicado los resultados de la encuesta",
"app.whiteboard.annotations.pollResult": "Resultados de la encuesta",
"app.whiteboard.annotations.noResponses": "Sin respuestas",
"app.whiteboard.annotations.notAllowed": "No tienes permiso para hacer este cambio.",
"app.whiteboard.toolbar.tools": "Herramientas",
"app.whiteboard.toolbar.tools.hand": "Panorama",
"app.whiteboard.toolbar.tools.pencil": "Lápiz",
@ -852,6 +1003,7 @@
"app.whiteboard.toolbar.color.silver": "Plata",
"app.whiteboard.toolbar.undo": "Deshacer anotaciones",
"app.whiteboard.toolbar.clear": "Borrar todas las anotaciones",
"app.whiteboard.toolbar.clearConfirmation": "¿Estás seguro/a de que quieres borrar todas las anotaciones?",
"app.whiteboard.toolbar.multiUserOn": "Activar modo multiusuario de pizarra",
"app.whiteboard.toolbar.multiUserOff": "Desactivar modo multiusuario de pizarra",
"app.whiteboard.toolbar.palmRejectionOn": "Activar rechazo de palma (táctiles)",
@ -871,13 +1023,13 @@
"app.videoDock.webcamUnfocusDesc": "Desenfocar la camara seleccionada",
"app.videoDock.webcamPinLabel": "Bloquear",
"app.videoDock.webcamPinDesc": "Bloquear la cámara web seleccionada",
"app.videoDock.webcamFullscreenLabel": "Cámara web a pantalla completa",
"app.videoDock.webcamSqueezedButtonLabel": "Opciones de webcam",
"app.videoDock.webcamUnpinLabel": "Desbloquear",
"app.videoDock.webcamUnpinLabelDisabled": "Solo Moderadores pueden desbloquear usuarios",
"app.videoDock.webcamUnpinDesc": "Desbloquear la cámara web seleccionada",
"app.videoDock.autoplayBlockedDesc": "Necesitamos tu permiso para mostrarle las webcams de otros usuarios.",
"app.videoDock.autoplayAllowLabel": "Ver webcams",
"app.invitation.title": "Invitación a grupo de trabajo",
"app.invitation.confirm": "Invitar",
"app.createBreakoutRoom.title": "Grupos de trabajo",
"app.createBreakoutRoom.ariaTitle": "Ocultar Salas de Descanso",
"app.createBreakoutRoom.breakoutRoomLabel": "Grupos de trabajo {0}",
@ -909,6 +1061,8 @@
"app.createBreakoutRoom.addRoomTime": "Aumentar tiempo de grupo de trabajo",
"app.createBreakoutRoom.addParticipantLabel": "+ Agregar participante",
"app.createBreakoutRoom.freeJoin": "Permitir a los usuarios seleccionar el grupo de trabajo a ingresar",
"app.createBreakoutRoom.captureNotes": "Capturar notas compartidas cuando finalicen las salas de reuniones",
"app.createBreakoutRoom.captureSlides": "Capturar el encerado cuando finalicen las salas de reuniones",
"app.createBreakoutRoom.leastOneWarnBreakout": "Debes agregar almenos un usuario a cada grupo de trabajo.",
"app.createBreakoutRoom.minimumDurationWarnBreakout": "La duración mínima para una sala de un grupo de trabajo es de {0} minutos.",
"app.createBreakoutRoom.modalDesc": "Consejo: Puede arrastrar-y-soltar un nombre de usuario para asignarlo a un grupo de trabajo específico.",
@ -921,6 +1075,14 @@
"app.createBreakoutRoom.setTimeCancel": "Cancelar",
"app.createBreakoutRoom.setTimeHigherThanMeetingTimeError": "La duración de los grupos de trabajo no puede exceder el tiempo de reunión restante.",
"app.createBreakoutRoom.roomNameInputDesc": "Actualiza el nombre de la sala de los grupos de trabajo",
"app.createBreakoutRoom.movedUserLabel": "Movido/a {0} a la sala {1}",
"app.updateBreakoutRoom.modalDesc": "Para actualizar o invitar a un/a usuario/a, simplemente arrástrelo/a a la sala deseada.",
"app.updateBreakoutRoom.cancelLabel": "Cancelar",
"app.updateBreakoutRoom.title": "Actualizar salas de reuniones",
"app.updateBreakoutRoom.confirm": "Aplicar",
"app.updateBreakoutRoom.userChangeRoomNotification": "Te trasladaron a la sala {0}.",
"app.smartMediaShare.externalVideo": "Vídeo(s) externo(s)",
"app.update.resetRoom": "Restablecer sala de usuario",
"app.externalVideo.start": "Compartir un nuevo video",
"app.externalVideo.title": "Compartir un video externo",
"app.externalVideo.input": "URL de video externo",
@ -946,6 +1108,15 @@
"app.debugWindow.form.enableAutoarrangeLayoutDescription": "(se deshabilitará si arrastras o cambias el tamaño del área de las cámaras)",
"app.debugWindow.form.chatLoggerLabel": " Probar los niveles de registro de la conversación",
"app.debugWindow.form.button.apply": "Aplicar",
"app.layout.modal.title": "Diseños",
"app.layout.modal.confirm": "Confirmar",
"app.layout.modal.cancel": "Cancelar",
"app.layout.modal.layoutLabel": "Selecciona tu diseño",
"app.layout.modal.keepPushingLayoutLabel": "Forzar diseño a todos/as",
"app.layout.modal.pushLayoutLabel": "Forzar para todos/as",
"app.layout.modal.layoutToastLabel": "Ha cambiado la configuración del diseño",
"app.layout.modal.layoutSingular": "Diseño",
"app.layout.modal.layoutBtnDesc": "Establece el diseño como opción seleccionada",
"app.layout.style.custom": "Personalizado",
"app.layout.style.smart": "Diseño inteligente",
"app.layout.style.presentationFocus": "Establecer foco en la presentación",
@ -995,6 +1166,7 @@
"playback.player.thumbnails.wrapper.aria": "Zona de miniaturas",
"playback.player.webcams.wrapper.aria": "Zona de webcams",
"app.learningDashboard.dashboardTitle": "Panel de análisis del aprendizaje",
"app.learningDashboard.bigbluebuttonTitle": "BigBlueButton",
"app.learningDashboard.downloadSessionDataLabel": "Descargar datos de la sesión",
"app.learningDashboard.lastUpdatedLabel": "Última actualización el",
"app.learningDashboard.sessionDataDownloadedLabel": "¡Descargado!",
@ -1019,6 +1191,12 @@
"app.learningDashboard.userDetails.response": "Respuesta",
"app.learningDashboard.userDetails.mostCommonAnswer": "Respuesta más común",
"app.learningDashboard.userDetails.anonymousAnswer": "Encuesta anónima",
"app.learningDashboard.userDetails.talkTime": "Tiempo de conversación",
"app.learningDashboard.userDetails.messages": "Mensajes",
"app.learningDashboard.userDetails.emojis": "Emojis",
"app.learningDashboard.userDetails.raiseHands": "Levantar las manos",
"app.learningDashboard.userDetails.pollVotes": "Votaciones en encuestas",
"app.learningDashboard.userDetails.onlineIndicator": " {0} tiempo en línea",
"app.learningDashboard.usersTable.title": "Vista general",
"app.learningDashboard.usersTable.colOnline": "Tiempo en línea",
"app.learningDashboard.usersTable.colTalk": "Tiempo de conversación",
@ -1042,8 +1220,13 @@
"app.learningDashboard.pollsTable.anonymousRowName": "Anónimo",
"app.learningDashboard.pollsTable.noPollsCreatedHeading": "No se han creado encuestas",
"app.learningDashboard.pollsTable.noPollsCreatedMessage": "Una vez activada la encuesta, los resultados se mostrarán en esta lista.",
"app.learningDashboard.pollsTable.answerTotal": "Total",
"app.learningDashboard.pollsTable.userLabel": "Usuario/a",
"app.learningDashboard.statusTimelineTable.title": "Cronología",
"app.learningDashboard.statusTimelineTable.thumbnail": "Miniaturas de la presentación",
"app.learningDashboard.statusTimelineTable.presentation": "Presentación",
"app.learningDashboard.statusTimelineTable.pageNumber": "Página",
"app.learningDashboard.statusTimelineTable.setAt": "Fijado en",
"app.learningDashboard.errors.invalidToken": "Token de sesión inválido",
"app.learningDashboard.errors.dataUnavailable": "Los datos ya no están disponibles",
"mobileApp.portals.list.empty.addFirstPortal.label": "Añade tu primer portal usando el botón superior,",
@ -1057,6 +1240,4 @@
"mobileApp.portals.addPortalPopup.validation.emptyFields": "Campos requeridos",
"mobileApp.portals.addPortalPopup.validation.portalNameAlreadyExists": "El nombre ya está en uso",
"mobileApp.portals.addPortalPopup.validation.urlInvalid": "Error al intentar cargar la página - comprueba la URL y la conexión de red"
}

View File

@ -2,10 +2,11 @@
"app.home.greeting": "Su presentación se iniciará pronto...",
"app.chat.submitLabel": "Enviar mensaje",
"app.chat.loading": "Mensajes de chat cargados: {0}%",
"app.chat.errorMaxMessageLength": "El mensaje tiene {0} caracteres de exceso",
"app.chat.errorMaxMessageLength": "El mensaje es demasiado largo, excedió el máximo de {0} caracteres",
"app.chat.disconnected": "Usted está desconectado. Los mensajes no serán enviados",
"app.chat.locked": "El chat está bloqueado. Los mensajes no pueden ser enviados",
"app.chat.inputLabel": "Entrada de mensaje para chat {0}",
"app.chat.emojiButtonLabel": "Selector de emojis",
"app.chat.inputPlaceholder": "Mensaje {0}",
"app.chat.titlePublic": "Chat público",
"app.chat.titlePrivate": "Chat privado con {0}",
@ -21,6 +22,7 @@
"app.chat.offline": "Fuera de linea",
"app.chat.pollResult": "Resultados de la encuesta o votación",
"app.chat.breakoutDurationUpdated": "La duración del grupo de trabajo es ahora de {0} minutos",
"app.chat.breakoutDurationUpdatedModerator": "El tiempo de las salas de reuniones ahora es de {0} minutos, y se ha enviado una notificación.",
"app.chat.emptyLogLabel": "Registro de chat vacío",
"app.chat.clearPublicChatMessage": "El histórico del chat público fue borrado por un moderador",
"app.chat.multi.typing": "Múltiples usuarios están escribiendo",
@ -28,6 +30,27 @@
"app.chat.two.typing": "{0} y {1} están escribiendo",
"app.chat.copySuccess": "Transcripción del chat copiada",
"app.chat.copyErr": "Error al copiar la transcripción del chat",
"app.emojiPicker.search": "Buscar",
"app.emojiPicker.notFound": " No se encontraron emojis",
"app.emojiPicker.skintext": " Elige tu tono de piel predeterminado",
"app.emojiPicker.clear": "Limpiar",
"app.emojiPicker.categories.label": "Categorías de los emojis",
"app.emojiPicker.categories.people": "Personas y cuerpo",
"app.emojiPicker.categories.nature": "Animales y Naturaleza",
"app.emojiPicker.categories.foods": "Comida y bebida",
"app.emojiPicker.categories.places": "Viajes y lugares",
"app.emojiPicker.categories.activity": "Actividad",
"app.emojiPicker.categories.objects": "Objetos",
"app.emojiPicker.categories.symbols": "Símbolos",
"app.emojiPicker.categories.flags": "Banderas",
"app.emojiPicker.categories.recent": "Usados frecuentemente",
"app.emojiPicker.categories.search": "Resultados de la búsqueda",
"app.emojiPicker.skintones.1": " Tono de piel predeterminado",
"app.emojiPicker.skintones.2": "Tono de piel claro",
"app.emojiPicker.skintones.3": "Tono de piel medio-claro",
"app.emojiPicker.skintones.4": "Tono de piel medio",
"app.emojiPicker.skintones.5": "Tono de piel medio-oscuro",
"app.emojiPicker.skintones.6": "Tono de piel oscuro",
"app.captions.label": "Subtítulos",
"app.captions.menu.close": "Cerrar",
"app.captions.menu.start": "Iniciar",
@ -53,12 +76,21 @@
"app.captions.speech.start": "Reconocimiento de voz iniciado",
"app.captions.speech.stop": "Reconocimiento de voz detenido",
"app.captions.speech.error": "Reconocimiento de voz detenido debido a incompatibilidad con el navegador o algún tiempo de silencio",
"app.confirmation.skipConfirm": "No preguntar de nuevo",
"app.confirmation.virtualBackground.title": "Comenzar nuevo fondo virtual",
"app.confirmation.virtualBackground.description": "{0} se añadirá como fondo virtual. ¿Continuar?",
"app.confirmationModal.yesLabel": "Sí",
"app.textInput.sendLabel": "Enviar",
"app.title.defaultViewLabel": "Vista de presentación predeterminada",
"app.notes.title": "Notas compartidas",
"app.notes.label": "Notas",
"app.notes.hide": "Ocultar notas",
"app.notes.locked": "Bloqueado",
"app.notes.disabled": "Fijado en el área de medios",
"app.notes.notesDropdown.covertAndUpload": "Convertir notas en presentación",
"app.notes.notesDropdown.pinNotes": "Fijar notas en la pizarra",
"app.notes.notesDropdown.unpinNotes": "Desanclar notas",
"app.notes.notesDropdown.notesOptions": "Opciones de notas",
"app.pads.hint": "Pulsa Esc para enfocar la barra de herramientas del pad",
"app.user.activityCheck": "Comprobación de la actividad del usuario",
"app.user.activityCheck.label": "Comprobar si el usuario continúa en la reunión ({0})",
@ -170,7 +202,7 @@
"app.presentation.endSlideContent": "Fin del contenido de diapositiva",
"app.presentation.changedSlideContent": "Presentación cambiada a diapositiva: {0}",
"app.presentation.emptySlideContent": "No hay contenido en la diapositiva actual",
"app.presentation.options.fullscreen": "Pantalla completa",
"app.presentation.options.fullscreen": "Presentación a pantalla completa",
"app.presentation.options.exitFullscreen": "Salir de pantalla completa",
"app.presentation.options.minimize": "Minimizar",
"app.presentation.options.snapshot": "Realizar instantánea de la diapositiva actual",
@ -203,7 +235,18 @@
"app.presentation.presentationToolbar.goToSlide": "Diapositiva {0}",
"app.presentation.placeholder": "No hay actualmente una presentación activa",
"app.presentationUploder.title": "Presentación",
"app.presentationUploder.message": "Como presentador, usted tiene la posibilidad de cargar cualquier documento o archivo PDF. Se recomienda PDF para mejores resultados. Por favor, asegúrese de seleccionar la presentación mediante el círculo de verificación situado en el lado derecho.",
"app.presentationUploder.message": "Como presentador, tiene la posibilidad de cargar cualquier documento de oficina o archivo PDF. Se recomienda el archivo PDF para obtener los mejores resultados. Asegúrese de seleccionar una presentación usando la casilla de verificación círcular en el lado izquierdo.",
"app.presentationUploader.exportHint": "Al seleccionar \"Enviar al chat\", los usuarios recibirán un enlace en el chat público para descargar las anotaciones .",
"app.presentationUploader.exportToastHeader": "Enviando al chat (elemento {0})",
"app.presentationUploader.exportToastHeaderPlural": "Enviando al chat ({0} elementos)",
"app.presentationUploader.exporting": "Enviando al chat",
"app.presentationUploader.sending": "Enviando...",
"app.presentationUploader.collecting": "Extrayendo la diapositiva {0} de {1}...",
"app.presentationUploader.processing": "Anotando la diapositiva {0} de {1}...",
"app.presentationUploader.sent": "Enviado",
"app.presentationUploader.exportingTimeout": "La exportación está tardando demasiado...",
"app.presentationUploader.export": "Enviar al chat",
"app.presentationUploader.currentPresentationLabel": "Presentación actual",
"app.presentationUploder.extraHint": "IMPORTANTE: cada fichero no puede exceder {0} MB y {1} páginas",
"app.presentationUploder.uploadLabel": "Cargar",
"app.presentationUploder.confirmLabel": "Confirmar",
@ -214,6 +257,8 @@
"app.presentationUploder.dropzoneImagesLabel": "Arrastre las imágenes aquí para subirlas",
"app.presentationUploder.browseFilesLabel": "o buscar archivos ",
"app.presentationUploder.browseImagesLabel": "o buscar/capturar imágenes",
"app.presentationUploder.externalUploadTitle": "Agregar contenido desde una aplicación de terceros",
"app.presentationUploder.externalUploadLabel": "Buscar ficheros",
"app.presentationUploder.fileToUpload": "Para ser cargados...",
"app.presentationUploder.currentBadge": "Actual",
"app.presentationUploder.rejectedError": "El(los) archivo(s) seleccionado(s) ha(n) sido rechazado(s). Por favor, revise el(los) tipo(s) de archivo(s).",
@ -230,14 +275,14 @@
"app.presentationUploder.conversion.generatedSlides": "Diapositivas generadas...",
"app.presentationUploder.conversion.generatingSvg": "Generando imágenes SVG...",
"app.presentationUploder.conversion.pageCountExceeded": "El número de páginas excede el máximo de {0}",
"app.presentationUploder.conversion.invalidMimeType": "Formato no válido detectado (extensión={0}, tipo de contenido={1})",
"app.presentationUploder.conversion.conversionTimeout": "La diapositiva {0} no se pudo procesar en {1} intentos.",
"app.presentationUploder.conversion.officeDocConversionInvalid": "No se pudo procesar el documento. Por favor, cargue un PDF en su lugar.",
"app.presentationUploder.conversion.officeDocConversionFailed": "No se pudo procesar el documento. Por favor, cargue un PDF en su lugar.",
"app.presentationUploder.conversion.pdfHasBigPage": "No se pudo convertir el archivo PDF. Por favor, intente optimizarlo. Máximo número de páginas {0}",
"app.presentationUploder.conversion.timeout": "Oh, la conversión tardó demasiado",
"app.presentationUploder.conversion.pageCountFailed": "No se pudo determinar el número de páginas.",
"app.presentationUploder.conversion.unsupportedDocument": "Extensión (tipo) de archivo no soportado",
"app.presentationUploder.isDownloadableLabel": "No está permitida la descarga de la presentación - haz clic para permitirla",
"app.presentationUploder.isNotDownloadableLabel": "Está permitida la descarga de la presentación - haz clic para deshabilitarla",
"app.presentationUploder.removePresentationLabel": "Borrar presentación",
"app.presentationUploder.setAsCurrentPresentation": "Colocar presentación como actual",
"app.presentationUploder.tableHeading.filename": "Nombre de archivo",
@ -251,6 +296,10 @@
"app.presentationUploder.clearErrors": "Limpiar errores",
"app.presentationUploder.clearErrorsDesc": "Limpiar subidas de presentación falladas",
"app.presentationUploder.uploadViewTitle": "Subir presentación",
"app.poll.questionAndoptions.label" : "Texto de la pregunta que se mostrará.\nA. Opción de encuesta\nB. Opción de encuesta (opcional)\nC. Opción de encuesta (opcional)\nD. Opción de encuesta (opcional )\nE. Opción de encuesta (opcional)",
"app.poll.customInput.label": "Entrada personalizada",
"app.poll.customInputInstructions.label": "La entrada personalizada está habilitada: escriba la pregunta de la encuesta y las opciones en el formato dado o arrastre y suelte un archivo de texto en el mismo formato.",
"app.poll.maxOptionsWarning.label": "¡Solo se pueden usar las primeras 5 opciones!",
"app.poll.pollPaneTitle": "Votación",
"app.poll.enableMultipleResponseLabel": "¿Permitir múltiples respuestas por cada persona?",
"app.poll.quickPollTitle": "Encuesta rápida",
@ -270,7 +319,7 @@
"app.poll.clickHereToSelect": "'Click' aquí para seleccionar",
"app.poll.question.label" : "Escribe tu pregunta...",
"app.poll.optionalQuestion.label" : "Escribe tu pregunta (opcional)...",
"app.poll.userResponse.label" : "Respuesta del usuario",
"app.poll.userResponse.label" : "Respuesta escrita",
"app.poll.responseTypes.label" : "Tipos de respuesta",
"app.poll.optionDelete.label" : "Borrar",
"app.poll.responseChoices.label" : "Opciones de respuesta",
@ -329,7 +378,7 @@
"app.muteWarning.disableMessage": "Silenciar alertas inhabilitadas hasta dejar de silenciar",
"app.muteWarning.tooltip": "Haga clic para cerrar y deshabilitar la advertencia hasta la próxima activación del sonido",
"app.navBar.settingsDropdown.optionsLabel": "Opciones",
"app.navBar.settingsDropdown.fullscreenLabel": "Desplegar a pantalla completa",
"app.navBar.settingsDropdown.fullscreenLabel": "Aplicación a pantalla completa",
"app.navBar.settingsDropdown.settingsLabel": "Configuración",
"app.navBar.settingsDropdown.aboutLabel": "Acerca de",
"app.navBar.settingsDropdown.leaveSessionLabel": "Abandonar la reunión",
@ -342,6 +391,7 @@
"app.navBar.settingsDropdown.hotkeysLabel": "Atajos de teclado",
"app.navBar.settingsDropdown.hotkeysDesc": "Listado de atajos de teclado disponibles",
"app.navBar.settingsDropdown.helpLabel": "Ayuda",
"app.navBar.settingsDropdown.openAppLabel": "Abrir en la aplicación BigBlueButton Tablet",
"app.navBar.settingsDropdown.helpDesc": "Vincula al usuario con video tutoriales (abre nueva pestaña)",
"app.navBar.settingsDropdown.endMeetingDesc": "Finaliza la reunión actual",
"app.navBar.settingsDropdown.endMeetingLabel": "Finalizar reunión",
@ -359,7 +409,7 @@
"app.endMeeting.description": "Esta acción finalizará la sesión para {0} usuarios activos. ¿Está seguro de querer finalizar la sesión?",
"app.endMeeting.noUserDescription": "¿Está seguro/a de querer terminar esta sesión?",
"app.endMeeting.contentWarning": "Ya no se podrá acceder directamente a los mensajes de chat, las notas compartidas, el contenido de la pizarra y los documentos compartidos de esta sesión.",
"app.endMeeting.yesLabel": "",
"app.endMeeting.yesLabel": "Finalizar la sesión para todos los usuarios",
"app.endMeeting.noLabel": "No",
"app.about.title": "Acerca de",
"app.about.version": "Versión de la interfaz cliente:",
@ -369,6 +419,15 @@
"app.about.confirmDesc": "OK",
"app.about.dismissLabel": "Cancelar",
"app.about.dismissDesc": "Cerrar información acerca del cliente",
"app.mobileAppModal.title": "Abrir la aplicación Bigbluebutton Tablet.",
"app.mobileAppModal.description": "¿Tienes la aplicación Bigbluebutton Tablet instalada en tu dispositivo?",
"app.mobileAppModal.openApp": "Sí, abrir la app ahora.",
"app.mobileAppModal.obtainUrlMsg": "Obteniendo URL de la reunión",
"app.mobileAppModal.obtainUrlErrorMsg": "Error al tratar de obtener la URL de la reunión",
"app.mobileAppModal.openStore": "No, abre la App Store para descargarla",
"app.mobileAppModal.dismissLabel": "Cancelar",
"app.mobileAppModal.dismissDesc": "Cerrar",
"app.mobileAppModal.userConnectedWithSameId": "El usuario {0} acaba de conectarse con el mismo ID que usted.",
"app.actionsBar.changeStatusLabel": "Cambiar estado",
"app.actionsBar.muteLabel": "Silenciar",
"app.actionsBar.unmuteLabel": "De-silenciar",
@ -379,10 +438,12 @@
"app.actionsBar.actionsDropdown.restorePresentationDesc": "Botón para restaurar la presentación después de haber sido minimizada",
"app.actionsBar.actionsDropdown.minimizePresentationLabel": "Minimizar presentación",
"app.actionsBar.actionsDropdown.minimizePresentationDesc": "Botón usado para minimizar presentación",
"app.actionsBar.actionsDropdown.layoutModal": "Configuración del diseño",
"app.screenshare.screenShareLabel" : "Compartir pantalla",
"app.submenu.application.applicationSectionTitle": "Aplicación",
"app.submenu.application.animationsLabel": "Animaciones",
"app.submenu.application.audioFilterLabel": "Filtros de audio para el micrófono",
"app.submenu.application.darkThemeLabel": "Modo oscuro",
"app.submenu.application.fontSizeControlLabel": "Tamaño de fuente",
"app.submenu.application.increaseFontBtnLabel": "Aumentar tamaño de fuente de la aplicación",
"app.submenu.application.decreaseFontBtnLabel": "Reducir tamaño de fuente de la aplicación",
@ -392,6 +453,7 @@
"app.submenu.application.noLocaleOptionLabel": "No hay locales activos",
"app.submenu.application.paginationEnabledLabel": "Paginación de vídeo",
"app.submenu.application.layoutOptionLabel": "Tipo de diseño",
"app.submenu.application.pushLayoutLabel": "Forzar diseño",
"app.submenu.notification.SectionTitle": "Notificaciones",
"app.submenu.notification.Desc": "Define cómo y qué quieres que te sea notificado.",
"app.submenu.notification.audioAlertLabel": "Alertas sonoras",
@ -420,7 +482,7 @@
"app.settings.main.save.label.description": "Guarda los cambios y cierra el menú de configuración",
"app.settings.dataSavingTab.label": "Ahorro de datos",
"app.settings.dataSavingTab.webcam": "Habilitar webcams",
"app.settings.dataSavingTab.screenShare": "Habilitar compartir escritorio",
"app.settings.dataSavingTab.screenShare": "Permitir que otros participantes compartan el escritorio",
"app.settings.dataSavingTab.description": "Para ahorrar ancho de banda, ajuste lo que se muestra actualmente.",
"app.settings.save-notification.label": "Las configuraciones han sido guardadas",
"app.statusNotifier.lowerHands": "Bajar manos",
@ -440,7 +502,6 @@
"app.actionsBar.actionsDropdown.presentationLabel": "Gestionar presentaciones",
"app.actionsBar.actionsDropdown.initPollLabel": "Iniciar una encuesta",
"app.actionsBar.actionsDropdown.desktopShareLabel": "Compartir su pantalla",
"app.actionsBar.actionsDropdown.lockedDesktopShareLabel": "Compartir pantalla bloqueado",
"app.actionsBar.actionsDropdown.stopDesktopShareLabel": "Detener compartir su pantalla",
"app.actionsBar.actionsDropdown.presentationDesc": "Subir su presentación",
"app.actionsBar.actionsDropdown.initPollDesc": "Iniciar una encuesta",
@ -457,6 +518,7 @@
"app.actionsBar.actionsDropdown.takePresenterDesc": "Asignarse a sí mismo como el nuevo presentador",
"app.actionsBar.actionsDropdown.selectRandUserLabel": "Seleccionar usuario al azar",
"app.actionsBar.actionsDropdown.selectRandUserDesc": "Elige a un usuario al azar entre los espectadores",
"app.actionsBar.actionsDropdown.propagateLayoutLabel": "Propagar el diseño",
"app.actionsBar.emojiMenu.statusTriggerLabel": "Establecer estado",
"app.actionsBar.emojiMenu.awayLabel": "Ausente",
"app.actionsBar.emojiMenu.awayDesc": "Cambiar su estado a ausente",
@ -496,6 +558,7 @@
"app.audioNotification.audioFailedError1012": "Se ha cerrado la conexión (error ICE 1012)",
"app.audioNotification.audioFailedMessage": "Tu conexión de audio falló al conectarse",
"app.audioNotification.mediaFailedMessage": "getUserMicMedia falló debido a que solo las fuentes de orígenes seguros están permitidas",
"app.audioNotification.deviceChangeFailed": "Falló el cambio de dispositivo de audio. Compruebe si el dispositivo elegido está correctamente configurado y disponible",
"app.audioNotification.closeLabel": "Cerrar",
"app.audioNotificaion.reconnectingAsListenOnly": "Los micrófonos han sido bloqueados a los espectadores. Ud. ha sido conectado solo como oyente",
"app.breakoutJoinConfirmation.title": "Unirse a una sala externa",
@ -509,6 +572,7 @@
"app.breakout.dropdown.manageDuration": "Cambiar duración",
"app.breakout.dropdown.destroyAll": "Finalizar grupos de trabajo",
"app.breakout.dropdown.options": "Opciones de las salas de grupos de trabajo",
"app.breakout.dropdown.manageUsers": "Gestionar usuarios",
"app.calculatingBreakoutTimeRemaining": "Calculando el tiempo restante...",
"app.audioModal.ariaTitle": "Cuadro de diálogo para unirse al audio",
"app.audioModal.microphoneLabel": "Micrófono",
@ -555,6 +619,7 @@
"app.audio.changeAudioDevice": "Cambiar dispositivo de audio",
"app.audio.enterSessionLabel": "Entrar en la sesión",
"app.audio.playSoundLabel": "Reproducir sonido",
"app.audio.stopAudioFeedback": "Detener retroalimentación de audio",
"app.audio.backLabel": "Atrás",
"app.audio.loading": "Cargando",
"app.audio.microphones": "Micrófonos",
@ -567,10 +632,32 @@
"app.audio.audioSettings.testSpeakerLabel": "Comprobar tu altavoz",
"app.audio.audioSettings.microphoneStreamLabel": "Su volúmen para el flujo de audio",
"app.audio.audioSettings.retryLabel": "Reintentar",
"app.audio.audioSettings.fallbackInputLabel": "Entrada de audio {0}",
"app.audio.audioSettings.fallbackOutputLabel": "Salida de audio {0}",
"app.audio.audioSettings.defaultOutputDeviceLabel": "Por defecto",
"app.audio.audioSettings.findingDevicesLabel": "Encontrando dispositivos...",
"app.audio.listenOnly.backLabel": "Atrás",
"app.audio.listenOnly.closeLabel": "Cerrar",
"app.audio.permissionsOverlay.title": "Permitir el acceso a su micrófono",
"app.audio.permissionsOverlay.hint": "Necesitamos nos permita usar sus dispositivos multimedia a fin de unirle a la audio conferencia :)",
"app.audio.captions.button.start": "Iniciar subtítulos",
"app.audio.captions.button.stop": "Detener subtítulos",
"app.audio.captions.button.language": "Idioma",
"app.audio.captions.button.transcription": "Transcripción",
"app.audio.captions.button.transcriptionSettings": "Ajustes de transcripción",
"app.audio.captions.speech.title": "Transcripción automática",
"app.audio.captions.speech.disabled": "Desactivado",
"app.audio.captions.speech.unsupported": "Su navegador no es compatible con el reconocimiento de voz. Tu audio no se transcribirá",
"app.audio.captions.select.de-DE": "Alemán",
"app.audio.captions.select.en-US": "Inglés",
"app.audio.captions.select.es-ES": "Español",
"app.audio.captions.select.fr-FR": "Francés",
"app.audio.captions.select.hi-ID": "Hindi",
"app.audio.captions.select.it-IT": "Italiano",
"app.audio.captions.select.ja-JP": "Japonés",
"app.audio.captions.select.pt-BR": "Portugués",
"app.audio.captions.select.ru-RU": "Ruso",
"app.audio.captions.select.zh-CN": "Chino",
"app.error.removed": "Ha sido eliminado de la conferencia",
"app.error.meeting.ended": "Ha salido de la conferencia",
"app.meeting.logout.duplicateUserEjectReason": "Usuario duplicado tratando de unirse a la reunión",
@ -578,6 +665,7 @@
"app.meeting.logout.ejectedFromMeeting": "Ha sido eliminado de la reunión",
"app.meeting.logout.validateTokenFailedEjectReason": "Error al validar el 'token' de autorización",
"app.meeting.logout.userInactivityEjectReason": "Usuario inactivo demasiado tiempo",
"app.meeting.logout.maxParticipantsReached": "Se ha alcanzado el número máximo de participantes permitidos para esta reunión",
"app.meeting-ended.rating.legendLabel": "Valoración de comentarios",
"app.meeting-ended.rating.starLabel": "Estrella",
"app.modal.close": "Cerrar",
@ -599,8 +687,11 @@
"app.error.403": "Ha sido eliminado de la reunión",
"app.error.404": "No se encontró",
"app.error.408": "Autentificación fallida",
"app.error.409": "Conflicto",
"app.error.410": "La reunión ha finalizado",
"app.error.500": "Ups, algo salió mal",
"app.error.503": "Has sido desconectado",
"app.error.disconnected.rejoin": "Puedes refrescar la página para unirte de nuevo.",
"app.error.userLoggedOut": "El usuario tiene un Token de sesión no válido debido al cierre de sesión",
"app.error.ejectedUser": "El usuario tiene un Token de sesión no válido debido a su expulsión",
"app.error.joinedAnotherWindow": "Parece que esta sesión ya está abierta en otra ventana del navegador.",
@ -644,14 +735,18 @@
"app.userList.guest.privateMessageLabel": "Mensaje",
"app.userList.guest.acceptLabel": "Aceptar",
"app.userList.guest.denyLabel": "Denegar",
"app.userList.guest.feedbackMessage": "Acción aplicada:",
"app.user-info.title": "Buscar en directorio",
"app.toast.breakoutRoomEnded": "La sala de reuniones externa terminó. Por favor, vuelva a unirse al audio.",
"app.toast.chat.public": "Nuevo mensaje en el chat público",
"app.toast.chat.private": "Nuevo mensaje en el chat privado",
"app.toast.chat.system": "Sistema",
"app.toast.chat.poll": "Resultados de la encuesta",
"app.toast.chat.pollClick": "Se han publicado los resultados de la encuesta. Click aquí para verlos.",
"app.toast.clearedEmoji.label": "Estado de Emoji limpio",
"app.toast.setEmoji.label": "Estado de Emoji establecido en {0}",
"app.toast.meetingMuteOn.label": "Todos los usuarios han sido silenciados",
"app.toast.meetingMuteOnViewers.label": "Se ha enmudecido a todos los usuarios",
"app.toast.meetingMuteOff.label": "Reunión silenciada desactivada",
"app.toast.setEmoji.raiseHand": "Ud. ha levantado la mano",
"app.toast.setEmoji.lowerHand": "Se ha bajado tu mano",
@ -688,6 +783,38 @@
"app.shortcut-help.toggleFullscreenKey": "Enter",
"app.shortcut-help.nextSlideKey": "Flecha derecha",
"app.shortcut-help.previousSlideKey": "Flecha izquierda",
"app.shortcut-help.select": "Seleccionar herramienta",
"app.shortcut-help.pencil": "Lápiz",
"app.shortcut-help.eraser": "Goma de borrar",
"app.shortcut-help.rectangle": "Rectángulo",
"app.shortcut-help.elipse": "Elipse",
"app.shortcut-help.triangle": "Triángulo",
"app.shortcut-help.line": "Línea",
"app.shortcut-help.arrow": "Flecha",
"app.shortcut-help.text": "Herramienta de texto",
"app.shortcut-help.note": "Post-it",
"app.shortcut-help.general": "General",
"app.shortcut-help.presentation": "Presentación",
"app.shortcut-help.whiteboard": "Encerado",
"app.shortcut-help.zoomIn": "Acercar",
"app.shortcut-help.zoomOut": "Alejar",
"app.shortcut-help.zoomFit": "Reiniciar Zoom",
"app.shortcut-help.zoomSelect": "Acercar a la selección",
"app.shortcut-help.flipH": "Rotar horizontalmente",
"app.shortcut-help.flipV": "Rotar verticalmente",
"app.shortcut-help.lock": "Bloquear / Desbloquear",
"app.shortcut-help.moveToFront": "Mover al frente",
"app.shortcut-help.moveToBack": "Mover detrás",
"app.shortcut-help.moveForward": "Mover delante",
"app.shortcut-help.moveBackward": "Mover hacia atrás",
"app.shortcut-help.undo": "Deshacer",
"app.shortcut-help.redo": "Rehacer",
"app.shortcut-help.cut": "Cortar",
"app.shortcut-help.copy": "Copiar",
"app.shortcut-help.paste": "Pegar",
"app.shortcut-help.selectAll": "Seleccionar todo",
"app.shortcut-help.delete": "Borrar",
"app.shortcut-help.duplicate": "Duplicar",
"app.lock-viewers.title": "Bloquear espectadores",
"app.lock-viewers.description": "Estas opciones le habilitan a restringir el uso de características específicas a los espectadores",
"app.lock-viewers.featuresLable": "Característica",
@ -737,13 +864,19 @@
"app.connection-status.next": "Página siguiente",
"app.connection-status.prev": "Página anterior",
"app.learning-dashboard.label": "Panel de análisis del aprendizaje",
"app.learning-dashboard.description": "Abrir panel con actividades de los usuarios",
"app.learning-dashboard.description": "Panel con las actividades de los usuarios",
"app.learning-dashboard.clickHereToOpen": "Abrir Panel de análisis del aprendizaje",
"app.recording.startTitle": "Iniciar grabación",
"app.recording.stopTitle": "Pausar grabación",
"app.recording.resumeTitle": "Continuar grabación",
"app.recording.startDescription": "Puede actuar sobre el botón de grabar nuevamente, más adelante, para pausar la grabación",
"app.recording.stopDescription": "¿Está seguro de querer pausar la grabación? Podrá continuar la grabación actuando sobre el botón nuevamente.",
"app.recording.notify.title": "Se ha iniciado la grabación",
"app.recording.notify.description": "Habrá una grabación disponible basada en el resto de esta sesión.",
"app.recording.notify.continue": "Continuar",
"app.recording.notify.leave": "Abandonar la sesión",
"app.recording.notify.continueLabel" : "Aceptar la grabación y continuar",
"app.recording.notify.leaveLabel" : "No aceptar la grabación y abandonar la reunión",
"app.videoPreview.cameraLabel": "Cámara",
"app.videoPreview.profileLabel": "Calidad",
"app.videoPreview.quality.low": "Bajo",
@ -760,13 +893,20 @@
"app.videoPreview.webcamOptionLabel": "Escoger webcam",
"app.videoPreview.webcamPreviewLabel": "Vista previa de la webcam",
"app.videoPreview.webcamSettingsTitle": "Configuración de la webcam",
"app.videoPreview.webcamEffectsTitle": "Efectos visuales de la cámara web",
"app.videoPreview.webcamVirtualBackgroundLabel": "Ajustes del fondo virtual",
"app.videoPreview.webcamVirtualBackgroundDisabledLabel": "Este dispositivo no soporta fondos virtuales",
"app.videoPreview.webcamNotFoundLabel": "Webcam no encontrada",
"app.videoPreview.profileNotFoundLabel": "Perfil de cámara no soportado",
"app.videoPreview.brightness": "Brillo",
"app.videoPreview.wholeImageBrightnessLabel": "Toda la imagen",
"app.videoPreview.wholeImageBrightnessDesc": "Aplica brillo a la transmisión y a la imagen de fondo.",
"app.videoPreview.sliderDesc": "Aumentar o disminuir los niveles de brillo",
"app.video.joinVideo": "Compartir webcam",
"app.video.connecting": "Ha empezado a compartir la cámara",
"app.video.leaveVideo": "Detener compartir webcam",
"app.video.videoSettings": "Ajustes de vídeo",
"app.video.visualEffects": "Efectos visuales",
"app.video.advancedVideo": "Abrir ajustes avanzados",
"app.video.iceCandidateError": "Error añadiendo candidato ICE",
"app.video.iceConnectionStateError": "Fallo de conexión (error ICE 1107)",
@ -782,6 +922,7 @@
"app.video.notReadableError": "No se pudo obtener video webcam. Por favor, asegúrese de que otro programa no está utilizándola",
"app.video.timeoutError": "El navegador no respondió a tiempo",
"app.video.genericError": "Un error desconocido ocurrió con el dispositivo (Error {0})",
"app.video.inactiveError": "Su cámara web se detuvo inesperadamente. Por favor revise los permisos de su navegador",
"app.video.mediaTimedOutError": "Se ha interrumpido la transmisión de tu cámara web. Prueba a compartirla de nuevo",
"app.video.mediaFlowTimeout1020": "Los medios audiovisuales no han podido alcanzar el servidor (error 1020)",
"app.video.suggestWebcamLock": "¿Aplicar la configuración de bloqueo a las cámaras web de los espectadores?",
@ -804,8 +945,17 @@
"app.video.virtualBackground.board": "Pizarra",
"app.video.virtualBackground.coffeeshop": "Cafetería",
"app.video.virtualBackground.background": "Fondo",
"app.video.virtualBackground.backgroundWithIndex": "Fondo {0}",
"app.video.virtualBackground.custom": "Subir desde tu computadora",
"app.video.virtualBackground.remove": "Borrar imagen añadida",
"app.video.virtualBackground.genericError": "No se pudo aplicar el efecto de la cámara. Inténtalo de nuevo.",
"app.video.virtualBackground.camBgAriaDesc": "Ajusta el fondo virtual de la cámara web a {0}",
"app.video.virtualBackground.maximumFileSizeExceeded": "Se excedió el tamaño máximo de archivo. ({0}MB)",
"app.video.virtualBackground.typeNotAllowed": "Tipo de archivo no permitido.",
"app.video.virtualBackground.errorOnRead": "Algo salió mal al leer el archivo.",
"app.video.virtualBackground.uploaded": "Subido",
"app.video.virtualBackground.uploading": "Subiendo...",
"app.video.virtualBackground.button.customDesc": "Añade una nueva imagen de fondo virtual",
"app.video.camCapReached": "No puedes compartir más cámaras",
"app.video.meetingCamCapReached": "Se ha alcanzado el límite de cámaras web simultáneas para esta reunión.",
"app.video.dropZoneLabel": "Soltar aquí",
@ -826,6 +976,7 @@
"app.whiteboard.annotations.poll": "Se han publicado los resultados de la encuesta",
"app.whiteboard.annotations.pollResult": "Resultados de la encuesta",
"app.whiteboard.annotations.noResponses": "Sin respuestas",
"app.whiteboard.annotations.notAllowed": "No tienes permiso para hacer este cambio.",
"app.whiteboard.toolbar.tools": "Herramientas",
"app.whiteboard.toolbar.tools.hand": "Expandir",
"app.whiteboard.toolbar.tools.pencil": "Lápiz",
@ -852,6 +1003,7 @@
"app.whiteboard.toolbar.color.silver": "Plata",
"app.whiteboard.toolbar.undo": "Deshacer anotación",
"app.whiteboard.toolbar.clear": "Limpiar todas las anotaciones",
"app.whiteboard.toolbar.clearConfirmation": "¿Estás seguro/a de que quieres borrar todas las anotaciones?",
"app.whiteboard.toolbar.multiUserOn": "Habilitar pizarra multiusuario",
"app.whiteboard.toolbar.multiUserOff": "Deshabilitar pizarra multiusuario",
"app.whiteboard.toolbar.palmRejectionOn": "Activar rechazo de petición de palabra",
@ -871,13 +1023,13 @@
"app.videoDock.webcamUnfocusDesc": "Desenfoque la cámara seleccionada",
"app.videoDock.webcamPinLabel": "Bloquear",
"app.videoDock.webcamPinDesc": "Bloquear la cámara web seleccionada",
"app.videoDock.webcamFullscreenLabel": "Cámara web a pantalla completa",
"app.videoDock.webcamSqueezedButtonLabel": "Opciones de webcam",
"app.videoDock.webcamUnpinLabel": "Desbloquear",
"app.videoDock.webcamUnpinLabelDisabled": "Solo Moderadores pueden desbloquear usuarios",
"app.videoDock.webcamUnpinDesc": "Desbloquear la cámara web seleccionada",
"app.videoDock.autoplayBlockedDesc": "Necesitamos su permiso para mostrarle las webcams de otros usuarios",
"app.videoDock.autoplayAllowLabel": "Ver webcams",
"app.invitation.title": "Invitación a sala externa",
"app.invitation.confirm": "Invitar",
"app.createBreakoutRoom.title": "Salas externas",
"app.createBreakoutRoom.ariaTitle": "Ocultar salas externas",
"app.createBreakoutRoom.breakoutRoomLabel": "Salas externas {0}",
@ -909,6 +1061,8 @@
"app.createBreakoutRoom.addRoomTime": "Incremente tiempo de la sala externa a ",
"app.createBreakoutRoom.addParticipantLabel": "+ Añadir participante",
"app.createBreakoutRoom.freeJoin": "Permitir a los usuarios escoger una sala externa a la que unirse",
"app.createBreakoutRoom.captureNotes": "Capturar notas compartidas cuando finalicen las salas de reuniones",
"app.createBreakoutRoom.captureSlides": "Capturar el encerado cuando finalicen las salas de reuniones",
"app.createBreakoutRoom.leastOneWarnBreakout": "Debe colocar al menos un usuario en la sala externa",
"app.createBreakoutRoom.minimumDurationWarnBreakout": "La duración mínima para una sala de un grupo de trabajo es de {0} minutos.",
"app.createBreakoutRoom.modalDesc": "Sugerencia: puede arrastrar y soltar el nombre de un usuario para asignarlo a una sala externa específica.",
@ -921,6 +1075,14 @@
"app.createBreakoutRoom.setTimeCancel": "Cancelar",
"app.createBreakoutRoom.setTimeHigherThanMeetingTimeError": "La duración de los grupos de trabajo no puede exceder el tiempo de reunión restante.",
"app.createBreakoutRoom.roomNameInputDesc": "Actualiza el nombre de la sala de los grupos de trabajo",
"app.createBreakoutRoom.movedUserLabel": "Movido/a {0} a la sala {1}",
"app.updateBreakoutRoom.modalDesc": "Para actualizar o invitar a un/a usuario/a, simplemente arrástrelo/a a la sala deseada.",
"app.updateBreakoutRoom.cancelLabel": "Cancelar",
"app.updateBreakoutRoom.title": "Actualizar salas de reuniones",
"app.updateBreakoutRoom.confirm": "Aplicar",
"app.updateBreakoutRoom.userChangeRoomNotification": "Te trasladaron a la sala {0}.",
"app.smartMediaShare.externalVideo": "Vídeo(s) externo(s)",
"app.update.resetRoom": "Restablecer sala de usuario",
"app.externalVideo.start": "Compartir un nuevo video",
"app.externalVideo.title": "Compartir un video externo",
"app.externalVideo.input": "URL de video externo",
@ -946,6 +1108,15 @@
"app.debugWindow.form.enableAutoarrangeLayoutDescription": "(se deshabilitará si se arrastra o redimensiona el área de las cámaras)",
"app.debugWindow.form.chatLoggerLabel": " Probar los niveles de registro de la conversación",
"app.debugWindow.form.button.apply": "Aplicar",
"app.layout.modal.title": "Diseños",
"app.layout.modal.confirm": "Confirmar",
"app.layout.modal.cancel": "Cancelar",
"app.layout.modal.layoutLabel": "Selecciona tu diseño",
"app.layout.modal.keepPushingLayoutLabel": "Forzar diseño a todos/as",
"app.layout.modal.pushLayoutLabel": "Forzar para todos/as",
"app.layout.modal.layoutToastLabel": "Ha cambiado la configuración del diseño",
"app.layout.modal.layoutSingular": "Diseño",
"app.layout.modal.layoutBtnDesc": "Establece el diseño como opción seleccionada",
"app.layout.style.custom": "Personalizado",
"app.layout.style.smart": "Diseño inteligente",
"app.layout.style.presentationFocus": "Establecer foco en la presentación",
@ -995,6 +1166,7 @@
"playback.player.thumbnails.wrapper.aria": "Zona de miniaturas",
"playback.player.webcams.wrapper.aria": "Zona de webcams",
"app.learningDashboard.dashboardTitle": "Panel de análisis del aprendizaje",
"app.learningDashboard.bigbluebuttonTitle": "BigBlueButton",
"app.learningDashboard.downloadSessionDataLabel": "Descargar datos de la sesión",
"app.learningDashboard.lastUpdatedLabel": "Última actualización el",
"app.learningDashboard.sessionDataDownloadedLabel": "¡Descargado!",
@ -1019,13 +1191,19 @@
"app.learningDashboard.userDetails.response": "Respuesta",
"app.learningDashboard.userDetails.mostCommonAnswer": "Respuesta más común",
"app.learningDashboard.userDetails.anonymousAnswer": "Encuesta anónima",
"app.learningDashboard.userDetails.talkTime": "Tiempo de conversación",
"app.learningDashboard.userDetails.messages": "Mensajes",
"app.learningDashboard.userDetails.emojis": "Emojis",
"app.learningDashboard.userDetails.raiseHands": "Levantar las manos",
"app.learningDashboard.userDetails.pollVotes": "Votos en la encuesta",
"app.learningDashboard.userDetails.onlineIndicator": " {0} tiempo en línea",
"app.learningDashboard.usersTable.title": "Vista general",
"app.learningDashboard.usersTable.colOnline": "Tiempo en línea",
"app.learningDashboard.usersTable.colTalk": "Tiempo de conversación",
"app.learningDashboard.usersTable.colWebcam": "Tiempo de webcam",
"app.learningDashboard.usersTable.colMessages": "Mensajes",
"app.learningDashboard.usersTable.colEmojis": "Emojis",
"app.learningDashboard.usersTable.colRaiseHands": "Manos levantadas",
"app.learningDashboard.usersTable.colRaiseHands": "Levantar las manos",
"app.learningDashboard.usersTable.colActivityScore": "Puntuación en la actividad",
"app.learningDashboard.usersTable.colStatus": "Estado",
"app.learningDashboard.usersTable.userStatusOnline": "En línea",
@ -1042,8 +1220,13 @@
"app.learningDashboard.pollsTable.anonymousRowName": "Anónimo",
"app.learningDashboard.pollsTable.noPollsCreatedHeading": "No se han creado encuestas",
"app.learningDashboard.pollsTable.noPollsCreatedMessage": "Una vez activada la encuesta, los resultados se mostrarán en esta lista.",
"app.learningDashboard.pollsTable.answerTotal": "Total",
"app.learningDashboard.pollsTable.userLabel": "Usuario/a",
"app.learningDashboard.statusTimelineTable.title": "Cronología",
"app.learningDashboard.statusTimelineTable.thumbnail": "Miniaturas de la presentación",
"app.learningDashboard.statusTimelineTable.presentation": "Presentación",
"app.learningDashboard.statusTimelineTable.pageNumber": "Página",
"app.learningDashboard.statusTimelineTable.setAt": "Fijado en",
"app.learningDashboard.errors.invalidToken": "Token de sesión inválido",
"app.learningDashboard.errors.dataUnavailable": "Los datos ya no están disponibles",
"mobileApp.portals.list.empty.addFirstPortal.label": "Añade tu primer portal usando el botón superior,",
@ -1057,6 +1240,4 @@
"mobileApp.portals.addPortalPopup.validation.emptyFields": "Campos requeridos",
"mobileApp.portals.addPortalPopup.validation.portalNameAlreadyExists": "El nombre ya está en uso",
"mobileApp.portals.addPortalPopup.validation.urlInvalid": "Error al intentar cargar la página - comprueba la URL y la conexión de red"
}

View File

@ -2,10 +2,11 @@
"app.home.greeting": "A súa presentación comezará en breve…",
"app.chat.submitLabel": "Enviar mensaxe",
"app.chat.loading": "Mensaxes de conversa cargadas: {0}%",
"app.chat.errorMaxMessageLength": "A mensaxe ten {0} carácter(es) mais do admitido",
"app.chat.errorMaxMessageLength": "A mensaxe é demasiado longa, superou o máximo de {0} caracteres",
"app.chat.disconnected": "Esta desconectado, non é posíbel enviar as mensaxes",
"app.chat.locked": "Conversa bloqueado, anon é posíbel enviar as mensaxes",
"app.chat.inputLabel": "Entrada de mensaxe para a conversa {0}",
"app.chat.emojiButtonLabel": "Selector de emojis",
"app.chat.inputPlaceholder": "Mensaxe {0}",
"app.chat.titlePublic": "Conversa pública",
"app.chat.titlePrivate": "Conversa privada con {0}.",
@ -21,6 +22,7 @@
"app.chat.offline": "Sen conexión",
"app.chat.pollResult": "Resultados da enquisa",
"app.chat.breakoutDurationUpdated": "O tempo restante da sala parcial é agora de {0} minutos",
"app.chat.breakoutDurationUpdatedModerator": "O tempo das salas de descanso é agora de {0} minutos, e enviouse unha notificación.",
"app.chat.emptyLogLabel": "Rexistro da conversa baleiro",
"app.chat.clearPublicChatMessage": "A conversa publica foi retirada por un moderador",
"app.chat.multi.typing": "Varios usuarios están a escribir",
@ -28,6 +30,27 @@
"app.chat.two.typing": "{0} e {1} están a escribir",
"app.chat.copySuccess": "A conversa transcrita foi copiada",
"app.chat.copyErr": "Produciuse un erro ao copiar a conversa transcrita",
"app.emojiPicker.search": "Buscar",
"app.emojiPicker.notFound": "Non se atoparon Emojis",
"app.emojiPicker.skintext": "Escolla o seu ton de pel predeterminado",
"app.emojiPicker.clear": "Borrar",
"app.emojiPicker.categories.label": "Categorías de Emoji",
"app.emojiPicker.categories.people": "Persoas e Corpo",
"app.emojiPicker.categories.nature": "Animais e Natureza",
"app.emojiPicker.categories.foods": "Comida e bebida",
"app.emojiPicker.categories.places": "Viaxes e lugares",
"app.emojiPicker.categories.activity": "Actividades",
"app.emojiPicker.categories.objects": "Obxectos",
"app.emojiPicker.categories.symbols": "Símbolos",
"app.emojiPicker.categories.flags": "Bandeiras",
"app.emojiPicker.categories.recent": "Usados frecuentemente",
"app.emojiPicker.categories.search": "Buscar resultados",
"app.emojiPicker.skintones.1": "Ton de pel predeterminado",
"app.emojiPicker.skintones.2": "Ton de pel claro",
"app.emojiPicker.skintones.3": "Ton de pel medio-claro",
"app.emojiPicker.skintones.4": "Ton de pel medio",
"app.emojiPicker.skintones.5": "Ton de pel medio-escuro",
"app.emojiPicker.skintones.6": "Ton de pel escuro",
"app.captions.label": "Subtítulos",
"app.captions.menu.close": "Pechar",
"app.captions.menu.start": "Comezar",
@ -53,12 +76,21 @@
"app.captions.speech.start": "Comezou o recoñecemento de voz",
"app.captions.speech.stop": "O recoñecemento de voz detívose",
"app.captions.speech.error": "O recoñecemento de voz detívose por mor da incompatibilidade do navegador ou dalgún tempo de silencio",
"app.confirmation.skipConfirm": "Non preguntar de novo",
"app.confirmation.virtualBackground.title": "Comezar novo fondo virtual",
"app.confirmation.virtualBackground.description": "{0} engadirase como fondo virtual. Continuar?",
"app.confirmationModal.yesLabel": "Sí",
"app.textInput.sendLabel": "Enviar",
"app.title.defaultViewLabel": "Vista predeterminada de presentación",
"app.notes.title": "Notas compartidas",
"app.notes.label": "Notas",
"app.notes.hide": "Agochar as notas",
"app.notes.locked": "Bloqueado",
"app.notes.disabled": "Fixado na área multimedia",
"app.notes.notesDropdown.covertAndUpload": "Converter notas en presentación",
"app.notes.notesDropdown.pinNotes": "Fixar notas na pizarra",
"app.notes.notesDropdown.unpinNotes": "Retirar fixación das notas",
"app.notes.notesDropdown.notesOptions": "Opcións das notas",
"app.pads.hint": "Prema Esc para enfocar a barra de ferramentas do caderno de notas",
"app.user.activityCheck": "Comprobar a actividade do usuario",
"app.user.activityCheck.label": "Comprobar se o usuario aínda está na xuntanza ({0})",
@ -170,7 +202,7 @@
"app.presentation.endSlideContent": "Fin do contido das diapositivas",
"app.presentation.changedSlideContent": "A presentación cambiou á diapositiva: {0}",
"app.presentation.emptySlideContent": "Non hai contido para a diapositiva actual",
"app.presentation.options.fullscreen": "Pantalla completa",
"app.presentation.options.fullscreen": "Presentación en pantalla completa",
"app.presentation.options.exitFullscreen": "Saír da pantalla completa",
"app.presentation.options.minimize": "Minimizar",
"app.presentation.options.snapshot": "Instantánea da diapositiva actual",
@ -203,7 +235,18 @@
"app.presentation.presentationToolbar.goToSlide": "Diapositiva {0}",
"app.presentation.placeholder": "Non hai ningunha presentación activa actualmente",
"app.presentationUploder.title": "Presentación",
"app.presentationUploder.message": "Como presentador tes a posibilidade de enviar calquera documento de oficina ou ficheiro PDF. Recomendamos o ficheiro PDF para obter mellores resultados. Asegúrese de que a presentación está seleccionada usando o selector circular na parte dereita. ",
"app.presentationUploder.message": "Como presentador tes a posibilidade de cargar calquera documento ofimático ou ficheiro PDF. Recomendamos o ficheiro PDF para obter os mellores resultados. Asegúrate de seleccionar unha presentación usando a caixa de verificación circular do lado esquerdo.",
"app.presentationUploader.exportHint": "Ao seleccionar \"Enviar ao chat\" proporcionarase aos usuarios unha ligazón para descargar con anotacións no chat público.",
"app.presentationUploader.exportToastHeader": "Enviando ao chat (elemento {0})",
"app.presentationUploader.exportToastHeaderPlural": "Enviando ao chat ({0} elementos)",
"app.presentationUploader.exporting": "Enviando ao chat",
"app.presentationUploader.sending": "Enviando...",
"app.presentationUploader.collecting": "Extraendo a diapositiva {0} de {1}...",
"app.presentationUploader.processing": "Anotando diapositiva {0} de {1}...",
"app.presentationUploader.sent": "Enviado",
"app.presentationUploader.exportingTimeout": "A exportación está tardando demasiado...",
"app.presentationUploader.export": "Enviar para o chat",
"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",
"app.presentationUploder.confirmLabel": "Confirmar",
@ -214,6 +257,8 @@
"app.presentationUploder.dropzoneImagesLabel": "Arrastre as imaxes aquí para envialas",
"app.presentationUploder.browseFilesLabel": "ou busque os ficheiros",
"app.presentationUploder.browseImagesLabel": "ou busque as imaxes",
"app.presentationUploder.externalUploadTitle": "Engade contido dunha aplicación de terceiros",
"app.presentationUploder.externalUploadLabel": "Explorar ficheiros",
"app.presentationUploder.fileToUpload": "Para ser enviado…",
"app.presentationUploder.currentBadge": "Actual",
"app.presentationUploder.rejectedError": "O(s) ficheiro(s) seleccionado(s) foi(foron) rexeitado(s). Revise o(os) tipo(s) de ficheiro.",
@ -230,14 +275,14 @@
"app.presentationUploder.conversion.generatedSlides": "Presentacións xeradas…",
"app.presentationUploder.conversion.generatingSvg": "Xerando imaxes SVG…",
"app.presentationUploder.conversion.pageCountExceeded": "O número de páxinas superou o máximo de {0}",
"app.presentationUploder.conversion.invalidMimeType": "Detectouse un formato non válido (extensión={0}, tipo de contido={1})",
"app.presentationUploder.conversion.conversionTimeout": "Non se puido procesar a diapositiva {0} en {1} intentos.",
"app.presentationUploder.conversion.officeDocConversionInvalid": "Produciuse un fallo ao procesar o documento de oficina. No seu lugar envíe un PDF.",
"app.presentationUploder.conversion.officeDocConversionFailed": "Produciuse un fallo ao procesar o documento de oficina. No seu lugar envíe un PDF.",
"app.presentationUploder.conversion.pdfHasBigPage": "Non foi posíbel converter o ficheiro PDF. Tente optimizalo. Tamaño máximo de páxina {0}",
"app.presentationUploder.conversion.timeout": " Ouh! a conversión tomou demasiado tempo",
"app.presentationUploder.conversion.pageCountFailed": "Produciuse un fallo ao determinar o número de páxinas.",
"app.presentationUploder.conversion.unsupportedDocument": "Extensión de ficheiro non se admitida",
"app.presentationUploder.isDownloadableLabel": "Non está permitida a descarga da presentación; prema para permitir a descarga da presentación",
"app.presentationUploder.isNotDownloadableLabel": "Permítese a descarga de presentacións: prema para non permitir a descarga de presentacións",
"app.presentationUploder.removePresentationLabel": "Retirar a presentación",
"app.presentationUploder.setAsCurrentPresentation": "Estabelecer a presentación como actual",
"app.presentationUploder.tableHeading.filename": "Nome de ficheiro",
@ -251,6 +296,10 @@
"app.presentationUploder.clearErrors": "Limpar os erros",
"app.presentationUploder.clearErrorsDesc": "Limpar os envíos de presentación fallados",
"app.presentationUploder.uploadViewTitle": "Enviar presentación",
"app.poll.questionAndoptions.label" : "Texto da pregunta que se amosará.\nA. Opción de enquisa *\nB. Opción de enquisa (opcional)\nC. Opción de enquisa (opcional)\nD. Opción de enquisa (opcional)\nE. Opción de enquisa (opcional)",
"app.poll.customInput.label": "Entrada personalizada",
"app.poll.customInputInstructions.label": "A entrada personalizada está activada: escribe a pregunta de enquisa e as opcións nun formato determinado ou arrastra e solta un ficheiro de texto no mesmo formato.",
"app.poll.maxOptionsWarning.label": "Só se poden usar as 5 primeiras opcións!",
"app.poll.pollPaneTitle": "Enquisa",
"app.poll.enableMultipleResponseLabel": "Permitir varias respostas por enquisado?",
"app.poll.quickPollTitle": "Enquisa rápida",
@ -270,7 +319,7 @@
"app.poll.clickHereToSelect": "Prema aquí para seleccionar",
"app.poll.question.label" : "Escriba a súa pregunta...",
"app.poll.optionalQuestion.label" : "Escriba a súa pregunta (opcional)...",
"app.poll.userResponse.label" : "Resposta do usuario",
"app.poll.userResponse.label" : "Resposta escrita",
"app.poll.responseTypes.label" : "Tipos de resposta",
"app.poll.optionDelete.label" : "Eliminar",
"app.poll.responseChoices.label" : "Opcións de resposta",
@ -329,7 +378,7 @@
"app.muteWarning.disableMessage": "Alertas de silenciamento desactivadas ata que se active o son",
"app.muteWarning.tooltip": "Prema para pechar e desactivar a advertencia ata a próxima vez que se desactive o silenciamento",
"app.navBar.settingsDropdown.optionsLabel": "Opcións",
"app.navBar.settingsDropdown.fullscreenLabel": "Poñer a pantalla completa",
"app.navBar.settingsDropdown.fullscreenLabel": "Presentación en pantalla completa",
"app.navBar.settingsDropdown.settingsLabel": "Axustes",
"app.navBar.settingsDropdown.aboutLabel": "Sobre",
"app.navBar.settingsDropdown.leaveSessionLabel": "Abandonar a xuntanza",
@ -342,6 +391,7 @@
"app.navBar.settingsDropdown.hotkeysLabel": "Atallos de teclado",
"app.navBar.settingsDropdown.hotkeysDesc": "Lista de atallos de teclado dispoñíbeis",
"app.navBar.settingsDropdown.helpLabel": "Axuda",
"app.navBar.settingsDropdown.openAppLabel": "Abrir na aplicación BigBlueButton Tablet",
"app.navBar.settingsDropdown.helpDesc": "Vincular o usuario a vídeo titoriais (abre unha nova lapela)",
"app.navBar.settingsDropdown.endMeetingDesc": "Finaliza a sesión actual",
"app.navBar.settingsDropdown.endMeetingLabel": "Rematar a xuntanza",
@ -359,7 +409,7 @@
"app.endMeeting.description": "Esta acción rematará a sesión para {0} usuarios activos. Confirma que que quere rematar esta sesión?",
"app.endMeeting.noUserDescription": "Confirma que quere rematar esta sesión?",
"app.endMeeting.contentWarning": "As mensaxes da conversa, as notas compartidas, o contido do encerado e os documentos compartidos desta sesión deixarán de ser accesibles directamente",
"app.endMeeting.yesLabel": "Si",
"app.endMeeting.yesLabel": "Finalizar a sesión para todos os usuarios",
"app.endMeeting.noLabel": "Non",
"app.about.title": "Sobre",
"app.about.version": "Versión do cliente:",
@ -369,6 +419,15 @@
"app.about.confirmDesc": "Aceptar",
"app.about.dismissLabel": "Cancelar",
"app.about.dismissDesc": "Pechar a información sobre o cliente",
"app.mobileAppModal.title": "Abrir a aplicación BigBlueButton Tablet",
"app.mobileAppModal.description": "Tes a aplicación BigBlueButton Tablet instalada no teu dispositivo?",
"app.mobileAppModal.openApp": "Si, abre a aplicación agora",
"app.mobileAppModal.obtainUrlMsg": "Obtendo da URL da reunión",
"app.mobileAppModal.obtainUrlErrorMsg": "Produciuse un erro ao tentar obter a URL da reunión",
"app.mobileAppModal.openStore": "Non, abre a App Store para descargar",
"app.mobileAppModal.dismissLabel": "Cancelar",
"app.mobileAppModal.dismissDesc": "Pechar",
"app.mobileAppModal.userConnectedWithSameId": "O usuario {0} acaba de conectarse co mesmo ID que ti.",
"app.actionsBar.changeStatusLabel": "Cambiar o estado",
"app.actionsBar.muteLabel": "Desactivar o son",
"app.actionsBar.unmuteLabel": "Devolver o son ",
@ -379,10 +438,12 @@
"app.actionsBar.actionsDropdown.restorePresentationDesc": "Botón para restaurar a presentación após ser minimizada",
"app.actionsBar.actionsDropdown.minimizePresentationLabel": "Minimizar a presentación",
"app.actionsBar.actionsDropdown.minimizePresentationDesc": "Botón usado para minimizar a presentación",
"app.actionsBar.actionsDropdown.layoutModal": "Configuración do deseño",
"app.screenshare.screenShareLabel" : "Compartir pantalla",
"app.submenu.application.applicationSectionTitle": "Aplicación",
"app.submenu.application.animationsLabel": "Animacións",
"app.submenu.application.audioFilterLabel": " Filtros de son para o micrófono",
"app.submenu.application.darkThemeLabel": "Modo escuro",
"app.submenu.application.fontSizeControlLabel": "Tamaño da letra",
"app.submenu.application.increaseFontBtnLabel": "Incrementar o tamaño da letra",
"app.submenu.application.decreaseFontBtnLabel": "Diminuír o tamaño da letra",
@ -392,6 +453,7 @@
"app.submenu.application.noLocaleOptionLabel": "Non hai locais activos",
"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.notification.SectionTitle": "Notificacións",
"app.submenu.notification.Desc": "Definir como e que se lle notificará.",
"app.submenu.notification.audioAlertLabel": "Avisos sonoros",
@ -420,7 +482,7 @@
"app.settings.main.save.label.description": "Gardar os cambios e pechar o menú de axustes",
"app.settings.dataSavingTab.label": "Aforro de datos",
"app.settings.dataSavingTab.webcam": "Activar as cámaras web",
"app.settings.dataSavingTab.screenShare": "Activar o escritorio compartido",
"app.settings.dataSavingTab.screenShare": "Activa o uso compartido do escritorio doutros participantes",
"app.settings.dataSavingTab.description": "Para aforrar largo de banda axuste o que se se está a amosar",
"app.settings.save-notification.label": "Gardáronse os axustes",
"app.statusNotifier.lowerHands": "Mans baixadas",
@ -440,7 +502,6 @@
"app.actionsBar.actionsDropdown.presentationLabel": "Xestionar presentacións",
"app.actionsBar.actionsDropdown.initPollLabel": "Iniciar unha enquisa",
"app.actionsBar.actionsDropdown.desktopShareLabel": "Compartir a súa pantalla",
"app.actionsBar.actionsDropdown.lockedDesktopShareLabel": "A pantalla compartida está bloqueada",
"app.actionsBar.actionsDropdown.stopDesktopShareLabel": "Deixar de compartir a súa pantalla",
"app.actionsBar.actionsDropdown.presentationDesc": "Enviar a súa presentación",
"app.actionsBar.actionsDropdown.initPollDesc": "Iniciar unha enquisa",
@ -457,6 +518,7 @@
"app.actionsBar.actionsDropdown.takePresenterDesc": "Asignarse a un mesmo como novo presentador",
"app.actionsBar.actionsDropdown.selectRandUserLabel": "Seleccionar un usuario ao chou",
"app.actionsBar.actionsDropdown.selectRandUserDesc": "Escoller ao chou un usuario entre os espectadores dispoñíbeis",
"app.actionsBar.actionsDropdown.propagateLayoutLabel": "Propagación do deseño",
"app.actionsBar.emojiMenu.statusTriggerLabel": "Estabelecer o estado",
"app.actionsBar.emojiMenu.awayLabel": "Ausente",
"app.actionsBar.emojiMenu.awayDesc": "Cambiar o seu estado a ausente",
@ -496,6 +558,7 @@
"app.audioNotification.audioFailedError1012": "Conexión pechada (erro ICE 1012)",
"app.audioNotification.audioFailedMessage": "Produciuse un fallo na súa conexión de son",
"app.audioNotification.mediaFailedMessage": "Produciuse un fallo en getUserMicMedia xa que só se permiten as orixes seguras",
"app.audioNotification.deviceChangeFailed": "Produciuse un erro no cambio do dispositivo de audio. Comproba se o dispositivo escollido está correctamente configurado e dispoñible",
"app.audioNotification.closeLabel": "Pechar",
"app.audioNotificaion.reconnectingAsListenOnly": "O micrófono bloqueouse para os espectadores, vostede está conectado só como oínte",
"app.breakoutJoinConfirmation.title": "Unirse á sala parcial",
@ -509,6 +572,7 @@
"app.breakout.dropdown.manageDuration": "Cambiar a duración",
"app.breakout.dropdown.destroyAll": "Remate das salas parciais",
"app.breakout.dropdown.options": "Opcións das salas parciais",
"app.breakout.dropdown.manageUsers": "Xestionar usuarios",
"app.calculatingBreakoutTimeRemaining": "Calculando tempo restante…",
"app.audioModal.ariaTitle": " Xanela modal para unirse ao son",
"app.audioModal.microphoneLabel": "Micrófono",
@ -555,6 +619,7 @@
"app.audio.changeAudioDevice": "Cambiar o dispositivo de son",
"app.audio.enterSessionLabel": "Entrar na sesión",
"app.audio.playSoundLabel": "Reproducir son",
"app.audio.stopAudioFeedback": "Deter a retroalimentación de audio",
"app.audio.backLabel": "Atrás",
"app.audio.loading": "Cargando",
"app.audio.microphones": "Micrófonos",
@ -567,10 +632,32 @@
"app.audio.audioSettings.testSpeakerLabel": "Probar o seu altofalante",
"app.audio.audioSettings.microphoneStreamLabel": "O seu volume do fluxo de son",
"app.audio.audioSettings.retryLabel": "Tentar de novo",
"app.audio.audioSettings.fallbackInputLabel": "Entrada de audio {0}",
"app.audio.audioSettings.fallbackOutputLabel": "Saída de audio {0}",
"app.audio.audioSettings.defaultOutputDeviceLabel": "Por defecto",
"app.audio.audioSettings.findingDevicesLabel": "Buscando dispositivos...",
"app.audio.listenOnly.backLabel": "Atrás",
"app.audio.listenOnly.closeLabel": "Pechar",
"app.audio.permissionsOverlay.title": "Permitir o acceso ao seu micrófono",
"app.audio.permissionsOverlay.hint": "Necesitamos que nos permita usar os seus dispositivos multimedia para unilo á conferencia de voz :)",
"app.audio.captions.button.start": "Iniciar subtítulos",
"app.audio.captions.button.stop": "Deter os subtítulos",
"app.audio.captions.button.language": "Idioma",
"app.audio.captions.button.transcription": "Transcrición",
"app.audio.captions.button.transcriptionSettings": "Configuración de transcrición",
"app.audio.captions.speech.title": "Transcrición automática",
"app.audio.captions.speech.disabled": "Desactivado",
"app.audio.captions.speech.unsupported": "O teu navegador non admite o recoñecemento de voz. O teu audio non se transcribirá",
"app.audio.captions.select.de-DE": "Alemán",
"app.audio.captions.select.en-US": "Inglés",
"app.audio.captions.select.es-ES": "Español",
"app.audio.captions.select.fr-FR": "Francés",
"app.audio.captions.select.hi-ID": "Hindi",
"app.audio.captions.select.it-IT": "Italiano",
"app.audio.captions.select.ja-JP": "Xaponés",
"app.audio.captions.select.pt-BR": "Portugués",
"app.audio.captions.select.ru-RU": "Ruso",
"app.audio.captions.select.zh-CN": "Chinés",
"app.error.removed": "Vostede foi retirado/a da conferencia",
"app.error.meeting.ended": "Vostede desconectouse da conferencia",
"app.meeting.logout.duplicateUserEjectReason": "Usuario duplicado tentando unirse á xuntanza",
@ -578,6 +665,7 @@
"app.meeting.logout.ejectedFromMeeting": "Vostede foi retirado/a da xuntanza",
"app.meeting.logout.validateTokenFailedEjectReason": "Produciuse un erro ao validar o testemuño de autorización",
"app.meeting.logout.userInactivityEjectReason": "Usuario inactivo durante demasiado tempo",
"app.meeting.logout.maxParticipantsReached": "Alcanzouse o número máximo de participantes permitido para esta reunión",
"app.meeting-ended.rating.legendLabel": "Valoración de comentarios",
"app.meeting-ended.rating.starLabel": "Estrela",
"app.modal.close": "Pechar",
@ -599,8 +687,11 @@
"app.error.403": "Vostede foi retirado/a da xuntanza",
"app.error.404": "Non se atopou",
"app.error.408": "Produciuse un fallo de autenticación",
"app.error.409": "Conflito",
"app.error.410": "Rematou a xuntanza",
"app.error.500": "Ouh! algo foi mal",
"app.error.503": "Desconectácheste",
"app.error.disconnected.rejoin": "Podes actualizar a páxina para unirte de novo.",
"app.error.userLoggedOut": "O usuario ten un testemuño de sesión non válido por mor do peche da sesión",
"app.error.ejectedUser": "O usuario ten un testemuño de sesión non válido por mor da expulsión",
"app.error.joinedAnotherWindow": "Semella que esta sesión está aberta noutra xanela do navegador.",
@ -644,14 +735,18 @@
"app.userList.guest.privateMessageLabel": "Mensaxe",
"app.userList.guest.acceptLabel": "Aceptar",
"app.userList.guest.denyLabel": "Denegar",
"app.userList.guest.feedbackMessage": "Acción aplicada:",
"app.user-info.title": "Atopar directorio",
"app.toast.breakoutRoomEnded": "A sala parcial rematou. Volva incorporarse ao son.",
"app.toast.chat.public": "Nova mensaxe na conversa pública",
"app.toast.chat.private": "Nova mensaxe na conversa privada",
"app.toast.chat.system": "Sistema",
"app.toast.chat.poll": "Resultados da enquisa",
"app.toast.chat.pollClick": "Publicáronse os resultados das enquisas. Fai clic aquí para ver.",
"app.toast.clearedEmoji.label": "Estado do emoji limpo",
"app.toast.setEmoji.label": "Estado do emoji cambiado a {0}",
"app.toast.meetingMuteOn.label": "Todos os usuarios foron silenciados",
"app.toast.meetingMuteOnViewers.label": "Todos os espectadores foron silenciados",
"app.toast.meetingMuteOff.label": "Desactivouse a reunión silenciosa",
"app.toast.setEmoji.raiseHand": "Vostede ergueu a man",
"app.toast.setEmoji.lowerHand": "A túa man foi baixada",
@ -688,6 +783,38 @@
"app.shortcut-help.toggleFullscreenKey": "Intro",
"app.shortcut-help.nextSlideKey": "Frecha dereita",
"app.shortcut-help.previousSlideKey": "Frecha esquerda",
"app.shortcut-help.select": "Selecciona Ferramenta",
"app.shortcut-help.pencil": "Lapis",
"app.shortcut-help.eraser": "Borrador",
"app.shortcut-help.rectangle": "Rectángulo",
"app.shortcut-help.elipse": "Elipse",
"app.shortcut-help.triangle": "Triángulo",
"app.shortcut-help.line": "Liña",
"app.shortcut-help.arrow": "Frecha",
"app.shortcut-help.text": "Ferramenta de texto",
"app.shortcut-help.note": "Nota adhesiva",
"app.shortcut-help.general": "Xeral",
"app.shortcut-help.presentation": "Presentación",
"app.shortcut-help.whiteboard": "Encerado",
"app.shortcut-help.zoomIn": "Achegarse",
"app.shortcut-help.zoomOut": "Afastarse",
"app.shortcut-help.zoomFit": "Restaurar o zoom",
"app.shortcut-help.zoomSelect": "Zoom á selección",
"app.shortcut-help.flipH": "Volteo horizontal",
"app.shortcut-help.flipV": "Volteo vertical",
"app.shortcut-help.lock": "Bloquear / Desbloquear",
"app.shortcut-help.moveToFront": "Mover ao fronte",
"app.shortcut-help.moveToBack": "Mover cara atrás",
"app.shortcut-help.moveForward": "Mover cara adiante",
"app.shortcut-help.moveBackward": "Mover cara atrás",
"app.shortcut-help.undo": "Desfacer",
"app.shortcut-help.redo": "Refacer",
"app.shortcut-help.cut": "Cortar",
"app.shortcut-help.copy": "Copiar",
"app.shortcut-help.paste": "Pegar",
"app.shortcut-help.selectAll": "Seleccionar todo",
"app.shortcut-help.delete": "Borrar",
"app.shortcut-help.duplicate": "Duplicar",
"app.lock-viewers.title": "Bloquear aos espectadores",
"app.lock-viewers.description": "Estas opcións permítenlle restrinxir aos espectadores o uso de funcións específicas.",
"app.lock-viewers.featuresLable": "Función",
@ -737,13 +864,19 @@
"app.connection-status.next": "Seguinte páxina",
"app.connection-status.prev": "Páxina anterior",
"app.learning-dashboard.label": " Taboleiro de análise da aprendizaxe",
"app.learning-dashboard.description": "Abrir o taboleiro co control de actividades dos asistentes",
"app.learning-dashboard.description": "Taboleiro coas actividades dos usuarios",
"app.learning-dashboard.clickHereToOpen": "Abrir o taboleiro de análise da aprendizaxe",
"app.recording.startTitle": "Iniciar a gravación",
"app.recording.stopTitle": "Pausar a gravación",
"app.recording.resumeTitle": "Continuar coa gravación",
"app.recording.startDescription": "Máis tarde pode usar o botón de gravación para deter a gravación.",
"app.recording.stopDescription": "Confirma que quere deter a gravación? Pode continuala premendo de novo o botón de gravación.",
"app.recording.notify.title": "Comezou a gravación",
"app.recording.notify.description": "Haberá unha gravación dispoñible en función do resto desta sesión",
"app.recording.notify.continue": "Continuar",
"app.recording.notify.leave": "Abandonar a xuntanza",
"app.recording.notify.continueLabel" : "Aceptar a gravación e continuar",
"app.recording.notify.leaveLabel" : "Non aceptar a gravación e saír da reunión",
"app.videoPreview.cameraLabel": "Cámara web",
"app.videoPreview.profileLabel": "Calidade",
"app.videoPreview.quality.low": "Baixa",
@ -760,13 +893,20 @@
"app.videoPreview.webcamOptionLabel": "Seleccionar a cámara web",
"app.videoPreview.webcamPreviewLabel": "Vista preliminar de cámara web",
"app.videoPreview.webcamSettingsTitle": "Axustes da cámara web",
"app.videoPreview.webcamEffectsTitle": "Efectos visuais da cámara web",
"app.videoPreview.webcamVirtualBackgroundLabel": "Axustes do fondo virtual",
"app.videoPreview.webcamVirtualBackgroundDisabledLabel": "Este dispositivo non admite fondos virtuais",
"app.videoPreview.webcamNotFoundLabel": "Non se atopou a cámara web",
"app.videoPreview.profileNotFoundLabel": "Non hai ningún perfil de cámara admitido",
"app.videoPreview.brightness": "Brillo",
"app.videoPreview.wholeImageBrightnessLabel": "Imaxe completa",
"app.videoPreview.wholeImageBrightnessDesc": "Aplica brillo ao fluxo e á imaxe de fondo",
"app.videoPreview.sliderDesc": "Aumentar ou diminuír os niveis de brillo",
"app.video.joinVideo": "Compartir a cámara web",
"app.video.connecting": "Esta a comezar o uso compartido da cámara web…",
"app.video.leaveVideo": "Deixar de compartir a cámara web",
"app.video.videoSettings": "Configuración do vídeo",
"app.video.visualEffects": "Efectos visuais",
"app.video.advancedVideo": "Abrir os axustes avanzados",
"app.video.iceCandidateError": "Produciuse un erro ao engadir un candidato ICE",
"app.video.iceConnectionStateError": "Produciuse un fallo de conexión (erro ICE 1107)",
@ -782,6 +922,7 @@
"app.video.notReadableError": "Non foi posíbel obter vídeo da cámara web. Asegúrese de que outro programa non estea a usar a cámara web",
"app.video.timeoutError": "O navegador non respondeu a tempo.",
"app.video.genericError": "Produciuse un erro descoñecido co dispositivo (erro {0})",
"app.video.inactiveError": "A túa cámara web parouse inesperadamente. Revisa os permisos do teu navegador",
"app.video.mediaTimedOutError": "A transmisión da súa cámara web foi interrompida. Tente compartila de novo",
"app.video.mediaFlowTimeout1020": "Os recursos multimedia non foron quen de acadar o servidor (erro 1020)",
"app.video.suggestWebcamLock": "Forzar os axustes de bloqueo para as cámaras web dos espectadores?",
@ -804,8 +945,17 @@
"app.video.virtualBackground.board": "Taboleiro",
"app.video.virtualBackground.coffeeshop": "Cafetería",
"app.video.virtualBackground.background": "Fondo",
"app.video.virtualBackground.backgroundWithIndex": "Fondo {0}",
"app.video.virtualBackground.custom": "Cargar desde o teu ordenador",
"app.video.virtualBackground.remove": "Eliminar a imaxe engadida",
"app.video.virtualBackground.genericError": "Produciuse un fallo ao aplicar o efecto da cámara. Ténteo de novo.",
"app.video.virtualBackground.camBgAriaDesc": "Establece o fondo virtual da cámara web a {0}",
"app.video.virtualBackground.maximumFileSizeExceeded": "Superouse o tamaño máximo do ficheiro. ({0}MB)",
"app.video.virtualBackground.typeNotAllowed": "Non se permite o tipo de ficheiro.",
"app.video.virtualBackground.errorOnRead": "Produciuse un erro ao ler o ficheiro.",
"app.video.virtualBackground.uploaded": "Cargado",
"app.video.virtualBackground.uploading": "Cargando...",
"app.video.virtualBackground.button.customDesc": "Engade unha nova imaxe de fondo virtual",
"app.video.camCapReached": "Non pode compartir máis cámaras",
"app.video.meetingCamCapReached": "A xuntanza acadou o seu límite de cámaras simultáneas",
"app.video.dropZoneLabel": "Soltar aquí",
@ -826,6 +976,7 @@
"app.whiteboard.annotations.poll": "Os resultados da enquisa foron publicados",
"app.whiteboard.annotations.pollResult": "Resultado da enquisa",
"app.whiteboard.annotations.noResponses": "Sen respostas",
"app.whiteboard.annotations.notAllowed": "Non tes permiso para facer este cambio",
"app.whiteboard.toolbar.tools": "Ferramentas",
"app.whiteboard.toolbar.tools.hand": "Panorama",
"app.whiteboard.toolbar.tools.pencil": "Lapis",
@ -852,6 +1003,7 @@
"app.whiteboard.toolbar.color.silver": "Prata",
"app.whiteboard.toolbar.undo": "Desfacer as anotacións",
"app.whiteboard.toolbar.clear": "Limpar todas as anotacións",
"app.whiteboard.toolbar.clearConfirmation": "Estás seguro de que queres borrar todas as anotacións?",
"app.whiteboard.toolbar.multiUserOn": "Activar o modo multiusuario do encerado",
"app.whiteboard.toolbar.multiUserOff": "Desactivar o modo multiusuario do encerado",
"app.whiteboard.toolbar.palmRejectionOn": "Activar o rexeitamento da palma da man",
@ -871,13 +1023,13 @@
"app.videoDock.webcamUnfocusDesc": "Retirar do foco a camara web seleccionada",
"app.videoDock.webcamPinLabel": "Fixar",
"app.videoDock.webcamPinDesc": "Fixar a cámara web seleccionada",
"app.videoDock.webcamFullscreenLabel": "Cámara web a pantalla completa",
"app.videoDock.webcamSqueezedButtonLabel": "Opcións da cámara web",
"app.videoDock.webcamUnpinLabel": "Desprender",
"app.videoDock.webcamUnpinLabelDisabled": "Só os moderadores poden desprender aos usuarios",
"app.videoDock.webcamUnpinDesc": "Desprender a cámara web seleccionada",
"app.videoDock.autoplayBlockedDesc": "Necesitamos o seu permiso para mostrarlle as cámaras web doutros usuarios.",
"app.videoDock.autoplayAllowLabel": "Ver cámaras web",
"app.invitation.title": "Convite a sala parcial",
"app.invitation.confirm": "Convidar",
"app.createBreakoutRoom.title": "Salas parciais",
"app.createBreakoutRoom.ariaTitle": "Agochar as salas parciais",
"app.createBreakoutRoom.breakoutRoomLabel": "Salas parciais {0}",
@ -909,6 +1061,8 @@
"app.createBreakoutRoom.addRoomTime": "Incrementar o tempo da sala parcial",
"app.createBreakoutRoom.addParticipantLabel": "+ Engadir participante",
"app.createBreakoutRoom.freeJoin": "Permitirlle aos usuarios escoller a sala parcial á que incorporarse",
"app.createBreakoutRoom.captureNotes": "Captura notas compartidas cando rematen as salas de grupos",
"app.createBreakoutRoom.captureSlides": "Captura o encerado cando rematen as salas de grupos",
"app.createBreakoutRoom.leastOneWarnBreakout": "Debe poñer polo menos un usuario nunha sala parcial",
"app.createBreakoutRoom.minimumDurationWarnBreakout": "A duración mínima para unha sala parcial é de {0} minutos.",
"app.createBreakoutRoom.modalDesc": "Consello: pode arrastrar e soltar o nome dun usuario para asignalo a unha sala parcial específica.",
@ -921,6 +1075,14 @@
"app.createBreakoutRoom.setTimeCancel": "Cancelar",
"app.createBreakoutRoom.setTimeHigherThanMeetingTimeError": "A duración das salas parciais non pode exceder o tempo restante da xuntanza.",
"app.createBreakoutRoom.roomNameInputDesc": "Actualiza o nome da sala parcial",
"app.createBreakoutRoom.movedUserLabel": "Moveuse {0} á sala {1}",
"app.updateBreakoutRoom.modalDesc": "Para actualizar ou invitar un usuario, só tes que arrástralo á sala desexada.",
"app.updateBreakoutRoom.cancelLabel": "Cancelar",
"app.updateBreakoutRoom.title": "Actualizar salas de grupos",
"app.updateBreakoutRoom.confirm": "Aplicar",
"app.updateBreakoutRoom.userChangeRoomNotification": "Trasladáronte á sala {0}.",
"app.smartMediaShare.externalVideo": "Vídeo(s) externo(s)",
"app.update.resetRoom": "Restablecer a sala de usuarios",
"app.externalVideo.start": "Compartir un novo vídeo",
"app.externalVideo.title": "Compartir un vídeo externo",
"app.externalVideo.input": "URL do vídeo externo",
@ -946,6 +1108,15 @@
"app.debugWindow.form.enableAutoarrangeLayoutDescription": "(desactivarase se arrastra ou redimensiona a área de cámaras web)",
"app.debugWindow.form.chatLoggerLabel": "Probar os niveis de rexistro da conversa",
"app.debugWindow.form.button.apply": "Aplicar",
"app.layout.modal.title": "Deseños",
"app.layout.modal.confirm": "Confirmar",
"app.layout.modal.cancel": "Cancelar",
"app.layout.modal.layoutLabel": "Selecciona o teu deseño",
"app.layout.modal.keepPushingLayoutLabel": "Forzar o deseño para todos",
"app.layout.modal.pushLayoutLabel": "Forzar para todos",
"app.layout.modal.layoutToastLabel": "Cambiouse a configuración de deseño",
"app.layout.modal.layoutSingular": "Deseño",
"app.layout.modal.layoutBtnDesc": "Establece o deseño como opción seleccionada",
"app.layout.style.custom": "Personalizado",
"app.layout.style.smart": "Disposición intelixente",
"app.layout.style.presentationFocus": "Poñer o foco na presentación",
@ -995,6 +1166,7 @@
"playback.player.thumbnails.wrapper.aria": "Área de miniaturas",
"playback.player.webcams.wrapper.aria": "Área de cámaras web",
"app.learningDashboard.dashboardTitle": " Taboleiro de análise da aprendizaxe",
"app.learningDashboard.bigbluebuttonTitle": "BigBlueButton",
"app.learningDashboard.downloadSessionDataLabel": "Descargar datos da sesión",
"app.learningDashboard.lastUpdatedLabel": "Última actualización en",
"app.learningDashboard.sessionDataDownloadedLabel": "Descargado!",
@ -1019,6 +1191,12 @@
"app.learningDashboard.userDetails.response": "Resposta",
"app.learningDashboard.userDetails.mostCommonAnswer": "Resposta máis común",
"app.learningDashboard.userDetails.anonymousAnswer": "Enquisa anónima",
"app.learningDashboard.userDetails.talkTime": "Tempo de conversa",
"app.learningDashboard.userDetails.messages": "Mensaxes",
"app.learningDashboard.userDetails.emojis": "Emojis",
"app.learningDashboard.userDetails.raiseHands": "Erguer as mans",
"app.learningDashboard.userDetails.pollVotes": "Votos da enquisa",
"app.learningDashboard.userDetails.onlineIndicator": "{0} tempo en liña",
"app.learningDashboard.usersTable.title": "Vista xeral",
"app.learningDashboard.usersTable.colOnline": "Tempo en liña",
"app.learningDashboard.usersTable.colTalk": "Tempo de conversa",
@ -1042,8 +1220,13 @@
"app.learningDashboard.pollsTable.anonymousRowName": "Anónima",
"app.learningDashboard.pollsTable.noPollsCreatedHeading": "Non se creou ningunha enquisa",
"app.learningDashboard.pollsTable.noPollsCreatedMessage": "Unha vez enviada unha enquisa aos usuarios, os seus resultados aparecerán nesta lista.",
"app.learningDashboard.pollsTable.answerTotal": "Total",
"app.learningDashboard.pollsTable.userLabel": "Usuario/a",
"app.learningDashboard.statusTimelineTable.title": "Cronoloxía",
"app.learningDashboard.statusTimelineTable.thumbnail": "Miniatura da presentación",
"app.learningDashboard.statusTimelineTable.presentation": "Presentación",
"app.learningDashboard.statusTimelineTable.pageNumber": "Páxina",
"app.learningDashboard.statusTimelineTable.setAt": "Establecido en",
"app.learningDashboard.errors.invalidToken": "O testemuño de sesión non é válido",
"app.learningDashboard.errors.dataUnavailable": "Os datos xa non están dispoñíbeis",
"mobileApp.portals.list.empty.addFirstPortal.label": "Engada o seu primeiro portal usando o botón anterior,",
@ -1057,6 +1240,4 @@
"mobileApp.portals.addPortalPopup.validation.emptyFields": "Campos obrigatorios",
"mobileApp.portals.addPortalPopup.validation.portalNameAlreadyExists": "Ese nome xa está a ser usado",
"mobileApp.portals.addPortalPopup.validation.urlInvalid": "Produciuse un erro ao tentar cargar a páxina. Comprobe o URL e a conexión de rede"
}

View File

@ -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": "Ստուգել, արդյոք մասնակցում է ({0}) հանդիպմանը",
@ -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,18 @@
"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.currentPresentationLabel": "Ընթացիկ ներկայացումը",
"app.presentationUploder.extraHint": "ԿԱՐԵՎՈՐ - յուրաքանչյուր ֆայլը չպետք է գերազանցի ֆայլը {0} մեգաբայթը և {1} էջերի քանակը։",
"app.presentationUploder.uploadLabel": "Բեռնել",
"app.presentationUploder.confirmLabel": "Հաստատել",
@ -214,6 +257,8 @@
"app.presentationUploder.dropzoneImagesLabel": "Նկարները բեռնելու համար մկնիկով տեղափոխեք այստեղ",
"app.presentationUploder.browseFilesLabel": "կամ ընտրեք ֆայլ",
"app.presentationUploder.browseImagesLabel": "կամ ընտրեք նկար",
"app.presentationUploder.externalUploadTitle": "Ավելացնել բովանդակություն կողմնակի ծրագրից",
"app.presentationUploder.externalUploadLabel": "Ընդրել ֆայլեր",
"app.presentationUploder.fileToUpload": "բեռնելու համար",
"app.presentationUploder.currentBadge": "Ընթացիկ",
"app.presentationUploder.rejectedError": "Ընտրված ֆայլերի բեռնումն ընդհատվել է Խնդրում ենք ընտրեք ճիշտ ֆորմատի ֆայլ",
@ -230,14 +275,14 @@
"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.timeout": "Պատրաստումը պահանջում է բավականին մեծ ժամանակ...",
"app.presentationUploder.conversion.pageCountFailed": "Չստացվեց որոշել էջերի քանակը",
"app.presentationUploder.conversion.unsupportedDocument": "Տվյալ տեսակի ֆայլերի հետ չենք աշխատում",
"app.presentationUploder.isDownloadableLabel": "Թույլատրել բեռնել ներկայացումը",
"app.presentationUploder.isNotDownloadableLabel": "Արգելել ներկայացման բեռնումը",
"app.presentationUploder.removePresentationLabel": "Հեռացնել ներկայացումը",
"app.presentationUploder.setAsCurrentPresentation": "Դարձնել ներկայացումն ընթացիկ",
"app.presentationUploder.tableHeading.filename": "Ֆայլի անվանում",
@ -251,6 +296,10 @@
"app.presentationUploder.clearErrors": "Մաքրել սխալները",
"app.presentationUploder.clearErrorsDesc": "Մաքրում է ներկայացման բեռնման սխալները",
"app.presentationUploder.uploadViewTitle": "Բեռնել ներկայացումը",
"app.poll.questionAndoptions.label" : "Հարցի տեքստը կցուցադրվի։\nԱ Պատասխանի տարբերակ *\nԲ Պատասխանի տարբերակ (ոչ պարտադիր)\nԳ Պատասխանի տարբերակ (ոչ պարտադիր)\nԴ Պատասխանի տարբերակ (ոչ պարտադիր)\nԵ Պատասխանի տարբերակ (ոչ պարտադիր)",
"app.poll.customInput.label": "Սեփական մուտքագրում",
"app.poll.customInputInstructions.label": "Սեփական մուտքագրումն է թույլատված - գրեք հարցման հարցը և պատասխանների տարբերակ(ներ)ը տրված ֆորմատով կամ տեղափոխեք նույն ֆորմատով տեքստային ֆայլը։ ",
"app.poll.maxOptionsWarning.label": "Միայն առաջին 5 տարբերակները կարող են օգտագործվել։",
"app.poll.pollPaneTitle": "Հարցում",
"app.poll.enableMultipleResponseLabel": "Թույլատրե՞լ յուրաքանչյուր պատասխանողից մեկից ավելի պատասխաններ։",
"app.poll.quickPollTitle": "Արագ հարցում",
@ -270,7 +319,7 @@
"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" : "Պատասխանների տարբերակներ",
@ -329,11 +378,11 @@
"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.leaveSessionLabel": "Ելք",
"app.navBar.settingsDropdown.exitFullscreenLabel": "Չեղարկել ամբողջ էկրանը ծածկելու վիճակը",
"app.navBar.settingsDropdown.exitFullscreenLabel": "Չեղարկել ողջ էկրանի ռեժիմը",
"app.navBar.settingsDropdown.fullscreenDesc": "Կարգավորումների մենյուն դարձնել ամբողջ էկրանով",
"app.navBar.settingsDropdown.settingsDesc": "Փոխել գլխավոր կարգավորումները",
"app.navBar.settingsDropdown.aboutDesc": "Ցուցադրել տեղեկություն",
@ -342,6 +391,7 @@
"app.navBar.settingsDropdown.hotkeysLabel": "Արագ արձագանքման ստեղներ",
"app.navBar.settingsDropdown.hotkeysDesc": "Արագ արձագանքման ստեղների ցուցակ",
"app.navBar.settingsDropdown.helpLabel": "Օգնություն",
"app.navBar.settingsDropdown.openAppLabel": "Բացել միջավայրի պլանշետային ծրագրում",
"app.navBar.settingsDropdown.helpDesc": "Ուղղորդում է տեսադասեր",
"app.navBar.settingsDropdown.endMeetingDesc": "Ընդհատել ընթացիկ հանդիպումը",
"app.navBar.settingsDropdown.endMeetingLabel": "Ավարտել ընթացիկ հանդիպումը",
@ -359,7 +409,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": "Ծրագրի թողարկումը ",
@ -369,6 +419,15 @@
"app.about.confirmDesc": "Լավ",
"app.about.dismissLabel": "Չեղարկել",
"app.about.dismissDesc": "Փակել ինֆորմացիան",
"app.mobileAppModal.title": "Բացել միջավայրի պլանշետային ծրագիրը",
"app.mobileAppModal.description": "Ունե՞ք Ձեր սարքում միջավայրի տեղադրված ծրագիրը ",
"app.mobileAppModal.openApp": "Այո, բացել ծրագիրը հենց հիմա",
"app.mobileAppModal.obtainUrlMsg": "Հանդիպման URL-ի ձևավորում",
"app.mobileAppModal.obtainUrlErrorMsg": "Հանդիպման URL-ի ձևավորման սխալ",
"app.mobileAppModal.openStore": "Ոչ, բացել App Store-ը, բեռնելու համար",
"app.mobileAppModal.dismissLabel": "Չեղարկել",
"app.mobileAppModal.dismissDesc": "Փակել",
"app.mobileAppModal.userConnectedWithSameId": "{0} օգտվողը միացել է Ձեր ID-ով։",
"app.actionsBar.changeStatusLabel": "Փոխել կարգավիճակը",
"app.actionsBar.muteLabel": "Անջատել բարձրախոսը",
"app.actionsBar.unmuteLabel": "Միացնել բարձրախոսը",
@ -379,10 +438,12 @@
"app.actionsBar.actionsDropdown.restorePresentationDesc": "Ներկայացման վերականգնման կոճակ",
"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,6 +453,7 @@
"app.submenu.application.noLocaleOptionLabel": "Հասանելի թարգմանություններ չկան",
"app.submenu.application.paginationEnabledLabel": "Տեսանյութի մասնատում",
"app.submenu.application.layoutOptionLabel": "Դասավորվածության տեսակը",
"app.submenu.application.pushLayoutLabel": "Push դասավորվածություն",
"app.submenu.notification.SectionTitle": "Ծանուցումներ",
"app.submenu.notification.Desc": "Սահմանել, թե երբ և ինչի մասին ծանուցվեք",
"app.submenu.notification.audioAlertLabel": "Ձայնային ծանուցումներ",
@ -420,7 +482,7 @@
"app.settings.main.save.label.description": "Պահպանում է կարգավորման փոփոխությունները և կարգավորման մենյուն փակում է",
"app.settings.dataSavingTab.label": "Պահպանել տվյալները",
"app.settings.dataSavingTab.webcam": "Միացնել տեսախցիկը",
"app.settings.dataSavingTab.screenShare": "Միացնել էկրանի ցուցադրումը",
"app.settings.dataSavingTab.screenShare": "Թույլատրել այլ մասնակիցների էկրանի ցուցադրումը",
"app.settings.dataSavingTab.description": "Միացման բարձր որակ ապահովելու համար ընտրեք, թե ինչ է ցուցադրվելու",
"app.settings.save-notification.label": "Կարգավորումները պահպանվեցին",
"app.statusNotifier.lowerHands": "Իջեցնել ձեռքերը",
@ -440,7 +502,6 @@
"app.actionsBar.actionsDropdown.presentationLabel": "Ներկայացումների կառավարում",
"app.actionsBar.actionsDropdown.initPollLabel": "Սկսել հարցումը",
"app.actionsBar.actionsDropdown.desktopShareLabel": "Ցուցադրել Ձեր էկրանը",
"app.actionsBar.actionsDropdown.lockedDesktopShareLabel": "Էկրանի ցուցադրումն արգելափակված է",
"app.actionsBar.actionsDropdown.stopDesktopShareLabel": "Ընդհատել էկրանի ցուցադրումը",
"app.actionsBar.actionsDropdown.presentationDesc": "Բեռնեք Ձեր ներկայացումը",
"app.actionsBar.actionsDropdown.initPollDesc": "Սկսել հարցումը",
@ -457,6 +518,7 @@
"app.actionsBar.actionsDropdown.takePresenterDesc": "Ղեկավար նշանակել ինքներդ Ձեզ",
"app.actionsBar.actionsDropdown.selectRandUserLabel": "Ընտրել պատահական մասնակցի",
"app.actionsBar.actionsDropdown.selectRandUserDesc": "Պատահականության սկզբունքով ընտրում է մասնակիցներից մեկին",
"app.actionsBar.actionsDropdown.propagateLayoutLabel": "Propagate դասավորվածություն",
"app.actionsBar.emojiMenu.statusTriggerLabel": "Դնել կարգավիճակ",
"app.actionsBar.emojiMenu.awayLabel": "Հեռացել է",
"app.actionsBar.emojiMenu.awayDesc": "Փոխում է Ձեր կարգավիճակը որպես -Հեռացել է-",
@ -496,6 +558,7 @@
"app.audioNotification.audioFailedError1012": "Соединение закрыто (ICE error 1012)",
"app.audioNotification.audioFailedMessage": "Не удалось установить аудио-соединение",
"app.audioNotification.mediaFailedMessage": "Ошибка getUserMicMedia, разрешены только безопасные источники",
"app.audioNotification.deviceChangeFailed": "Աուդիոսարքավորման փոփոխությունը ձախողվել է։ Ստուգեք սարքի միացումը և սարքինությունը։",
"app.audioNotification.closeLabel": "Փակել",
"app.audioNotificaion.reconnectingAsListenOnly": "Մասնակիցների համար բարձրախոսերը արգելափակված են Դուք միացել եք լսողի դերում",
"app.breakoutJoinConfirmation.title": "Միանալ խմբային աշխատանքի սենյակին",
@ -509,6 +572,7 @@
"app.breakout.dropdown.manageDuration": "Փոխել տևողությունը",
"app.breakout.dropdown.destroyAll": "Ավարտել խմբային սենյակները",
"app.breakout.dropdown.options": "Առանձնացված սենյակների կարգավորումներ",
"app.breakout.dropdown.manageUsers": "Կառավարել օգտվողներին",
"app.calculatingBreakoutTimeRemaining": "Մնացած ժամանակի հետհաշվարկ․..",
"app.audioModal.ariaTitle": "Հանդիպման միացման պատուհան",
"app.audioModal.microphoneLabel": "Բարձրախոսով",
@ -555,6 +619,7 @@
"app.audio.changeAudioDevice": "Փոխել աուդիոսարքավորումը",
"app.audio.enterSessionLabel": "Միանալ սեանսին",
"app.audio.playSoundLabel": "Արտաբերել ձայնը",
"app.audio.stopAudioFeedback": "Դադարեցնել աուդիո արձագանքները",
"app.audio.backLabel": "Ետ",
"app.audio.loading": "Բեռնում",
"app.audio.microphones": "Բարձրախոսեր",
@ -567,10 +632,32 @@
"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": "Տալ բարձրախոսի թույլտվություն",
"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": "Միևնույն իդենտիֆիկատորով մասնակիցը փորձում է միանալ հանդիպմանը",
@ -578,6 +665,7 @@
"app.meeting.logout.ejectedFromMeeting": "Դուք հեռացված եք հանդիպումից",
"app.meeting.logout.validateTokenFailedEjectReason": "Չստացվեց ստուգել մուտքի թոքենի հավաստիությունը",
"app.meeting.logout.userInactivityEjectReason": "Օգտվողը չափազանց երկար ժամանակ ակտիվ չէ",
"app.meeting.logout.maxParticipantsReached": "Այս միացման մասնակիցների թիվը հասել է առավելագույնին",
"app.meeting-ended.rating.legendLabel": "Կարծիքներով ռեյտինգը",
"app.meeting-ended.rating.starLabel": "Աստղ",
"app.modal.close": "Փակել",
@ -599,8 +687,11 @@
"app.error.403": "Հեռացված եք հանդիպումից",
"app.error.404": "Չի գտնվել",
"app.error.408": "Նույնականացումը չստացվեց",
"app.error.409": "Հակասություն",
"app.error.410": "Իրադարձությունն ավարտվել է",
"app.error.500": "Ինչ-որ բան այնպես չէ",
"app.error.503": "Դուք կանջատվեք",
"app.error.disconnected.rejoin": "Կարող եք թարմացնել էջը կրկին միանալու համար",
"app.error.userLoggedOut": "Մասնակցի մուտքի թոքենը գործող չէ, քանի որ հեռացված է հանդիպումից",
"app.error.ejectedUser": "Մասնակիցը չունի թույլատրելի թոքեն, քանի որ հեռացվել է մոդերատորի կողմից",
"app.error.joinedAnotherWindow": "Այս միացումը կարծես թե բացված է բրաուզերի այլ պատուհանում",
@ -644,14 +735,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.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": "Ձեր ձեռքն իջեցված է",
@ -688,6 +783,38 @@
"app.shortcut-help.toggleFullscreenKey": "Մուտք",
"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.featuresLable": "Գործողություն",
@ -737,13 +864,19 @@
"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": "Ցածր",
@ -760,13 +893,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.leaveVideo": "Ընդհատել տեսախցիկի հեռարձակումը",
"app.video.videoSettings": "Տեսախցիկի կարգավորումներ",
"app.video.visualEffects": "Տեսանելի կարգավորւմներ",
"app.video.advancedVideo": "Բացել լրացուցիչ կարգավորումները",
"app.video.iceCandidateError": "Ошибка добавления ICE кандидата",
"app.video.iceConnectionStateError": "Connection failure (ICE error 1107)",
@ -782,6 +922,7 @@
"app.video.notReadableError": "Տեսախցիկի վիդեոն չստացվեց ընկալել - Խնդրում ենք համոզվել, որ այլ ծրագիր չի օգտագործում Ձեր տեսախցիկը",
"app.video.timeoutError": "Բրաուզերը ժամանակին չպատասխանեց",
"app.video.genericError": "Սարքավորման անհայտ սխալ (Error {0})",
"app.video.inactiveError": "Ձեր տեսախցիկից հեռարձակումը դադարեցվել է անհասկանլի պատճառով։ Հավանական է բրաուզերից թույլտվություն չկա",
"app.video.mediaTimedOutError": "Ձեր տեսախցիկի հեռարձակումն ընդհատվեց - Կրկին փորձեք միացնել տեսախցիկը",
"app.video.mediaFlowTimeout1020": "Медиа не удалось связаться с сервером (error 1020)",
"app.video.suggestWebcamLock": "Ստիպողաբար արգելափակե՞մ մասնակիցների տեսախցիկները",
@ -804,8 +945,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 +976,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 +1003,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,13 +1023,13 @@
"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} ",
@ -909,6 +1061,8 @@
"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": "Կարող եք մկնիկով տեղափոխել մասնակիցներին համապատասխան սենյակներ",
@ -921,6 +1075,14 @@
"app.createBreakoutRoom.setTimeCancel": "Չեղարկել",
"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": "Տեսանյութի հղում",
@ -946,6 +1108,15 @@
"app.debugWindow.form.enableAutoarrangeLayoutDescription": "(կանջատվի, եթե տեսախցիկների դաշտի չափերը փոխեք)",
"app.debugWindow.form.chatLoggerLabel": "Զրուցարանի տեքստի լոգավորման աստիճանը",
"app.debugWindow.form.button.apply": "Ընդունել",
"app.layout.modal.title": "Դասավորվածություններ",
"app.layout.modal.confirm": "Հաստատել",
"app.layout.modal.cancel": "Չեղարկել",
"app.layout.modal.layoutLabel": "Ընտեք Ձեր դասավորվածությունը",
"app.layout.modal.keepPushingLayoutLabel": "Push դասավորվածությունը բոլորի համար",
"app.layout.modal.pushLayoutLabel": "Push բոլորին",
"app.layout.modal.layoutToastLabel": "Դասավորվածության կարգավորումները փոխվել են",
"app.layout.modal.layoutSingular": "Դասավորվածություն",
"app.layout.modal.layoutBtnDesc": "Դասավորվածության տեղադրում ընտրված կարգավորումներով",
"app.layout.style.custom": "Կարգավորվող",
"app.layout.style.smart": "Ավտոմատ",
"app.layout.style.presentationFocus": "Կենտրոնանալ ներկայացման վրա",
@ -995,6 +1166,7 @@
"playback.player.thumbnails.wrapper.aria": "Էսքիզների տարածք",
"playback.player.webcams.wrapper.aria": "Տեսախցիկների դաշտ",
"app.learningDashboard.dashboardTitle": "Դասի վերլուծության վահանակ",
"app.learningDashboard.bigbluebuttonTitle": "Հեռակապի հարթակ",
"app.learningDashboard.downloadSessionDataLabel": "Բեռնել սեսիայի տվյալները",
"app.learningDashboard.lastUpdatedLabel": "Վերջին անգամ թարմացվել է",
"app.learningDashboard.sessionDataDownloadedLabel": "Բեռնված է",
@ -1019,6 +1191,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": "Խոսելու տևողությունը",
@ -1042,8 +1220,13 @@
"app.learningDashboard.pollsTable.anonymousRowName": "Անանուն",
"app.learningDashboard.pollsTable.noPollsCreatedHeading": "Հարցումներ չեն ստեղծվել",
"app.learningDashboard.pollsTable.noPollsCreatedMessage": "Երբ հարցն ուղարկվի մասնակիցներին, նրանց արդյունքները կերևան այս ցուցակում",
"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": "Ավելացրեք Ձեր առաջին պորտալը վերևի կոճակի օգնությամբ, ",
@ -1057,6 +1240,4 @@
"mobileApp.portals.addPortalPopup.validation.emptyFields": "Պարտադիր դաշտեր",
"mobileApp.portals.addPortalPopup.validation.portalNameAlreadyExists": "Անունն արդեն օգտագործվում է",
"mobileApp.portals.addPortalPopup.validation.urlInvalid": "Էջի բեռնման սխալ, ստուգեք URL-ը և ցանցային միացումը"
}

View File

@ -2,12 +2,13 @@
"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.titlePublic": "公開チャット",
"app.chat.titlePrivate": "{0} との非公開チャット",
"app.chat.partnerDisconnected": "{0} は会議から退出しました",
"app.chat.closeChatLabel": "{0} を閉じる",
@ -21,13 +22,35 @@
"app.chat.offline": "オフライン",
"app.chat.pollResult": "投票結果",
"app.chat.breakoutDurationUpdated": "小会議の時間は現在{0}分です",
"app.chat.breakoutDurationUpdatedModerator": "小会議の時間は現在{0}分です。通知が送られました。",
"app.chat.emptyLogLabel": "チャットログは空です",
"app.chat.clearPublicChatMessage": "チャット履歴はモデレーターにより消去されました",
"app.chat.clearPublicChatMessage": "チャット履歴は司会者により消去されました",
"app.chat.multi.typing": "複数の人が入力中",
"app.chat.one.typing": "{0}が入力中",
"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": "開始",
@ -35,7 +58,7 @@
"app.captions.menu.ariaStartDesc": "モーダルを閉じて字幕を編集する",
"app.captions.menu.select": "使用可能な言語を選択",
"app.captions.menu.ariaSelect": "字幕の言語",
"app.captions.menu.subtitle": "見出しの言語とスタイルを選択してください",
"app.captions.menu.subtitle": "字幕の言語とスタイルを選択してください",
"app.captions.menu.title": "字幕",
"app.captions.menu.fontSize": "サイズ",
"app.captions.menu.fontColor": "テキスト色",
@ -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": "会議({0})にユーザーがまだ参加しているか確認する",
@ -69,13 +101,13 @@
"app.userList.notesTitle": "メモ",
"app.userList.notesListItem.unreadContent": "共有ノートに新しいコンテンツがあります",
"app.userList.captionsTitle": "字幕",
"app.userList.presenter": "プレゼンター",
"app.userList.presenter": "発表者",
"app.userList.you": "自分",
"app.userList.locked": "ロック",
"app.userList.byModerator": "(Moderator)による",
"app.userList.label": "ユーザーリスト",
"app.userList.toggleCompactView.label": "コンパクトモードに切り替え",
"app.userList.moderator": "モデレーター",
"app.userList.moderator": "司会者",
"app.userList.mobile": "モバイル端末",
"app.userList.guest": "ゲスト",
"app.userList.sharingWebcam": "ウェブカメラ",
@ -86,7 +118,7 @@
"app.userList.menu.clearStatus.label": "ステータスを消去する",
"app.userList.menu.removeUser.label": "このユーザーを退室させる",
"app.userList.menu.removeConfirmation.label": "ユーザー({0})の退室",
"app.userlist.menu.removeConfirmation.desc": "このユーザーを二度とセッションに参加させない",
"app.userlist.menu.removeConfirmation.desc": "このユーザーを二度と会議に参加させないようにする。",
"app.userList.menu.muteUserAudio.label": "ユーザーをミュートする",
"app.userList.menu.unmuteUserAudio.label": "ユーザーのミュートを解除する",
"app.userList.menu.webcamPin.label": "ウェブカメラをピン止めする",
@ -95,45 +127,45 @@
"app.userList.menu.removeWhiteboardAccess.label": "ホワイトボードへの書き込み許可を取り消す",
"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.promoteUser.label": "司会者にする",
"app.userList.menu.demoteUser.label": "視聴者に戻す",
"app.userList.menu.unlockUser.label": "{0}を有効にする",
"app.userList.menu.lockUser.label": "{0}を無効にする",
"app.userList.menu.directoryLookup.label": "ディレクトリ検索",
"app.userList.menu.makePresenter.label": "プレゼンターにする",
"app.userList.menu.makePresenter.label": "発表者にする",
"app.userList.userOptions.manageUsersLabel": "ユーザー管理",
"app.userList.userOptions.muteAllLabel": "全ユーザーをミュート",
"app.userList.userOptions.muteAllDesc": "会議の全ユーザーをミュートする",
"app.userList.userOptions.clearAllLabel": "全てのステータスを消す",
"app.userList.userOptions.clearAllDesc": "ユーザーの全ステータスアイコンを消去する",
"app.userList.userOptions.muteAllExceptPresenterLabel": "プレゼンター以外全員ミュート",
"app.userList.userOptions.muteAllExceptPresenterDesc": "この会議のプレゼンター以外の全ユーザーをミュートにする",
"app.userList.userOptions.muteAllExceptPresenterLabel": "発表者以外全員ミュート",
"app.userList.userOptions.muteAllExceptPresenterDesc": "この会議の発表者以外の全ユーザーをミュートにする",
"app.userList.userOptions.unmuteAllLabel": "会議のミュートを解除",
"app.userList.userOptions.unmuteAllDesc": "会議のミュートを解除する",
"app.userList.userOptions.lockViewersLabel": "参加者の行動を制限",
"app.userList.userOptions.lockViewersLabel": "視聴者の行動を制限",
"app.userList.userOptions.lockViewersDesc": "会議の参加者が使用可能な特定の機能を無効にする",
"app.userList.userOptions.guestPolicyLabel": "ゲストポリシー",
"app.userList.userOptions.guestPolicyDesc": "会議のゲストポリシー設定を変更する",
"app.userList.userOptions.disableCam": "ビューアーのウェブカメラは利用できません",
"app.userList.userOptions.disableMic": "ビューアーのマイクは利用できません",
"app.userList.userOptions.disableCam": "視聴者のウェブカメラは利用できません",
"app.userList.userOptions.disableMic": "視聴者のマイクは利用できません",
"app.userList.userOptions.disablePrivChat": "非公開チャットは利用できません",
"app.userList.userOptions.disablePubChat": "グループチャットは利用できません",
"app.userList.userOptions.disablePubChat": "公開チャットは利用できません",
"app.userList.userOptions.disableNotes": "共有ノートがロックされています",
"app.userList.userOptions.hideUserList": "ユーザーリストは視聴者に表示されません",
"app.userList.userOptions.webcamsOnlyForModerator": "モデレーターのみがビューアーのウェブカメラを見ることができます(ロック設定による)",
"app.userList.userOptions.webcamsOnlyForModerator": "司会者のみが視聴者のウェブカメラを見ることができます(ロック設定による)",
"app.userList.content.participants.options.clearedStatus": "全てのユーザーのステータスをクリアしました",
"app.userList.userOptions.enableCam": "ビューアーのウェブカメラが利用可能です",
"app.userList.userOptions.enableMic": "ビューアーのマイクが利用可能です",
"app.userList.userOptions.enableCam": "視聴者のウェブカメラが利用可能です",
"app.userList.userOptions.enableMic": "視聴者のマイクが利用可能です",
"app.userList.userOptions.enablePrivChat": "非公開チャットが利用可能です",
"app.userList.userOptions.enablePubChat": "グループチャットが利用可能です",
"app.userList.userOptions.enablePubChat": "公開チャットが利用可能です",
"app.userList.userOptions.enableNotes": "共有ノートが使用可能です",
"app.userList.userOptions.showUserList": "ユーザーリストが視聴者に表示されます",
"app.userList.userOptions.enableOnlyModeratorWebcam": "ウェブカメラを有効にすると、全員があなたを見ることができます",
"app.userList.userOptions.savedNames.title": "{0}の会議の{1}のユーザーリスト",
"app.userList.userOptions.sortedFirstName.heading": "第一語でソート",
"app.userList.userOptions.sortedLastName.heading": "第二語でソート",
"app.userList.userOptions.hideViewersCursor": "ビューアーのカーソルがロックされました",
"app.userList.userOptions.showViewersCursor": "ビューアーのカーソルロックが解除されました",
"app.userList.userOptions.hideViewersCursor": "視聴者のカーソルがロックされました",
"app.userList.userOptions.showViewersCursor": "視聴者のカーソルロックが解除されました",
"app.media.label": "メディア",
"app.media.autoplayAlertDesc": "アクセス許可",
"app.media.screenshare.start": "画面共有を開始しました",
@ -141,20 +173,20 @@
"app.media.screenshare.endDueToDataSaving": "通信量抑制のため、画面共有を停止しました",
"app.media.screenshare.unavailable": "画面共有は利用できません",
"app.media.screenshare.notSupported": "画面共有はこのブラウザではサポートされていません。",
"app.media.screenshare.autoplayBlockedDesc": "プレゼンターの画面の共有を許可してください",
"app.media.screenshare.autoplayBlockedDesc": "発表者の画面の共有を許可してください",
"app.media.screenshare.autoplayAllowLabel": "共有画面を見る",
"app.screenshare.presenterLoadingLabel": "あなたの画面を共有しようとしています",
"app.screenshare.viewerLoadingLabel": "プレゼンターの画面を共有しようとしています",
"app.screenshare.viewerLoadingLabel": "発表者の画面を共有しようとしています",
"app.screenshare.presenterSharingLabel": "現在あなたの画面を共有中です",
"app.screenshare.screenshareFinalError": "コード{0} 画面をシェアできませんでした。",
"app.screenshare.screenshareRetryError": "コード{0} 画面シェアをもう一度試してください。",
"app.screenshare.screenshareRetryOtherEnvError": "コード{0} 画面をシェアできませんでした。別のブラウザや端末を使ってもう一度試してみてください。",
"app.screenshare.screenshareUnsupportedEnv": "コード{0} ブラウザがサポートされていません。別のブラウザや端末を使ってもう一度試してみてください。",
"app.screenshare.screensharePermissionError": "コード{0} 画面キャプチャーの許可を与える必要があります。",
"app.meeting.ended": "このセッションは終了しました",
"app.meeting.ended": "この会議は終了しました",
"app.meeting.meetingTimeRemaining": "会議の残り時間:{0}",
"app.meeting.meetingTimeHasEnded": "時間終了。会議はまもなく終了します。",
"app.meeting.endedByUserMessage": "{0}さんがこのセッションを終えました",
"app.meeting.endedByUserMessage": "{0}さんがこの会議を終えました",
"app.meeting.endedByNoModeratorMessageSingular": "一分たっても司会者が現れなかったため、会議は終了しました。",
"app.meeting.endedByNoModeratorMessagePlural": "{0}分たっても司会者が現れなかったため、会議は終了しました。",
"app.meeting.endedMessage": "ホーム画面に戻ります",
@ -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,18 @@
"app.presentation.presentationToolbar.goToSlide": "スライド {0}",
"app.presentation.placeholder": "現在アクティブなプレゼンテーションはありません",
"app.presentationUploder.title": "プレゼンテーション",
"app.presentationUploder.message": "プレゼンターはドキュメントをアップロードすることができます。お勧めのファイル形式は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": "{1}枚のスライドのうち{0}番目を抽出中...",
"app.presentationUploader.processing": "{1}枚のスライドのうち{0}番目に書き込み中...",
"app.presentationUploader.sent": "送信終了",
"app.presentationUploader.exportingTimeout": "エクスポートに時間がかかりすぎています...",
"app.presentationUploader.export": "チャットへ送信",
"app.presentationUploader.currentPresentationLabel": "プレゼンテーションファイル",
"app.presentationUploder.extraHint": "重要:それぞれのファイルが{0}MB、{1}ページを超えないようにしてください。",
"app.presentationUploder.uploadLabel": "アップロード",
"app.presentationUploder.confirmLabel": "確認",
@ -214,30 +257,32 @@
"app.presentationUploder.dropzoneImagesLabel": "画像をここにドラッグしてアップロードする",
"app.presentationUploder.browseFilesLabel": "またはファイルを探す",
"app.presentationUploder.browseImagesLabel": "または画像を探す/キャプチャする",
"app.presentationUploder.externalUploadTitle": "外部アプリからプレゼン内容を追加",
"app.presentationUploder.externalUploadLabel": "ファイルを閲覧",
"app.presentationUploder.fileToUpload": "アップロード前...",
"app.presentationUploder.currentBadge": "現在",
"app.presentationUploder.currentBadge": "現在のプレゼンファイル",
"app.presentationUploder.rejectedError": "選択されたファイルはアップロードできません。ファイル形式を確認してください。",
"app.presentationUploder.connectionClosedError": "接続に問題があったため中断されました。もう一度試してみてください。",
"app.presentationUploder.upload.progress": "アップロード中({0}%)",
"app.presentationUploder.upload.413": "ファイルが大きすぎます。最大サイズは {0} MBです。",
"app.presentationUploder.genericError": "申し訳ありませんが、何か問題があるようです。",
"app.presentationUploder.upload.408": "アップロードトークンの要求が時間切れになりました。",
"app.presentationUploder.upload.404": "エラー404無効なアップロードトークン",
"app.presentationUploder.upload.401": "アップロードトークンの要求が失敗しました。",
"app.presentationUploder.upload.408": "アップロード許可の要求が時間切れになりました。",
"app.presentationUploder.upload.404": "エラー404無効なアップロード許可",
"app.presentationUploder.upload.401": "アップロード許可の要求に失敗しました。",
"app.presentationUploder.conversion.conversionProcessingSlides": "{1}ページ中{0}ページ目を処理中",
"app.presentationUploder.conversion.genericConversionStatus": "ファイル変換中…",
"app.presentationUploder.conversion.generatingThumbnail": "サムネイル作成中…",
"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": "Officeドキュメントが変換できませんでした。代わりにPDFをアップロードしてください。",
"app.presentationUploder.conversion.officeDocConversionFailed": "Officeドキュメントが変換できませんでした。代わりにPDFをアップロードしてください。",
"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.tableHeading.filename": "ファイル名",
@ -251,12 +296,16 @@
"app.presentationUploder.clearErrors": "エラー消去",
"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.quickPollTitle": "簡易投票",
"app.poll.hidePollDesc": "投票メニュー画面を隠す",
"app.poll.quickPollInstruction": "オプションを選択し投票を設定してください。",
"app.poll.activePollInstruction": "このパネルを開けたままにしておくと、問いに対する応答がライブで表示されます。投票が十分進んだら「投票結果を公開」を押します。結果が公開され、投票は終了します。",
"app.poll.quickPollInstruction": "下から一つ選び投票を開始してください。",
"app.poll.activePollInstruction": "このパネルを開けたままにしておくと、問いに対する応答がライブで表示されます。投票が終わったら「投票結果を公開」を押します。結果が公開され、投票は終了します。",
"app.poll.dragDropPollInstruction": "投票の内容を入力するには、それを記入したテキストファイルを、ハイライトされた欄にドラッグしてください。",
"app.poll.customPollTextArea": "投票の内容を入力",
"app.poll.publishLabel": "投票結果を公開",
@ -265,11 +314,11 @@
"app.poll.closeLabel": "閉じる",
"app.poll.waitingLabel": "投票待ち({0}/{1})",
"app.poll.ariaInputCount": "カスタム投票オプション{1}の{0}",
"app.poll.customPlaceholder": "選択肢を追加する",
"app.poll.customPlaceholder": "選択肢を追加",
"app.poll.noPresentationSelected": "プレゼンテーションが選択されていません1つ選択してください。",
"app.poll.clickHereToSelect": "ここをクリックして選択する",
"app.poll.question.label" : "質問を入力してください...",
"app.poll.optionalQuestion.label" : "(必要であれば)質問を入力してください...",
"app.poll.question.label" : "質問を入力してください...",
"app.poll.optionalQuestion.label" : "質問を入力してください(任意)...",
"app.poll.userResponse.label" : "自由回答",
"app.poll.responseTypes.label" : "回答方式",
"app.poll.optionDelete.label" : "削除",
@ -316,20 +365,20 @@
"app.polling.submitLabel": "送る",
"app.polling.submitAriaLabel": "回答を送る",
"app.polling.responsePlaceholder": "答えを入力",
"app.polling.responseSecret": "無記名投票 ー プレゼンターはあなたの答えを見ることができません。",
"app.polling.responseSecret": "無記名投票 ー 発表者はあなたの答えを見ることができません。",
"app.polling.responseNotSecret": "記名投票 ー プレゼンターはあなたの答えを見ることができます。",
"app.polling.pollAnswerLabel": "投票結果{0}",
"app.polling.pollAnswerDesc": "この選択肢で「{0}」に投票する",
"app.failedMessage": "サーバー接続障害",
"app.polling.pollAnswerDesc": "これを選び「{0}」に投票する",
"app.failedMessage": "申し訳ありませんが、サーバーへの接続障害です。",
"app.downloadPresentationButton.label": "元のプレゼンテーションをダウンロード",
"app.connectingMessage": "接続中...",
"app.waitingMessage": "接続が切れました。 {0} 秒で再接続します ...",
"app.retryNow": "リトライ",
"app.retryNow": "すぐに再接続",
"app.muteWarning.label": "自分のミュートを解除するため{0}をクリック",
"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.leaveSessionLabel": "退室する",
@ -342,24 +391,25 @@
"app.navBar.settingsDropdown.hotkeysLabel": "キーボードショートカット",
"app.navBar.settingsDropdown.hotkeysDesc": "利用可能なキーボードショートカット一覧",
"app.navBar.settingsDropdown.helpLabel": "ヘルプ",
"app.navBar.settingsDropdown.helpDesc": "ユーザーをビデオチュートリアルへリンクする(新しいタブを開く)",
"app.navBar.settingsDropdown.openAppLabel": "BigBlueButtonタブレットアプリを開く",
"app.navBar.settingsDropdown.helpDesc": "ユーザーをビデオチュートリアルへつなげる(新しいタブを開く)",
"app.navBar.settingsDropdown.endMeetingDesc": "現在の会議を終了する",
"app.navBar.settingsDropdown.endMeetingLabel": "会議を終了する",
"app.navBar.userListToggleBtnLabel": "ユーザーリストのトグル",
"app.navBar.toggleUserList.ariaLabel": "ユーザーとメッセージの切替",
"app.navBar.toggleUserList.newMessages": "メッセージを通知する",
"app.navBar.toggleUserList.newMsgAria": "{0}から新しいメッセージ",
"app.navBar.recording": "このセッションは録画されています",
"app.navBar.recording": "この会議は録画されています",
"app.navBar.recording.on": "録画中",
"app.navBar.recording.off": "録画されていません",
"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.title": "終了します... {0}",
"app.endMeeting.description": "この操作により、会議を終了します。まだ{0}人が参加していますが本当に構いませんか?",
"app.endMeeting.noUserDescription": "本当にこの会議を終了しますか?",
"app.endMeeting.contentWarning": "この会議のチャットメッセージ、共有メモ、ホワイトボードの書き込み、そして共有ドキュメントにはもうアクセスできなくなります",
"app.endMeeting.yesLabel": "ユーザー全員を退室させる",
"app.endMeeting.noLabel": "いいえ",
"app.about.title": "このソフトウェアについて",
"app.about.version": "ビルド番号:",
@ -369,6 +419,15 @@
"app.about.confirmDesc": "OK",
"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": "いいえ、アプリストアを開いてダウンロードします",
"app.mobileAppModal.dismissLabel": "キャンセル",
"app.mobileAppModal.dismissDesc": "閉じる",
"app.mobileAppModal.userConnectedWithSameId": "ユーザー{0}があなたと同じIDを使用して接続しました。",
"app.actionsBar.changeStatusLabel": "ステータス変更",
"app.actionsBar.muteLabel": "ミュート",
"app.actionsBar.unmuteLabel": "ミュート解除",
@ -379,19 +438,22 @@
"app.actionsBar.actionsDropdown.restorePresentationDesc": "最小化したプレゼンパネルを復活させるボタン",
"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": "アプリケーションのフォントサイズを小さくする",
"app.submenu.application.currentSize": "現在{0}",
"app.submenu.application.currentSize": "現在 {0}",
"app.submenu.application.languageLabel": "使用言語",
"app.submenu.application.languageOptionLabel": "言語を選択",
"app.submenu.application.noLocaleOptionLabel": "アクティブなロケールがありません",
"app.submenu.application.paginationEnabledLabel": "ビデオのページ付け",
"app.submenu.application.layoutOptionLabel": "レイアウトのタイプ",
"app.submenu.application.pushLayoutLabel": "レイアウトを強制",
"app.submenu.notification.SectionTitle": "通知",
"app.submenu.notification.Desc": "何をどのように通知するかを設定できます。",
"app.submenu.notification.audioAlertLabel": "音声通知",
@ -402,7 +464,7 @@
"app.submenu.notification.guestWaitingLabel": "承認待ちのゲスト",
"app.submenu.audio.micSourceLabel": "マイクのソース",
"app.submenu.audio.speakerSourceLabel": "スピーカーのソース",
"app.submenu.audio.streamVolumeLabel": "音声ストリームの音量",
"app.submenu.audio.streamVolumeLabel": "入力音量",
"app.submenu.video.title": "ビデオ",
"app.submenu.video.videoSourceLabel": "ソースを表示",
"app.submenu.video.videoOptionLabel": "ソース表示を選択",
@ -419,15 +481,15 @@
"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.raisedHandsTitle": "手をげる",
"app.statusNotifier.raisedHandDesc": "{0}人が手を上げました",
"app.statusNotifier.raisedHandDescOneUser": "{0}人が手を上げました",
"app.statusNotifier.raisedHandsTitle": "手をげる",
"app.statusNotifier.raisedHandDesc": "{0}が手をあげました",
"app.statusNotifier.raisedHandDescOneUser": "{0}が手をあげました",
"app.statusNotifier.and": "と",
"app.switch.onLabel": "入",
"app.switch.offLabel": "切",
@ -440,7 +502,6 @@
"app.actionsBar.actionsDropdown.presentationLabel": "プレゼン用ファイルの管理",
"app.actionsBar.actionsDropdown.initPollLabel": "投票を初期化",
"app.actionsBar.actionsDropdown.desktopShareLabel": "画面を共有",
"app.actionsBar.actionsDropdown.lockedDesktopShareLabel": "画面共有ロック",
"app.actionsBar.actionsDropdown.stopDesktopShareLabel": "画面共有をやめる",
"app.actionsBar.actionsDropdown.presentationDesc": "プレゼンテーションをアップロード",
"app.actionsBar.actionsDropdown.initPollDesc": "投票を初期化",
@ -453,16 +514,17 @@
"app.actionsBar.actionsDropdown.createBreakoutRoomDesc": "現在の会議を分割し、小会議を作成する",
"app.actionsBar.actionsDropdown.captionsLabel": "字幕を作成する",
"app.actionsBar.actionsDropdown.captionsDesc": "字幕を切り替える",
"app.actionsBar.actionsDropdown.takePresenter": "プレゼンターになる",
"app.actionsBar.actionsDropdown.takePresenterDesc": "自分を新しいプレゼンターとして割り当てる",
"app.actionsBar.actionsDropdown.takePresenter": "発表者になる",
"app.actionsBar.actionsDropdown.takePresenterDesc": "自分を新しい発表者とする",
"app.actionsBar.actionsDropdown.selectRandUserLabel": "参加者を無作為に指名",
"app.actionsBar.actionsDropdown.selectRandUserDesc": "現参加者の中からランダムに一人あてます",
"app.actionsBar.actionsDropdown.selectRandUserDesc": "現視聴者の中からランダムに一人あてます",
"app.actionsBar.actionsDropdown.propagateLayoutLabel": "レイアウトを全体で統一",
"app.actionsBar.emojiMenu.statusTriggerLabel": "ステータス設定",
"app.actionsBar.emojiMenu.awayLabel": "不在",
"app.actionsBar.emojiMenu.awayDesc": "スタータスを「不在」にする",
"app.actionsBar.emojiMenu.raiseHandLabel": "挙手",
"app.actionsBar.emojiMenu.lowerHandLabel": "手をおろす",
"app.actionsBar.emojiMenu.raiseHandDesc": "質問がありましたら挙手してください",
"app.actionsBar.emojiMenu.raiseHandDesc": "質問があれば挙手してください",
"app.actionsBar.emojiMenu.neutralLabel": "普通",
"app.actionsBar.emojiMenu.neutralDesc": "ステータスを「普通」にする",
"app.actionsBar.emojiMenu.confusedLabel": "ん?",
@ -484,7 +546,7 @@
"app.actionsBar.captions.stop": "字幕を非表示",
"app.audioNotification.audioFailedError1001": "WebSocketが切断されました (error 1001)",
"app.audioNotification.audioFailedError1002": "WebSocket接続に失敗しました (error 1002)",
"app.audioNotification.audioFailedError1003": "このバージョンのブラウザはサポートされていません (error 1003)",
"app.audioNotification.audioFailedError1003": "このブラウザのバージョンはサポートされていません (error 1003)",
"app.audioNotification.audioFailedError1004": "呼び出しに失敗しました (理由={0}) (error 1004)",
"app.audioNotification.audioFailedError1005": "通話が予期せず終了しました (error 1005)",
"app.audioNotification.audioFailedError1006": "呼び出しがタイムアウトしました (error 1006)",
@ -496,8 +558,9 @@
"app.audioNotification.audioFailedError1012": "接続が閉じました (ICE error 1012)",
"app.audioNotification.audioFailedMessage": "音声接続に失敗しました",
"app.audioNotification.mediaFailedMessage": "getUserMicMediaは失敗しました。許可されているのは安全な発行元のみです。",
"app.audioNotification.deviceChangeFailed": "オーディオデバイスの変更に失敗しました。選択したデバイスが正しく設定されていて、使用可能であるかどうか確認してください。",
"app.audioNotification.closeLabel": "閉じる",
"app.audioNotificaion.reconnectingAsListenOnly": "参加者のマイクはロックされています。「聴講のみ」の接続を行います。",
"app.audioNotificaion.reconnectingAsListenOnly": "視聴者のマイクはロックされています。「聴講のみ」の接続を行います。",
"app.breakoutJoinConfirmation.title": "小会議室に参加",
"app.breakoutJoinConfirmation.message": "この部屋に入室しますか:",
"app.breakoutJoinConfirmation.confirmDesc": "小会議室に参加します",
@ -509,6 +572,7 @@
"app.breakout.dropdown.manageDuration": "利用時間を変更",
"app.breakout.dropdown.destroyAll": "小会議室を閉じる",
"app.breakout.dropdown.options": "小会議室の設定",
"app.breakout.dropdown.manageUsers": "ユーザーの管理",
"app.calculatingBreakoutTimeRemaining": "残り時間を計算中...",
"app.audioModal.ariaTitle": "音声参加モーダル",
"app.audioModal.microphoneLabel": "マイクをオン",
@ -517,7 +581,7 @@
"app.audioModal.listenOnlyDesc": "音声付きの会議に聴講のみで参加",
"app.audioModal.audioChoiceLabel": "音声参加の方法を選んでください",
"app.audioModal.iOSBrowser": "サポートされていない音声/ビデオ",
"app.audioModal.iOSErrorDescription": "iOSのChromeでは、音声、 ビデオは現在サポートされていません",
"app.audioModal.iOSErrorDescription": "iOSのChromeでは、音声、 ビデオは今のところサポートされていません",
"app.audioModal.iOSErrorRecommendation": "Safari iOSをお使いください",
"app.audioModal.audioChoiceDesc": "音声はどうしますか?",
"app.audioModal.unsupportedBrowserLabel": "サポート対象外のブラウザを使用している可能性があります。サポート対象の {0} または {1} をお使いください。",
@ -553,24 +617,47 @@
"app.audio.joinAudio": "音声で参加",
"app.audio.leaveAudio": "音声を停止",
"app.audio.changeAudioDevice": "オーディオデバイスを変更",
"app.audio.enterSessionLabel": "セッションに参加",
"app.audio.enterSessionLabel": "会議に参加",
"app.audio.playSoundLabel": "音声を再生",
"app.audio.stopAudioFeedback": "エコー再生を停止",
"app.audio.backLabel": "戻る",
"app.audio.loading": "ロード中",
"app.audio.microphones": "マイク",
"app.audio.speakers": "スピーカー",
"app.audio.noDeviceFound": "デバイスが見つかりません",
"app.audio.audioSettings.titleLabel": "音声設定を選択",
"app.audio.audioSettings.descriptionLabel": "マイク共有の許可を求めるダイアログがブラウザ内に現われますのでご了承ください。",
"app.audio.audioSettings.descriptionLabel": "マイク共有の許可を求めるダイアログがブラウザ内にあらわれますのでご注意ください。",
"app.audio.audioSettings.microphoneSourceLabel": "マイクのソース",
"app.audio.audioSettings.speakerSourceLabel": "スピーカーのソース",
"app.audio.audioSettings.testSpeakerLabel": "スピーカーをテストする",
"app.audio.audioSettings.microphoneStreamLabel": "音声ストリームの音量",
"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": "デバイスのアクセスを許可する",
"app.audio.permissionsOverlay.hint": "会議に音声で参加するには、メディアデバイスの使用を許可する必要があります。",
"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": "重複したユーザーが会議に参加しようとしています",
@ -578,6 +665,7 @@
"app.meeting.logout.ejectedFromMeeting": "会議から退室させられました",
"app.meeting.logout.validateTokenFailedEjectReason": "認証トークンが確認できませんでした",
"app.meeting.logout.userInactivityEjectReason": "一定時間操作がなかったため、接続が中断されました",
"app.meeting.logout.maxParticipantsReached": "この会議に参加可能な最大人数に達しました",
"app.meeting-ended.rating.legendLabel": "評価のフィードバック",
"app.meeting-ended.rating.starLabel": "スター",
"app.modal.close": "閉じる",
@ -585,7 +673,7 @@
"app.modal.confirm": "完了",
"app.modal.newTab": "(新しいタブを開く)",
"app.modal.confirm.description": "変更を保存してウィンドウを閉じる",
"app.modal.randomUser.noViewers.description": "指名する参加者がいません",
"app.modal.randomUser.noViewers.description": "指名する視聴者がいません",
"app.modal.randomUser.selected.description": "あなたが選ばれました",
"app.modal.randomUser.title": "選ばれた人",
"app.modal.randomUser.who": "誰が選ばれるでしょう..?",
@ -599,11 +687,14 @@
"app.error.403": "会議から退室させられました",
"app.error.404": "見つかりません",
"app.error.408": "認証に失敗しました",
"app.error.409": "競合",
"app.error.410": "会議は終了しました",
"app.error.500": "問題が起こりました",
"app.error.userLoggedOut": "ログアウトしたため、セッショントークンが無効になっています",
"app.error.ejectedUser": "強制退出のため、セッショントークンが無効になっています",
"app.error.joinedAnotherWindow": "このセッションはブラウザの別ウィンドウで既に開かれているようです。",
"app.error.503": "接続が切断されました",
"app.error.disconnected.rejoin": "ページを再読み込みすると再び参加できます",
"app.error.userLoggedOut": "ログアウトしたため、会議の参加許可が無効になっています",
"app.error.ejectedUser": "強制退出のため、会議の参加許可が無効になっています",
"app.error.joinedAnotherWindow": "この会議はブラウザの別ウィンドウで既に開かれているようです。",
"app.error.userBanned": "ユーザーは退出させられています",
"app.error.leaveLabel": "再ログイン",
"app.error.fallback.presentation.title": "エラーが発生しました",
@ -611,14 +702,14 @@
"app.error.fallback.presentation.reloadButton": "再読み込み",
"app.guest.waiting": "主催者の承認待ち",
"app.guest.errorSeeConsole": "エラー:詳細はコンソールに表示。",
"app.guest.noModeratorResponse": "モデレーターからの反応がありません。",
"app.guest.noSessionToken": "セッションのトークンを受け取っていません。",
"app.guest.noModeratorResponse": "司会者からの反応がありません。",
"app.guest.noSessionToken": "会議の参加許可が得られていません。",
"app.guest.windowTitle": "BigBlueButton - ゲストロビー",
"app.guest.missingToken": "セッショントークンのないゲスト。",
"app.guest.missingToken": "会議の参加許可のないゲスト。",
"app.guest.missingSession": "セッションが不明のゲスト。",
"app.guest.missingMeeting": "会議は開かれていません。",
"app.guest.meetingEnded": "会議は終わりました。",
"app.guest.guestWait": "モデレーターが参加を許可するまでお待ちください。",
"app.guest.guestWait": "司会者が参加を許可するまでお待ちください。",
"app.guest.guestDeny": "会議への参加を拒否されたゲスト。",
"app.guest.seatWait": "会議への参加許可を待っているゲスト。",
"app.guest.allow": "参加を許可され会議へ向かうゲスト。",
@ -634,31 +725,35 @@
"app.userList.guest.allowEveryone": "全員を許可する",
"app.userList.guest.denyEveryone": "全員を拒否する",
"app.userList.guest.pendingUsers": "{0} 保留中のユーザー",
"app.userList.guest.noPendingUsers": "現在保留中のユーザーはいません",
"app.userList.guest.noPendingUsers": "今のところ保留中のユーザーはいません",
"app.userList.guest.pendingGuestUsers": "{0} 保留中のゲストユーザー",
"app.userList.guest.pendingGuestAlert": "はセッションに参加し、許可を待っています。",
"app.userList.guest.rememberChoice": "選択を記憶させる",
"app.userList.guest.emptyMessage": "現在のところメッセージはありません",
"app.userList.guest.emptyMessage": "のところメッセージはありません",
"app.userList.guest.inputPlaceholder": "ゲストロビーへのメッセージ",
"app.userList.guest.privateInputPlaceholder": "{0}へのメッセージ",
"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.chat.public": "新しいグループチャットメッセージ",
"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": "手をろしました",
"app.toast.promotedLabel": "あなたはモデレーターになりました",
"app.toast.demotedLabel": "あなたはビューアーになりました",
"app.notification.recordingStart": "録画が開始しました",
"app.notification.recordingStop": "このセッションは録画されていません",
"app.toast.setEmoji.raiseHand": "手をげました",
"app.toast.setEmoji.lowerHand": "手をろしました",
"app.toast.promotedLabel": "あなたは司会者になりました",
"app.toast.demotedLabel": "あなたは視聴者になりました",
"app.notification.recordingStart": "この会議は録画されています",
"app.notification.recordingStop": "この会議は録画されていません",
"app.notification.recordingPaused": "このセッションはもう録画されていません",
"app.notification.recordingAriaLabel": "録画時間",
"app.notification.userJoinPushAlert": "{0} がセッションに参加しました",
@ -666,7 +761,7 @@
"app.submenu.notification.raiseHandLabel": "挙手",
"app.shortcut-help.title": "キーボードショートカット",
"app.shortcut-help.accessKeyNotAvailable": "使用できないアクセスキー",
"app.shortcut-help.comboLabel": "コンボ",
"app.shortcut-help.comboLabel": "キー",
"app.shortcut-help.functionLabel": "機能",
"app.shortcut-help.closeLabel": "閉じる",
"app.shortcut-help.closeDesc": "キーボードショートカットウィンドウを閉じる",
@ -680,30 +775,62 @@
"app.shortcut-help.raiseHand": "挙手状態の切り替え",
"app.shortcut-help.openDebugWindow": "デバッグウィンドウを開く",
"app.shortcut-help.openStatus": "ステータスメニューを開く",
"app.shortcut-help.togglePan": "パンツールを有効にする(プレゼンターのみ)",
"app.shortcut-help.toggleFullscreen": "フルスクリーン切り替え(プレゼンターのみ)",
"app.shortcut-help.nextSlideDesc": "次のスライド(プレゼンターのみ)",
"app.shortcut-help.previousSlideDesc": "前のスライド(プレゼンターのみ)",
"app.shortcut-help.togglePanKey": "スペース",
"app.shortcut-help.toggleFullscreenKey": "エンター",
"app.shortcut-help.nextSlideKey": "右矢印",
"app.shortcut-help.previousSlideKey": "左矢印",
"app.lock-viewers.title": "参加者の行動を制限",
"app.lock-viewers.description": "こちらの設定で参加者が使える機能を制限できます",
"app.shortcut-help.togglePan": "パンツールを有効にする(発表者のみ)",
"app.shortcut-help.toggleFullscreen": "全画面表示切り替え(発表者のみ)",
"app.shortcut-help.nextSlideDesc": "次のスライド(発表者のみ)",
"app.shortcut-help.previousSlideDesc": "前のスライド(発表者のみ)",
"app.shortcut-help.togglePanKey": "Spaceバー",
"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.featuresLable": "機能",
"app.lock-viewers.lockStatusLabel": "ステータス",
"app.lock-viewers.webcamLabel": "ウェブカメラを共有する",
"app.lock-viewers.otherViewersWebcamLabel": "他ビューアーのウェブカメラを見る",
"app.lock-viewers.otherViewersWebcamLabel": "他の視聴者のウェブカメラを見る",
"app.lock-viewers.microphoneLable": "マイクを共有する",
"app.lock-viewers.PublicChatLabel": "公開チャットにメッセージを送信する",
"app.lock-viewers.PrivateChatLable": "プライベートチャットにメッセージを送信する",
"app.lock-viewers.notesLabel": "共有ノートを編集する",
"app.lock-viewers.userListLabel": "他の視聴者をユーザーリストに表示する",
"app.lock-viewers.ariaTitle": "参加者の行動制限設定モーダル",
"app.lock-viewers.ariaTitle": "視聴者の行動制限設定モーダル",
"app.lock-viewers.button.apply": "適用",
"app.lock-viewers.button.cancel": "キャンセル",
"app.lock-viewers.locked": "禁止",
"app.lock-viewers.hideViewersCursor": "他のビューアーのカーソルを表示する",
"app.lock-viewers.hideViewersCursor": "他の視聴者のカーソルを表示する",
"app.guest-policy.ariaTitle": "入室許可設定モーダル",
"app.guest-policy.title": "入室許可設定",
"app.guest-policy.description": "会議室の入室許可設定を変更する",
@ -714,36 +841,42 @@
"app.connection-status.ariaTitle": "接続状況モーダル",
"app.connection-status.title": "接続状況",
"app.connection-status.description": "ユーザーの接続状況の閲覧",
"app.connection-status.empty": "現在のところ接続の問題は報告されていません。",
"app.connection-status.empty": "のところ接続の問題は報告されていません。",
"app.connection-status.more": "更に見る",
"app.connection-status.copy": "データをコピー",
"app.connection-status.copied": "コピーしました!",
"app.connection-status.jitter": "ジッター",
"app.connection-status.label": "接続状況",
"app.connection-status.settings": "設定の調整",
"app.connection-status.settings": "設定を調整する",
"app.connection-status.no": "なし",
"app.connection-status.notification": "接続の切断がありました",
"app.connection-status.offline": "オフライン",
"app.connection-status.audioUploadRate": "音声のアップロード速度",
"app.connection-status.audioDownloadRate": "音声のダウンロード速度",
"app.connection-status.videoUploadRate": "映像のアップロード速度",
"app.connection-status.videoDownloadRate": "映像のダウンロード速度",
"app.connection-status.audioUploadRate": "音声の上り速度",
"app.connection-status.audioDownloadRate": "音声の下り速度",
"app.connection-status.videoUploadRate": "映像の上り速度",
"app.connection-status.videoDownloadRate": "映像の下り速度",
"app.connection-status.lostPackets": "パケットロス",
"app.connection-status.usingTurn": "TURN使用",
"app.connection-status.yes": "あり",
"app.connection-status.connectionStats": "接続の状態",
"app.connection-status.myLogs": "マイログ",
"app.connection-status.sessionLogs": "セッションログ",
"app.connection-status.connectionStats": "統計値",
"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": "低",
@ -760,35 +893,43 @@
"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.profileNotFoundLabel": "カメラの性能が適合しません",
"app.videoPreview.brightness": "明るさ",
"app.videoPreview.wholeImageBrightnessLabel": "画像全体",
"app.videoPreview.wholeImageBrightnessDesc": "背景を含めて画像全体に調整を適用",
"app.videoPreview.sliderDesc": "明るさのレベルを増減させる",
"app.video.joinVideo": "ウェブカメラを共有",
"app.video.connecting": "ウェブカメラの共有を始めます...",
"app.video.leaveVideo": "ウェブカメラの共有を終了",
"app.video.videoSettings": "ビデオの設定",
"app.video.visualEffects": "視覚効果",
"app.video.advancedVideo": "詳細設定を開く",
"app.video.iceCandidateError": "ICE候補の追加に失敗しました",
"app.video.iceConnectionStateError": "接続失敗 (ICE error 1107)",
"app.video.permissionError": "ウェブカメラ共有でエラーが発生しました。許可設定を確認してください。",
"app.video.permissionError": "ウェブカメラの共有でエラーが発生しました。使用許可が与えられているかどうか確認してください。",
"app.video.sharingError": "ウェブカメラ共有エラー",
"app.video.abortError": "問題が起きたためデバイスが使用できなくなりました",
"app.video.overconstrainedError": "お使いのカメラはこの画質をサポートしません",
"app.video.securityError": "お使いのブラウザではカメラが使用できません。他のブラウザを使用してください",
"app.video.typeError": "無効なカメラの画質設定です。管理者に連絡してください",
"app.video.notFoundError": "ウェブカメラが見つかりませんでした。接続を確認してください",
"app.video.notAllowed": "ウェブカメラを共有する権限を得る必要があります",
"app.video.notAllowed": "ウェブカメラの共有権限を与える必要があります",
"app.video.notSupportedError": "このブラウザはサポートされていません。他のブラウザを使用するか、デバイスを変更してください",
"app.video.notReadableError": "ウェブカメラの映像を取得できませんでした。他のプログラムがカメラを使ってないことを確認してください",
"app.video.notReadableError": "ウェブカメラの映像を取得できませんでした。他のアプリケーションがカメラを使ってないことを確認してください",
"app.video.timeoutError": "ブラウザが時間内に反応しませんでした",
"app.video.genericError": "デバイスに不明なエラーが起きました (Error {0})",
"app.video.inactiveError": "ウェブカメラが予期せず停止しました。ブラウザのカメラ使用許可を調べてください。",
"app.video.mediaTimedOutError": "ウェブカメラのストリームが中断しました。もう一度共有しなおしてください",
"app.video.mediaFlowTimeout1020": "映像がサーバに届いていません (error 1020)",
"app.video.suggestWebcamLock": "視聴者のカメラをロックしますか?",
"app.video.suggestWebcamLockReason": "(会議の安定性が向上します)",
"app.video.enable": "起動する",
"app.video.cancel": "キャンセル",
"app.video.swapCam": "スワップ",
"app.video.swapCam": "反転",
"app.video.swapCamDesc": "ウェブカメラの向きを反転する",
"app.video.videoLocked": "ウェブカメラ共有がロックされています",
"app.video.videoButtonDesc": "ウェブカメラを共有",
@ -800,17 +941,26 @@
"app.video.clientDisconnected": "接続に問題があるためウェブカメラの共有ができません",
"app.video.virtualBackground.none": "なし",
"app.video.virtualBackground.blur": "ぼかし",
"app.video.virtualBackground.home": "ホーム",
"app.video.virtualBackground.board": "ボード",
"app.video.virtualBackground.home": "自宅",
"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": "ここにドロップ",
"app.fullscreenButton.label": "{0}を全画面に切り替える",
"app.fullscreenUndoButton.label": "{0}のフルスクリーン表示を解除",
"app.fullscreenUndoButton.label": "{0}の全画面表示を解除",
"app.switchButton.expandLabel": "画面共有のビデオを拡大",
"app.switchButton.shrinkLabel": "画面共有のビデオを縮小",
"app.sfu.mediaServerConnectionError2000": "メディアサーバーに接続できません (error 2000)",
@ -826,6 +976,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 +1003,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,13 +1023,13 @@
"app.videoDock.webcamUnfocusDesc": "選択したウェブカメラのフォーカスを外す",
"app.videoDock.webcamPinLabel": "ピン止め",
"app.videoDock.webcamPinDesc": "選択したウェブカメラをピン止めする",
"app.videoDock.webcamFullscreenLabel": "ウェブカメラを全画面表示にする",
"app.videoDock.webcamSqueezedButtonLabel": "ウェブカメラの設定",
"app.videoDock.webcamUnpinLabel": "ピン止めを外す",
"app.videoDock.webcamUnpinLabelDisabled": "モデレーターだけがピン止めを外すことができます",
"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}",
@ -895,10 +1047,10 @@
"app.createBreakoutRoom.record": "録画",
"app.createBreakoutRoom.numberOfRooms": "会議室数",
"app.createBreakoutRoom.durationInMinutes": "利用時間(分)",
"app.createBreakoutRoom.randomlyAssign": "ランダムに割り当てる",
"app.createBreakoutRoom.randomlyAssignDesc": "ユーザーをランダムに小会議室に割り当てる",
"app.createBreakoutRoom.resetAssignments": "割り当てをリセット",
"app.createBreakoutRoom.resetAssignmentsDesc": "全ての小会議室の割り当てをリセット",
"app.createBreakoutRoom.randomlyAssign": "ランダムに割りる",
"app.createBreakoutRoom.randomlyAssignDesc": "ユーザーをランダムに各部屋に割りふる",
"app.createBreakoutRoom.resetAssignments": "割りふりを解除",
"app.createBreakoutRoom.resetAssignmentsDesc": "全ての小会議室の割りふりを解除",
"app.createBreakoutRoom.endAllBreakouts": "全ての小会議室を終了する",
"app.createBreakoutRoom.chatTitleMsgAllRooms": "全ての小会議室",
"app.createBreakoutRoom.msgToBreakoutsSent": "小会議室{0}にメッセージが送られました",
@ -908,10 +1060,12 @@
"app.createBreakoutRoom.minusRoomTime": "小会議室の制限時間を減らす",
"app.createBreakoutRoom.addRoomTime": "小会議室の制限時間を増やす",
"app.createBreakoutRoom.addParticipantLabel": "+参加者を追加",
"app.createBreakoutRoom.freeJoin": "ユーザーに参加する小会議室を選択させる",
"app.createBreakoutRoom.freeJoin": "ユーザーに小会議室を選択させる",
"app.createBreakoutRoom.captureNotes": "小会議室終了時に共有ノートを保存",
"app.createBreakoutRoom.captureSlides": "小会議室終了時にホワイトボードを保存",
"app.createBreakoutRoom.leastOneWarnBreakout": "小会議室には最低1人のユーザーが必要です。",
"app.createBreakoutRoom.minimumDurationWarnBreakout": "小会議室の最小利用時間は{0}分です。",
"app.createBreakoutRoom.modalDesc": "ヒント:ユーザーの名前をドラッグ&ドロップして、特定の小会議室に割り当てることができます。",
"app.createBreakoutRoom.modalDesc": "やり方:ユーザーの名前をドラッグ&ドロップして、特定の小会議室に割りふってください。",
"app.createBreakoutRoom.roomTime": "{0} 分",
"app.createBreakoutRoom.numberOfRoomsError": "会議室の数が正しく設定されていません。",
"app.createBreakoutRoom.duplicatedRoomNameError": "会議室名を重複してつけることはできません。",
@ -921,6 +1075,14 @@
"app.createBreakoutRoom.setTimeCancel": "キャンセル",
"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": "動画のURL",
@ -946,6 +1108,15 @@
"app.debugWindow.form.enableAutoarrangeLayoutDescription": "(ウェブカメラエリアをドラッグしたりリサイズしたりすると無効となります)",
"app.debugWindow.form.chatLoggerLabel": "チャットロガーレベルをテストする",
"app.debugWindow.form.button.apply": "設定",
"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": "プレゼンにフォーカス",
@ -969,7 +1140,7 @@
"playback.player.about.modal.shortcuts.title": "ショートカット",
"playback.player.about.modal.shortcuts.alt": "Alt",
"playback.player.about.modal.shortcuts.shift": "Shift",
"playback.player.about.modal.shortcuts.fullscreen": "フルスクリーン切り替え",
"playback.player.about.modal.shortcuts.fullscreen": "全画面表示切り替え",
"playback.player.about.modal.shortcuts.play": "再生/ポーズ",
"playback.player.about.modal.shortcuts.section": "サイドパネル表示の切り替え",
"playback.player.about.modal.shortcuts.seek.backward": "前を検索",
@ -995,6 +1166,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": "ダウンロードされました!",
@ -1019,6 +1191,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": "会話時間",
@ -1032,7 +1210,7 @@
"app.learningDashboard.usersTable.userStatusOffline": "オフライン",
"app.learningDashboard.usersTable.noUsers": "まだユーザーはいません",
"app.learningDashboard.usersTable.name": "名前",
"app.learningDashboard.usersTable.moderator": "モデレーター",
"app.learningDashboard.usersTable.moderator": "司会者",
"app.learningDashboard.usersTable.pollVotes": "得票",
"app.learningDashboard.usersTable.join": "参加",
"app.learningDashboard.usersTable.left": "退室",
@ -1041,10 +1219,15 @@
"app.learningDashboard.pollsTable.anonymousAnswer": "匿名投票(回答は最終行)",
"app.learningDashboard.pollsTable.anonymousRowName": "匿名",
"app.learningDashboard.pollsTable.noPollsCreatedHeading": "投票は行われていません",
"app.learningDashboard.pollsTable.noPollsCreatedMessage": "投票が行われれば、ここに結果が表示されます",
"app.learningDashboard.pollsTable.noPollsCreatedMessage": "投票が行われると、ここに結果が表示されます",
"app.learningDashboard.pollsTable.answerTotal": "計",
"app.learningDashboard.pollsTable.userLabel": "ユーザー",
"app.learningDashboard.statusTimelineTable.title": "タイムライン",
"app.learningDashboard.statusTimelineTable.thumbnail": "プレゼンのサムネール",
"app.learningDashboard.errors.invalidToken": "セッショントークンが無効です",
"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": "上のボタンで自分のポータルサイトを追加するか、",
"mobileApp.portals.list.empty.orUseOurDemoServer.label": "公式のデモサーバーを使用してください。",
@ -1055,8 +1238,6 @@
"mobileApp.portals.addPortalPopup.confirm.button.label": "保存",
"mobileApp.portals.drawerNavigation.button.label": "ポータル",
"mobileApp.portals.addPortalPopup.validation.emptyFields": "必須項目",
"mobileApp.portals.addPortalPopup.validation.portalNameAlreadyExists": "名前が既に使用されています",
"mobileApp.portals.addPortalPopup.validation.urlInvalid": "ウェブページのアクセスに失敗しましたーURLとネットワーク接続を確認してください"
"mobileApp.portals.addPortalPopup.validation.portalNameAlreadyExists": "その名前はもう使われています",
"mobileApp.portals.addPortalPopup.validation.urlInvalid": "ウェブページのアクセスに失敗しました - URLとネットワーク接続を確認してください"
}

View File

@ -2,10 +2,11 @@
"app.home.greeting": "Sunumunuz birazdan başlayacak...",
"app.chat.submitLabel": "İleti gönder",
"app.chat.loading": "Sohbet iletileri yüklendi: {0}%",
"app.chat.errorMaxMessageLength": "İleti {0} karakter daha uzun",
"app.chat.errorMaxMessageLength": "İleti çok uzun. En fazla {0} karakter olabilir",
"app.chat.disconnected": "Bağlantınız kesildi, iletiler gönderilemedi",
"app.chat.locked": "Sohbet kilitli, ileti gönderilemez",
"app.chat.inputLabel": "{0} sohbeti için ileti girişi",
"app.chat.emojiButtonLabel": "Emoji seçici",
"app.chat.inputPlaceholder": "İleti {0}",
"app.chat.titlePublic": "Herkese açık sohbet",
"app.chat.titlePrivate": "{0} ile özel sohbet",
@ -20,7 +21,8 @@
"app.chat.label": "Sohbet",
"app.chat.offline": "Çevrimdışı",
"app.chat.pollResult": "Oylama sonuçları",
"app.chat.breakoutDurationUpdated": "Çalışma odası zamanı {0} dakika",
"app.chat.breakoutDurationUpdated": "Çalışma grubu zamanı {0} dakika",
"app.chat.breakoutDurationUpdatedModerator": "Çalışma grubu odaları {0} dakika için açıldı ve bir bildirim gönderildi.",
"app.chat.emptyLogLabel": "Sohbet günlüğü boş",
"app.chat.clearPublicChatMessage": "Herkese açık sohbet geçmişi sorumlu tarafından temizlendi",
"app.chat.multi.typing": "Birkaç kullanıcı yazıyor",
@ -28,6 +30,27 @@
"app.chat.two.typing": "{0} ve {1} yazıyor...",
"app.chat.copySuccess": "Sohbet yazışmaları kopyalandı",
"app.chat.copyErr": "Sohbet yazışmaları kopyalanamadı",
"app.emojiPicker.search": "Arama",
"app.emojiPicker.notFound": "Herhangi bir emoji bulunamadı",
"app.emojiPicker.skintext": "Varsayılan ten renginizi seçin",
"app.emojiPicker.clear": "Temizle",
"app.emojiPicker.categories.label": "Emoji kategorileri",
"app.emojiPicker.categories.people": "Kişiler ve beden",
"app.emojiPicker.categories.nature": "Hayvanlar ve doğa",
"app.emojiPicker.categories.foods": "Yiyecek ve içecek",
"app.emojiPicker.categories.places": "Gezi ve yerler",
"app.emojiPicker.categories.activity": "Etkinlik",
"app.emojiPicker.categories.objects": "Nesneler",
"app.emojiPicker.categories.symbols": "Simgeler",
"app.emojiPicker.categories.flags": "Bayraklar",
"app.emojiPicker.categories.recent": "Sık kullanılanlar",
"app.emojiPicker.categories.search": "Arama sonuçları",
"app.emojiPicker.skintones.1": "Varsayılan ten rengi",
"app.emojiPicker.skintones.2": "Açık ten rengi",
"app.emojiPicker.skintones.3": "Orta açık ten rengi",
"app.emojiPicker.skintones.4": "Orta ten rengi",
"app.emojiPicker.skintones.5": "Orta koyu ten rengi",
"app.emojiPicker.skintones.6": "Koyu ten rengi",
"app.captions.label": "Alt yazılar",
"app.captions.menu.close": "Kapat",
"app.captions.menu.start": "Başlat",
@ -53,12 +76,21 @@
"app.captions.speech.start": "Konuşma tanıma başlatıldı",
"app.captions.speech.stop": "Konuşma tanıma durduruldu",
"app.captions.speech.error": "Sesli algılama web tarayıcı uyumsuzluğu ya da belirli bir süre sessizlikten dolayı durduruldu.",
"app.confirmation.skipConfirm": "Bir daha sorulmasın",
"app.confirmation.virtualBackground.title": "Yeni bir sanal arka plan başlat",
"app.confirmation.virtualBackground.description": "{0} anal arka plan olarak eklenecek. İlerlemek istiyor musunuz?",
"app.confirmationModal.yesLabel": "Evet",
"app.textInput.sendLabel": "Gönder",
"app.title.defaultViewLabel": "Varsayılan sunum görünümü",
"app.notes.title": "Paylaşılmış notlar",
"app.notes.label": "Notlar",
"app.notes.hide": "Notları gizle",
"app.notes.locked": "Kilitli",
"app.notes.disabled": "Ortam alanına sabitlendi",
"app.notes.notesDropdown.covertAndUpload": "Notları sunuma dönüştür",
"app.notes.notesDropdown.pinNotes": "Notları beyaz tahtaya sabitle",
"app.notes.notesDropdown.unpinNotes": "Notların sabitlemesini kaldır",
"app.notes.notesDropdown.notesOptions": "Not ayarları",
"app.pads.hint": "Pad araç çubuğuna odaklanmak için Esc tuşuna basın",
"app.user.activityCheck": "Kullanıcı etkinliği denetimi",
"app.user.activityCheck.label": "Kullanıcının hala toplantıda olup olmadığını denetleyin ({0})",
@ -78,7 +110,7 @@
"app.userList.moderator": "Sorumlu",
"app.userList.mobile": "Mobil",
"app.userList.guest": "Konuk",
"app.userList.sharingWebcam": "Web kamerası",
"app.userList.sharingWebcam": "Kamera",
"app.userList.menuTitleContext": "Kullanılabilecek seçenekler",
"app.userList.chatListItem.unreadSingular": "Bir yeni ileti",
"app.userList.chatListItem.unreadPlural": "{0} yeni ileti",
@ -151,7 +183,7 @@
"app.screenshare.screenshareRetryOtherEnvError": "Kod {0}. Ekran paylaşılamadı. Farklı bir web tarayıcı veya aygıt kullanarak yeniden deneyin.",
"app.screenshare.screenshareUnsupportedEnv": "Kod {0}. Web tarayıcı desteklenmiyor. Farklı bir web tarayıcı ya da aygıt kullanarak yeniden deneyin.",
"app.screenshare.screensharePermissionError": "Kod {0}. Ekran yakalama izninin verilmesi gerekiyor.",
"app.meeting.ended": "Bu oturum sona erdi",
"app.meeting.ended": "Bu oturum kapatıldı",
"app.meeting.meetingTimeRemaining": "Toplantının bitmesine kalan süre: {0}",
"app.meeting.meetingTimeHasEnded": "Zaman doldu. Toplantı birazdan sona erecek",
"app.meeting.endedByUserMessage": "{0} bu oturumu kapattı",
@ -160,8 +192,8 @@
"app.meeting.endedMessage": "Açılış ekranına geri döneceksiniz",
"app.meeting.alertMeetingEndsUnderMinutesSingular": "Toplantı bir dakika içinde sona erecek.",
"app.meeting.alertMeetingEndsUnderMinutesPlural": "Toplantı {0} dakika içinde sona erecek.",
"app.meeting.alertBreakoutEndsUnderMinutesPlural": "Grup çalışması {0} dakika içinde sona erecek.",
"app.meeting.alertBreakoutEndsUnderMinutesSingular": "Grup çalışması bir dakika içinde sona erecek.",
"app.meeting.alertBreakoutEndsUnderMinutesPlural": "Çalışma grubu {0} dakika içinde sona erecek.",
"app.meeting.alertBreakoutEndsUnderMinutesSingular": "Çalışma grubu bir dakika içinde sona erecek.",
"app.presentation.hide": "Sunumu gizle",
"app.presentation.notificationLabel": "Geçerli sunum",
"app.presentation.downloadLabel": "İndir",
@ -170,7 +202,7 @@
"app.presentation.endSlideContent": "Slayt içeriği bitişi",
"app.presentation.changedSlideContent": "Sunum şu slayta değiştirildi: {0}",
"app.presentation.emptySlideContent": "Geçerli slayt için içerik yok",
"app.presentation.options.fullscreen": "Tam ekrana geç",
"app.presentation.options.fullscreen": "Sunumu tam ekran görüntüle",
"app.presentation.options.exitFullscreen": "Tam ekrandan çık",
"app.presentation.options.minimize": "Küçült",
"app.presentation.options.snapshot": "Geçerli slaytın ekran görüntüsü",
@ -203,7 +235,18 @@
"app.presentation.presentationToolbar.goToSlide": "{0}. slayt",
"app.presentation.placeholder": "Şu anda etkin bir sunum yok",
"app.presentationUploder.title": "Sunum",
"app.presentationUploder.message": "Sunucu olarak, herhangi bir ofis ya da PDF belgesi yükleyebilirsiniz. En iyi sonucu almak için PDF belgesi kullanmanız önerilir. Lütfen sağ taraftaki daire işaret kutusunu kullanarak bir sunum seçildiğinden emin olun.",
"app.presentationUploder.message": "Sunucu olarak, herhangi bir ofis ya da PDF belgesi yükleyebilirsiniz. En iyi sonucu almak için PDF belgesi kullanmanız önerilir. Lütfen sol taraftaki daire işaret kutusunu kullanarak bir sunum seçildiğinden emin olun.",
"app.presentationUploader.exportHint": "\"Sohbete gönder\" seçildiğinde, kullanıcılara herkese açık sohbet için ek açıklamalar bulunan bir indirilebilir bağlantı sunulur.",
"app.presentationUploader.exportToastHeader": "Sohbete gönderiliyor ({0} öge)",
"app.presentationUploader.exportToastHeaderPlural": "Sohbete gönderiliyor ({0} öge)",
"app.presentationUploader.exporting": "Sohbete gönderiliyor",
"app.presentationUploader.sending": "Gönderiliyor...",
"app.presentationUploader.collecting": "Slayt {0} / {1} ayıklanıyor...",
"app.presentationUploader.processing": "Slayt {0} / {1} açıklanıyor...",
"app.presentationUploader.sent": "Gönderildi",
"app.presentationUploader.exportingTimeout": "Dışa aktarma işlemi çok uzun sürüyor...",
"app.presentationUploader.export": "Sohbete gönder",
"app.presentationUploader.currentPresentationLabel": "Geçerli sunum",
"app.presentationUploder.extraHint": "ÖNEMLİ: Her bir dosya {0} MB boyutundan ve {1} sayfadan küçük olmalıdır.",
"app.presentationUploder.uploadLabel": "Yükle",
"app.presentationUploder.confirmLabel": "Onayla",
@ -214,6 +257,8 @@
"app.presentationUploder.dropzoneImagesLabel": "Yüklenecek görselleri sürükleyip buraya bırakın",
"app.presentationUploder.browseFilesLabel": "ya da dosyalara göz atın",
"app.presentationUploder.browseImagesLabel": "ya da görsellere göz atın veya yakalayın",
"app.presentationUploder.externalUploadTitle": "3. taraf uygulamadan içerik ekle",
"app.presentationUploder.externalUploadLabel": "Dosyalara göz at",
"app.presentationUploder.fileToUpload": "Yüklenecek ...",
"app.presentationUploder.currentBadge": "Geçerli",
"app.presentationUploder.rejectedError": "Seçilmiş dosya(lar) reddedildi. Lütfen dosya türlerini denetleyin.",
@ -230,14 +275,14 @@
"app.presentationUploder.conversion.generatedSlides": "Slaytlar oluşturuldu ...",
"app.presentationUploder.conversion.generatingSvg": "SVG görselleri oluşturuluyor ...",
"app.presentationUploder.conversion.pageCountExceeded": "Sayfa sayısı çok fazla. En fazla {0} olabilir",
"app.presentationUploder.conversion.invalidMimeType": "Geçersiz biçim algılandı (uzantı={0}, içerik türü={1})",
"app.presentationUploder.conversion.conversionTimeout": "{0}. slayt {1} denemede işlenemedi.",
"app.presentationUploder.conversion.officeDocConversionInvalid": "Ofis belgesi işlenemedi. Lütfen PDF olarak yükleyin.",
"app.presentationUploder.conversion.officeDocConversionFailed": "Ofis belgesi işlenemedi. Lütfen PDF olarak yükleyin.",
"app.presentationUploder.conversion.pdfHasBigPage": "PDF dosyasını dönüştürülemedi. Lütfen iyileştirmeyi deneyin. En fazla sayfa boyutu {0}",
"app.presentationUploder.conversion.timeout": "Sorun var, dönüştürme çok uzun sürdü",
"app.presentationUploder.conversion.pageCountFailed": "Sayfa sayısı belirlenemedi.",
"app.presentationUploder.conversion.unsupportedDocument": "Dosya uzantısı desteklenmiyor",
"app.presentationUploder.isDownloadableLabel": "Sunumun indirilmesine izin verilmiyor. Sununun indirilmesine izin vermek için tıklayın",
"app.presentationUploder.isNotDownloadableLabel": "Sunumun indirilmesine izin veriliyor. Sununun indirilmesine engellemek için tıklayın",
"app.presentationUploder.removePresentationLabel": "Sunumu kaldır",
"app.presentationUploder.setAsCurrentPresentation": "Sunumu geçerli olarak ayarla",
"app.presentationUploder.tableHeading.filename": "Dosya adı",
@ -251,6 +296,10 @@
"app.presentationUploder.clearErrors": "Hataları temizle",
"app.presentationUploder.clearErrorsDesc": "Başarısız olmuş sunum yüklemelerini temizler",
"app.presentationUploder.uploadViewTitle": "Sunum yükle",
"app.poll.questionAndoptions.label" : "Görüntülenecek soru metni.\nA. Anket seçeneği *\nB. Anket seçeneği (isteğe bağlı)\nC. Anket seçeneği (isteğe bağlı)\nD. Anket seçeneği (isteğe bağlı)\nE. Anket seçeneği (isteğe bağlı)",
"app.poll.customInput.label": "Özel giriş",
"app.poll.customInputInstructions.label": "Özel giriş etkinleştirildi. Anket sorularını ve seçeneklerini belirtilen biçimde yazın ya da aynı biçimde bir metin dosyasını sürükleyip bırakın.",
"app.poll.maxOptionsWarning.label": "Yalnızca ilk 5 seçenek kullanılabilir!",
"app.poll.pollPaneTitle": "Oylama",
"app.poll.enableMultipleResponseLabel": "Kişiler birden fazla yanıt gönderebilsin mi?",
"app.poll.quickPollTitle": "Hızlı oylama",
@ -270,7 +319,7 @@
"app.poll.clickHereToSelect": "Seçmek için buraya tıklayın",
"app.poll.question.label" : "Sorunuzu yazın...",
"app.poll.optionalQuestion.label" : "Sorunuzu yazın (isteğe bağlı)...",
"app.poll.userResponse.label" : "Kullanıcı yanıtı",
"app.poll.userResponse.label" : "Yazılan yanıt",
"app.poll.responseTypes.label" : "Yanıt türleri",
"app.poll.optionDelete.label" : "Sil",
"app.poll.responseChoices.label" : "Yanıt seçenekleri",
@ -329,19 +378,20 @@
"app.muteWarning.disableMessage": "Ses açılıncaya kadar uyarı sesini kapatma devre dışı bırakıldı",
"app.muteWarning.tooltip": "Kapatmak için tıklayın ve ses yeniden açılana kadar uyarıyı devre dışı bırakın",
"app.navBar.settingsDropdown.optionsLabel": "Seçenekler",
"app.navBar.settingsDropdown.fullscreenLabel": "Tam ekrana geç",
"app.navBar.settingsDropdown.fullscreenLabel": "Uygulamayı tam ekran görüntüle",
"app.navBar.settingsDropdown.settingsLabel": "Ayarlar",
"app.navBar.settingsDropdown.aboutLabel": "Hakkında",
"app.navBar.settingsDropdown.leaveSessionLabel": "Toplantıdan ayrıl",
"app.navBar.settingsDropdown.exitFullscreenLabel": "Tam ekrandan çık",
"app.navBar.settingsDropdown.fullscreenDesc": "Ayarlar menüsünü tam ekran yap",
"app.navBar.settingsDropdown.fullscreenDesc": "Ayarlar menüsünü tam ekran görüntüle",
"app.navBar.settingsDropdown.settingsDesc": "Genel ayarları değiştir",
"app.navBar.settingsDropdown.aboutDesc": "İstemci bilgilerini göster",
"app.navBar.settingsDropdown.leaveSessionDesc": "Toplantıdan ayrıl",
"app.navBar.settingsDropdown.exitFullscreenDesc": "Tam ekran kipinden çık",
"app.navBar.settingsDropdown.exitFullscreenDesc": "Tam ekrandan çık",
"app.navBar.settingsDropdown.hotkeysLabel": "Klavye kısayolları",
"app.navBar.settingsDropdown.hotkeysDesc": "Kullanılabilecek klavye kısayollarının listesi",
"app.navBar.settingsDropdown.helpLabel": "Yardım",
"app.navBar.settingsDropdown.openAppLabel": "BigBlueButton Tablet uygulamasında aç",
"app.navBar.settingsDropdown.helpDesc": "Kullanıcıya görüntülü eğitimleri açar (yeni sekmede)",
"app.navBar.settingsDropdown.endMeetingDesc": "Geçerli toplantıyı bitirir",
"app.navBar.settingsDropdown.endMeetingLabel": "Toplantıyı bitir",
@ -349,17 +399,17 @@
"app.navBar.toggleUserList.ariaLabel": "Kullanıcılar ve iletiler arasında geçiş yapar",
"app.navBar.toggleUserList.newMessages": "yeni ileti bildirimiyle",
"app.navBar.toggleUserList.newMsgAria": "{0} kullanıcısından yeni ileti",
"app.navBar.recording": "Bu oturum kaydedildi",
"app.navBar.recording": "Bu oturum kaydediliyor",
"app.navBar.recording.on": "Kaydediliyor",
"app.navBar.recording.off": "Kaydedilmiyor",
"app.navBar.emptyAudioBrdige": "Etkin bir mikrofon yok. Bu kayıda ses eklemek için mikrofonunuzu paylaşın.",
"app.leaveConfirmation.confirmLabel": "Ayrıl",
"app.leaveConfirmation.confirmDesc": "Sizi toplantıdan çıkarır",
"app.endMeeting.title": "{0} oturumunu kapat",
"app.endMeeting.description": "Bu işlem, {0} etkin kullanıcının bulunduğu oturumu sona erdirecek. Bu oturumu kapatmak istediğinize emin misiniz?",
"app.endMeeting.description": "Bu işlem, {0} etkin kullanıcının bulunduğu oturumu kapatacak. Bu oturumu kapatmak istediğinize emin misiniz?",
"app.endMeeting.noUserDescription": "Bu oturumu kapatmak istediğinize emin misiniz?",
"app.endMeeting.contentWarning": "Bu oturum için artık sohbet iletilerine, notlara, beyaz tahta içeriğine ve paylaşılmış belgelere doğrudan erişilemeyecek",
"app.endMeeting.yesLabel": "Evet",
"app.endMeeting.contentWarning": "Artık bu oturumdaki sohbet iletilerine, notlara, beyaz tahta içeriğine ve paylaşılmış belgelere doğrudan erişilemeyecek",
"app.endMeeting.yesLabel": "Oturumu tüm kullanıcılar için kapat",
"app.endMeeting.noLabel": "Hayır",
"app.about.title": "Hakkında",
"app.about.version": "İstemci yapımı:",
@ -369,6 +419,15 @@
"app.about.confirmDesc": "Tamam",
"app.about.dismissLabel": "Vazgeç",
"app.about.dismissDesc": "İstemci bilgilerini kapat",
"app.mobileAppModal.title": "BigBlueButton Tablet uygulamasını aç",
"app.mobileAppModal.description": "Aygıtınızda BigBlueButton Tablet uygulaması kurulu mu?",
"app.mobileAppModal.openApp": "Evet, uygulamayı aç",
"app.mobileAppModal.obtainUrlMsg": "Toplantı adresi alınıyor",
"app.mobileAppModal.obtainUrlErrorMsg": "Toplantı adresi alınırken sorun çıktı",
"app.mobileAppModal.openStore": "Hayır, indirmek için uygulama mağazasını aç",
"app.mobileAppModal.dismissLabel": "İptal",
"app.mobileAppModal.dismissDesc": "Kapat",
"app.mobileAppModal.userConnectedWithSameId": "{0} kullanıcısı sizinle aynı kodu kullanarak bağlandı.",
"app.actionsBar.changeStatusLabel": "Durumu değiştir",
"app.actionsBar.muteLabel": "Sesi kapat",
"app.actionsBar.unmuteLabel": "Sesi aç",
@ -379,10 +438,12 @@
"app.actionsBar.actionsDropdown.restorePresentationDesc": "Simge durumuna küçültüldükten sonra sunumu eski boyutuna döndüren düğme",
"app.actionsBar.actionsDropdown.minimizePresentationLabel": "Sunumu simge durumuna küçült",
"app.actionsBar.actionsDropdown.minimizePresentationDesc": "Sunumu simge durumuna küçülten düğme",
"app.actionsBar.actionsDropdown.layoutModal": "Ekran düzeni ayarları üste açılan penceresi",
"app.screenshare.screenShareLabel" : "Ekran paylaşımı",
"app.submenu.application.applicationSectionTitle": "Uygulama",
"app.submenu.application.animationsLabel": "Canlandırmalar",
"app.submenu.application.audioFilterLabel": "Mikrofon için ses süzgeçleri",
"app.submenu.application.darkThemeLabel": "Koyu kip",
"app.submenu.application.fontSizeControlLabel": "Yazı boyutu",
"app.submenu.application.increaseFontBtnLabel": "Uygulamanın yazı boyutunu büyüt",
"app.submenu.application.decreaseFontBtnLabel": "Uygulamanın yazı boyutunu küçült",
@ -392,6 +453,7 @@
"app.submenu.application.noLocaleOptionLabel": "Etkin bir dil bulunamadı",
"app.submenu.application.paginationEnabledLabel": "Görüntü sayfalandırma",
"app.submenu.application.layoutOptionLabel": "Ekran düzeni türü",
"app.submenu.application.pushLayoutLabel": "Ekran düzenini gönder",
"app.submenu.notification.SectionTitle": "Bildirimler",
"app.submenu.notification.Desc": "Neyin nasıl bildirileceğini belirleyin.",
"app.submenu.notification.audioAlertLabel": "Sesli uyarılar",
@ -420,7 +482,7 @@
"app.settings.main.save.label.description": "Değişiklikleri kaydeder ve ayarlar menüsünü kapatır",
"app.settings.dataSavingTab.label": "Veri tasarrufu",
"app.settings.dataSavingTab.webcam": "Kameraları aç",
"app.settings.dataSavingTab.screenShare": "Masaüstü paylaşılabilsin",
"app.settings.dataSavingTab.screenShare": "Diğer katılımcılar masaüstlerini paylaşabilsin",
"app.settings.dataSavingTab.description": "Bant genişliğinden tasarruf etmek için nelerin görüntüleneceğini ayarlayın.",
"app.settings.save-notification.label": "Ayarlar kaydedildi",
"app.statusNotifier.lowerHands": "Elleri indir",
@ -440,7 +502,6 @@
"app.actionsBar.actionsDropdown.presentationLabel": "Sunum yönetimi",
"app.actionsBar.actionsDropdown.initPollLabel": "Oylama başlat",
"app.actionsBar.actionsDropdown.desktopShareLabel": "Ekranını paylaş",
"app.actionsBar.actionsDropdown.lockedDesktopShareLabel": "Ekran paylaşımı kilitli",
"app.actionsBar.actionsDropdown.stopDesktopShareLabel": "Ekran paylaşımını bitir",
"app.actionsBar.actionsDropdown.presentationDesc": "Sunumunuzu yükleyin",
"app.actionsBar.actionsDropdown.initPollDesc": "Bir oylama başlatın",
@ -449,14 +510,15 @@
"app.actionsBar.actionsDropdown.pollBtnLabel": "Oylama başlat",
"app.actionsBar.actionsDropdown.pollBtnDesc": "Oylama bölmesini açar ya da kapatır",
"app.actionsBar.actionsDropdown.saveUserNames": "Kullanıcı adlarını kaydet",
"app.actionsBar.actionsDropdown.createBreakoutRoom": "Grup odaları oluştur",
"app.actionsBar.actionsDropdown.createBreakoutRoomDesc": "geçerli toplantıyı bölmek için gruplar oluştur",
"app.actionsBar.actionsDropdown.createBreakoutRoom": "Çalışma grubu odaları oluştur",
"app.actionsBar.actionsDropdown.createBreakoutRoomDesc": "geçerli toplantıyı çalışma gruplarına ayır",
"app.actionsBar.actionsDropdown.captionsLabel": "Alt yazıları görüntüle",
"app.actionsBar.actionsDropdown.captionsDesc": "Alt yazı bölmesini açar ya da kapatır",
"app.actionsBar.actionsDropdown.takePresenter": "Sunucu ol",
"app.actionsBar.actionsDropdown.takePresenterDesc": "Kendinizi yeni sunucu olarak atayın",
"app.actionsBar.actionsDropdown.selectRandUserLabel": "Rastgele kullanıcı seç",
"app.actionsBar.actionsDropdown.selectRandUserDesc": "Var olan izleyicilerden rastgele bir kullanıcı seçer",
"app.actionsBar.actionsDropdown.propagateLayoutLabel": "Ekran düzenini yayınla",
"app.actionsBar.emojiMenu.statusTriggerLabel": "Durumu ayarla",
"app.actionsBar.emojiMenu.awayLabel": "Uzakta",
"app.actionsBar.emojiMenu.awayDesc": "Durumunuzu uzakta yapar",
@ -496,19 +558,21 @@
"app.audioNotification.audioFailedError1012": "Bağlantı sona erdildi (ICE 1012 hatası)",
"app.audioNotification.audioFailedMessage": "Ses bağlantınız kurulamadı",
"app.audioNotification.mediaFailedMessage": "Yalnızca güvenli kaynaklara izin verildiğinden getUserMicMedia tamamlanamadı",
"app.audioNotification.deviceChangeFailed": "Ses aygıtı değiştirilemedi. Seçilen aygıtın doğru şekilde kurulmuş ve kullanılabilir olduğundan emin olun",
"app.audioNotification.closeLabel": "Kapat",
"app.audioNotificaion.reconnectingAsListenOnly": "İzleyicilerin mikrofon kullanması engellenmiş. Yalnızca dinleyici olarak bağlanıyorsunuz",
"app.breakoutJoinConfirmation.title": "Grup odasına katıl",
"app.breakoutJoinConfirmation.title": "Çalışma grubu odasına katıl",
"app.breakoutJoinConfirmation.message": "Katılmak istiyor musunuz?",
"app.breakoutJoinConfirmation.confirmDesc": "Grup odasına katıl",
"app.breakoutJoinConfirmation.confirmDesc": "Çalışma grubu odasına katıl",
"app.breakoutJoinConfirmation.dismissLabel": "Vazgeç",
"app.breakoutJoinConfirmation.dismissDesc": "Grup odasına katılmayı reddeder ve kapatır",
"app.breakoutJoinConfirmation.freeJoinMessage": "Katılacağınız bir grup odası seçin",
"app.breakoutTimeRemainingMessage": "Grup odasının kalan zamanı: {0}",
"app.breakoutWillCloseMessage": "Süre bitti. Grup odası birazdan kapanacak",
"app.breakoutJoinConfirmation.dismissDesc": "Çalışma grubu odasına katılmayı reddeder ve kapatır",
"app.breakoutJoinConfirmation.freeJoinMessage": "Katılacağınız bir çalışma grubu odası seçin",
"app.breakoutTimeRemainingMessage": "Çalışma grubu odasının kalan zamanı: {0}",
"app.breakoutWillCloseMessage": "Süre bitti. Çalışma grubu odası birazdan kapanacak",
"app.breakout.dropdown.manageDuration": "Süreyi değiştir",
"app.breakout.dropdown.destroyAll": "Grup odalarını kapat",
"app.breakout.dropdown.options": "Gruplandırma seçenekleri",
"app.breakout.dropdown.destroyAll": "Çalışma grubu odalarını kapat",
"app.breakout.dropdown.options": "Çalışma grupları seçenekleri",
"app.breakout.dropdown.manageUsers": "Kullanıcı yönetimi",
"app.calculatingBreakoutTimeRemaining": "Kalan süre hesaplanıyor...",
"app.audioModal.ariaTitle": "Üste açılan ses ile katılma penceresi",
"app.audioModal.microphoneLabel": "Mikrofon",
@ -555,6 +619,7 @@
"app.audio.changeAudioDevice": "Ses aygıtını değiştir",
"app.audio.enterSessionLabel": "Oturuma katıl",
"app.audio.playSoundLabel": "Sesi oynat",
"app.audio.stopAudioFeedback": "Ses geri beslemesini durdur",
"app.audio.backLabel": "Geri",
"app.audio.loading": "Yükleniyor",
"app.audio.microphones": "Mikrofonlar",
@ -567,10 +632,32 @@
"app.audio.audioSettings.testSpeakerLabel": "Hoparlörünüzü deneyin",
"app.audio.audioSettings.microphoneStreamLabel": "Yayın akışınızın ses düzeyi",
"app.audio.audioSettings.retryLabel": "Yeniden dene",
"app.audio.audioSettings.fallbackInputLabel": "{0} ses girişi",
"app.audio.audioSettings.fallbackOutputLabel": "{0} ses çıkışı",
"app.audio.audioSettings.defaultOutputDeviceLabel": "Varsayılan",
"app.audio.audioSettings.findingDevicesLabel": "Aygıtlar bulunuyor...",
"app.audio.listenOnly.backLabel": "Geri",
"app.audio.listenOnly.closeLabel": "Kapat",
"app.audio.permissionsOverlay.title": "Mikrofonunuza erişim izni verin",
"app.audio.permissionsOverlay.hint": "Sesli konferansa katılabilmek için ortam aygıtlarınızı kullanmamıza izin vermelisiniz :)",
"app.audio.captions.button.start": "Alt yazıları aç",
"app.audio.captions.button.stop": "Alt yazıları kapat",
"app.audio.captions.button.language": "Dil",
"app.audio.captions.button.transcription": "Yazıya dökme",
"app.audio.captions.button.transcriptionSettings": "Yazıya dökme ayarları",
"app.audio.captions.speech.title": "Otomatik yazıya dökme",
"app.audio.captions.speech.disabled": "Devre dışı",
"app.audio.captions.speech.unsupported": "Web tarayıcınız konuşma tanıma özelliğini desteklemiyor. Sesiniz yazıya dökülemeyecek",
"app.audio.captions.select.de-DE": "Almanca",
"app.audio.captions.select.en-US": "İngilizce",
"app.audio.captions.select.es-ES": "İspanyolca",
"app.audio.captions.select.fr-FR": "Fransızca",
"app.audio.captions.select.hi-ID": "Hintçe",
"app.audio.captions.select.it-IT": "İtalyanca",
"app.audio.captions.select.ja-JP": "Japonca",
"app.audio.captions.select.pt-BR": "Portekizce",
"app.audio.captions.select.ru-RU": "Rusça",
"app.audio.captions.select.zh-CN": "Çince",
"app.error.removed": "Konferanstan çıkarıldınız",
"app.error.meeting.ended": "Konferanstan ayrıldınız",
"app.meeting.logout.duplicateUserEjectReason": "Aynı kullanıcı toplantıya ikinci kez katılmaya çalışıyor",
@ -578,6 +665,7 @@
"app.meeting.logout.ejectedFromMeeting": "Toplantıdan çıkarıldınız",
"app.meeting.logout.validateTokenFailedEjectReason": "Kimlik doğrulama kodu doğrulanamadı",
"app.meeting.logout.userInactivityEjectReason": "Kullanıcı uzun süredir etkin değil",
"app.meeting.logout.maxParticipantsReached": "Bu toplantıya katılmasına izin verilen katılımcı sayısına ulaşıldı",
"app.meeting-ended.rating.legendLabel": "Geri bildirim değerlendirmesi",
"app.meeting-ended.rating.starLabel": "Yıldız",
"app.modal.close": "Kapat",
@ -599,8 +687,11 @@
"app.error.403": "Toplantıdan çıkarıldınız",
"app.error.404": "Bulunamadı",
"app.error.408": "Kimlik doğrulanamadı",
"app.error.409": "Çatışma",
"app.error.410": "Toplantı sona erdi",
"app.error.500": "Bir sorun çıktı",
"app.error.503": "Bağlantınız kesildi",
"app.error.disconnected.rejoin": "Yeniden katılmak için sayfayı yenileyin.",
"app.error.userLoggedOut": "Kullanıcı oturumu kapattığından sessionToken geçersiz",
"app.error.ejectedUser": "Kullanıcı oturumdan çıkarıldığından sessionToken geçersiz",
"app.error.joinedAnotherWindow": "Bu oturum başka bir web tarayıcı penceresinde açık gibi görünüyor.",
@ -644,14 +735,18 @@
"app.userList.guest.privateMessageLabel": "İleti",
"app.userList.guest.acceptLabel": "Kabul et",
"app.userList.guest.denyLabel": "Reddet",
"app.userList.guest.feedbackMessage": "İşlem uygulandı:",
"app.user-info.title": "Dizinde arama",
"app.toast.breakoutRoomEnded": "Grup odası kapatıldı. Lütfen yeniden sesli görüşmeye katılın.",
"app.toast.breakoutRoomEnded": "Çalışma grubu odası kapatıldı. Lütfen yeniden sesli görüşmeye katılın.",
"app.toast.chat.public": "Yeni herkese açık sohbet iletisi",
"app.toast.chat.private": "Yeni özel sohbet iletisi",
"app.toast.chat.system": "Sistem",
"app.toast.chat.poll": "Anket sonuçları",
"app.toast.chat.pollClick": "Anket sonuçları yayınlandı. Görmek için buraya tıklayın.",
"app.toast.clearedEmoji.label": "Emoji durumu temizlendi",
"app.toast.setEmoji.label": "Emoji durumu {0} olarak ayarlandı",
"app.toast.meetingMuteOn.label": "Tüm kullanıcıların sesi kapatıldı",
"app.toast.meetingMuteOnViewers.label": "Tüm izleyicilerin sesi kapatıldı",
"app.toast.meetingMuteOff.label": "Toplantının sesi açıldı",
"app.toast.setEmoji.raiseHand": "Elinizi kaldırdınız",
"app.toast.setEmoji.lowerHand": "Eliniz indirildi",
@ -688,6 +783,38 @@
"app.shortcut-help.toggleFullscreenKey": "Enter",
"app.shortcut-help.nextSlideKey": "Sağ ok",
"app.shortcut-help.previousSlideKey": "Sol ok",
"app.shortcut-help.select": "Seçim aracı",
"app.shortcut-help.pencil": "Kalem",
"app.shortcut-help.eraser": "Silgi",
"app.shortcut-help.rectangle": "Dikdörtgen",
"app.shortcut-help.elipse": "Elips",
"app.shortcut-help.triangle": "Üçgen",
"app.shortcut-help.line": "Çizgi",
"app.shortcut-help.arrow": "Ok",
"app.shortcut-help.text": "Metin aracı",
"app.shortcut-help.note": "Yapışkan not",
"app.shortcut-help.general": "Genel",
"app.shortcut-help.presentation": "Sunum",
"app.shortcut-help.whiteboard": "Beyaz tahta",
"app.shortcut-help.zoomIn": "Yakınlaştır",
"app.shortcut-help.zoomOut": "Uzaklaştır",
"app.shortcut-help.zoomFit": "Yakınlaştırmayı sıfırla",
"app.shortcut-help.zoomSelect": "Seçime yakınlaştır",
"app.shortcut-help.flipH": "Yatay çevir",
"app.shortcut-help.flipV": "Dikey çevir",
"app.shortcut-help.lock": "Kilitle / kilidi aç",
"app.shortcut-help.moveToFront": "Öne getir",
"app.shortcut-help.moveToBack": "Arkay götür",
"app.shortcut-help.moveForward": "Daha öne getir",
"app.shortcut-help.moveBackward": "Daha arkaya götür",
"app.shortcut-help.undo": "Geri al",
"app.shortcut-help.redo": "Yinele",
"app.shortcut-help.cut": "Kes",
"app.shortcut-help.copy": "Kopyala",
"app.shortcut-help.paste": "Yapıştır",
"app.shortcut-help.selectAll": "Tümünü seç",
"app.shortcut-help.delete": "Sil",
"app.shortcut-help.duplicate": "Çoğalt",
"app.lock-viewers.title": "İzleyicileri kilitle",
"app.lock-viewers.description": "Bu seçenekler, izleyicilerin belirli özellikleri kullanmasını kısıtlamanızı sağlar.",
"app.lock-viewers.featuresLable": "Özellik",
@ -737,13 +864,19 @@
"app.connection-status.next": "Sonraki sayfa",
"app.connection-status.prev": "Önceki sayfa",
"app.learning-dashboard.label": "Öğrenme istatistikleri panosu",
"app.learning-dashboard.description": "Kullanıcı etkinlikleriyle katılım panosunu açar",
"app.learning-dashboard.description": "Kullanıcı etkinlikleriyle katılım panosu",
"app.learning-dashboard.clickHereToOpen": "Öğrenme istatistikleri panosunu aç",
"app.recording.startTitle": "Kaydı başlat",
"app.recording.stopTitle": "Kaydı durdur",
"app.recording.resumeTitle": "Kaydı sürdür",
"app.recording.startDescription": "Daha sonra kaydı duraklatmak için yeniden kayıt düğmesini kullanabilirsiniz",
"app.recording.stopDescription": "Kaydı duraklatmak istediğinize emin misiniz? Kayıt düğmesine yeniden basarak kaydı sürdürebilirsiniz.",
"app.recording.notify.title": "Kayıt alınıyor",
"app.recording.notify.description": "Bu oturumun geri kalanının kaydı kullanılabilecek",
"app.recording.notify.continue": "İlerle",
"app.recording.notify.leave": "Oturumdan ayrıl",
"app.recording.notify.continueLabel" : "Kayıt alınacağını onayla ve ilerle",
"app.recording.notify.leaveLabel" : "Kayıt alınmasını reddet ve toplantıdan ayrıl",
"app.videoPreview.cameraLabel": "Kamera",
"app.videoPreview.profileLabel": "Kalite",
"app.videoPreview.quality.low": "Düşük",
@ -760,13 +893,20 @@
"app.videoPreview.webcamOptionLabel": "Kamera seçin",
"app.videoPreview.webcamPreviewLabel": "Kamera ön izlemesi",
"app.videoPreview.webcamSettingsTitle": "Kamera ayarları",
"app.videoPreview.webcamEffectsTitle": "Kamera görsel etkileri",
"app.videoPreview.webcamVirtualBackgroundLabel": "Sanal arka plan ayarları",
"app.videoPreview.webcamVirtualBackgroundDisabledLabel": "Bu aygıt sanal arka planları desteklemiyor",
"app.videoPreview.webcamNotFoundLabel": "Kamera bulunamadı",
"app.videoPreview.profileNotFoundLabel": "Desteklenen bir kamera profili yok",
"app.videoPreview.brightness": "Parlaklık",
"app.videoPreview.wholeImageBrightnessLabel": "Tam görsel",
"app.videoPreview.wholeImageBrightnessDesc": "Akışa ve arka plan görseline parlaklık uygular",
"app.videoPreview.sliderDesc": "Parlak düzeyini artırın ya da azaltın",
"app.video.joinVideo": "Kamerayı paylaş",
"app.video.connecting": "Kamera paylaşımı başlatılıyor...",
"app.video.leaveVideo": "Kamera paylaşımını durdur",
"app.video.videoSettings": "Görüntü ayarları",
"app.video.visualEffects": "Görsel etkiler",
"app.video.advancedVideo": "Gelişmiş ayarları aç",
"app.video.iceCandidateError": "ICE adayı eklenirken sorun çıktı",
"app.video.iceConnectionStateError": "Bağlantı kurulamadı (ICE 1107 hatası)",
@ -782,6 +922,7 @@
"app.video.notReadableError": "Kamera görüntüsü alınamadı. Lütfen kamerayı başka bir uygulamanın kullanmadığından emin olun",
"app.video.timeoutError": "Tarayıcı zamanında yanıt vermedi.",
"app.video.genericError": "Aygıtta bilinmeyen bir sorun çıktı ({0})",
"app.video.inactiveError": "Kameranız beklenmedik şekilde durdu. Lütfen web tarayıcınızın izinlerini gözden geçirin",
"app.video.mediaTimedOutError": "Kamera yayın akışı kesildi. Yeniden paylaşmayı deneyin",
"app.video.mediaFlowTimeout1020": "Ortam sunucuya ulaşamadı (hata 1020)",
"app.video.suggestWebcamLock": "İzleyicilerin kameraları zorla kilitlensin mi?",
@ -804,13 +945,22 @@
"app.video.virtualBackground.board": "Tahta",
"app.video.virtualBackground.coffeeshop": "Kafe",
"app.video.virtualBackground.background": "Arka plan",
"app.video.virtualBackground.backgroundWithIndex": "{0} arka planı",
"app.video.virtualBackground.custom": "Bilgisayarınızdan yükleyin",
"app.video.virtualBackground.remove": "Eklenmiş görseli kaldır",
"app.video.virtualBackground.genericError": "Kamera etkisi uygulanamadı. Yeniden deneyin.",
"app.video.virtualBackground.camBgAriaDesc": "Kamera sanal arka planını {0} olarak ayarlar",
"app.video.virtualBackground.maximumFileSizeExceeded": "Olabilecek en büyük dosya boyutu aşıldı. ({0}MB)",
"app.video.virtualBackground.typeNotAllowed": "Dosya türüne izin verilmiyor.",
"app.video.virtualBackground.errorOnRead": "Dosya okunurken bir sorun çıktı.",
"app.video.virtualBackground.uploaded": "Yüklendi",
"app.video.virtualBackground.uploading": "Yükleniyor...",
"app.video.virtualBackground.button.customDesc": "Yeni bir sanal arka plan görseli ekler",
"app.video.camCapReached": "Daha fazla kamera paylaşamazsınız",
"app.video.meetingCamCapReached": "Toplantıda aynı anda kullanılabilecek kamera sayısı sınırına ulaşıldı",
"app.video.dropZoneLabel": "Buraya bırakın",
"app.fullscreenButton.label": "{0} tam ekrana geç",
"app.fullscreenUndoButton.label": "{0} tam ekrandan çık",
"app.fullscreenButton.label": "{0} ögesini tam ekran görüntüle",
"app.fullscreenUndoButton.label": "{0} ögesini tam ekrandan çıkar",
"app.switchButton.expandLabel": "Ekran paylaşımı görüntüsünü genişlet",
"app.switchButton.shrinkLabel": "Ekran paylaşımı görüntüsünü daralt",
"app.sfu.mediaServerConnectionError2000": "Ortam sunucusu ile bağlantı kurulamadı (hata 2000)",
@ -826,6 +976,7 @@
"app.whiteboard.annotations.poll": "Oylama sonuçları yayınlandı",
"app.whiteboard.annotations.pollResult": "Oylama sonuçları",
"app.whiteboard.annotations.noResponses": "Yanıt yok",
"app.whiteboard.annotations.notAllowed": "Bu değişikliği yapmanıza izin verilmiyor ",
"app.whiteboard.toolbar.tools": "Araçlar",
"app.whiteboard.toolbar.tools.hand": "Kaydırma",
"app.whiteboard.toolbar.tools.pencil": "Kalem",
@ -852,6 +1003,7 @@
"app.whiteboard.toolbar.color.silver": "Gümüş",
"app.whiteboard.toolbar.undo": "Açıklamayı geri al",
"app.whiteboard.toolbar.clear": "Tüm açıklamaları temizle",
"app.whiteboard.toolbar.clearConfirmation": "Tüm açıklamaları temizlemek istediğinize emin misiniz?",
"app.whiteboard.toolbar.multiUserOn": "Çok kullanıcılı tahtayı aç",
"app.whiteboard.toolbar.multiUserOff": "Çok kullanıcılı tahtayı kapat",
"app.whiteboard.toolbar.palmRejectionOn": "Avuçla reddetmeyi aç",
@ -871,19 +1023,19 @@
"app.videoDock.webcamUnfocusDesc": "Seçilmiş kamera görüntüsünü odaktan kaldırır",
"app.videoDock.webcamPinLabel": "Sabitle",
"app.videoDock.webcamPinDesc": "Seçilmiş kamera görüntüsünü sabitler",
"app.videoDock.webcamFullscreenLabel": "Kamerayı tam ekran görüntüle",
"app.videoDock.webcamSqueezedButtonLabel": "Kamera seçenekleri",
"app.videoDock.webcamUnpinLabel": "Sabitlemeyi kaldır",
"app.videoDock.webcamUnpinLabelDisabled": "Yalnızca sorumlular kullanıcıların sabitlemesini kaldırabilir",
"app.videoDock.webcamUnpinDesc": "Seçilmiş kamera görüntüsünün sabitlemesini kaldırır",
"app.videoDock.autoplayBlockedDesc": "Size diğer kullanıcıların kameralarını görüntüleyabilmemiz için izniniz gerekli.",
"app.videoDock.autoplayAllowLabel": "Kameraları görüntüle",
"app.invitation.title": "Grup odası çağrısı",
"app.invitation.confirm": "Çağır",
"app.createBreakoutRoom.title": "Grup odaları",
"app.createBreakoutRoom.ariaTitle": "Grup odalarını gizle",
"app.createBreakoutRoom.breakoutRoomLabel": "Grup odaları {0}",
"app.createBreakoutRoom.title": "Çalışma grubu odaları",
"app.createBreakoutRoom.ariaTitle": "Çalışma grubu odalarını gizle",
"app.createBreakoutRoom.breakoutRoomLabel": "{0} çalışma grubu odaları",
"app.createBreakoutRoom.askToJoin": "Katılma isteğinde bulun",
"app.createBreakoutRoom.generatingURL": "Adres oluşturuluyor",
"app.createBreakoutRoom.generatingURLMessage": "Seçilmiş grup odasının katılım adresi oluşturuluyor. Birkaç saniye sürebilir...",
"app.createBreakoutRoom.generatingURLMessage": "Seçilmiş çalışma grubu odasının katılım adresi oluşturuluyor. Birkaç saniye sürebilir...",
"app.createBreakoutRoom.duration": "Süre {0}",
"app.createBreakoutRoom.room": "Oda {0}",
"app.createBreakoutRoom.notAssigned": "Atanmamış ({0})",
@ -896,22 +1048,24 @@
"app.createBreakoutRoom.numberOfRooms": "Oda sayısı",
"app.createBreakoutRoom.durationInMinutes": "Süre (dakika)",
"app.createBreakoutRoom.randomlyAssign": "Rastgele atama",
"app.createBreakoutRoom.randomlyAssignDesc": "Kullanıcıları grup odalarına rastgele atar",
"app.createBreakoutRoom.randomlyAssignDesc": "Kullanıcıları rastgele çalışma grubu odalarına atar",
"app.createBreakoutRoom.resetAssignments": "Atamaları sıfırla",
"app.createBreakoutRoom.resetAssignmentsDesc": "Tüm grup odası kullanıcı atamalarını sıfırla",
"app.createBreakoutRoom.endAllBreakouts": "Tüm grup odalarını kapat",
"app.createBreakoutRoom.endAllBreakouts": "Tüm çalışma grubu odalarını kapat",
"app.createBreakoutRoom.chatTitleMsgAllRooms": "tüm odalar",
"app.createBreakoutRoom.msgToBreakoutsSent": "İleti {0} grup odasına gönderildi",
"app.createBreakoutRoom.msgToBreakoutsSent": "İleti {0} çalışma grubu odasına gönderildi",
"app.createBreakoutRoom.roomName": "{0} (Oda - {1})",
"app.createBreakoutRoom.doneLabel": "Tamamlandı",
"app.createBreakoutRoom.nextLabel": "Sonraki",
"app.createBreakoutRoom.minusRoomTime": "Grup odası süresini kısalt",
"app.createBreakoutRoom.addRoomTime": "Grup odası süresini arttır",
"app.createBreakoutRoom.minusRoomTime": "Çalışma grubu odası süresini kısalt",
"app.createBreakoutRoom.addRoomTime": "Çalışma grubu odası süresini uzat",
"app.createBreakoutRoom.addParticipantLabel": "+ Katılımcı ekle",
"app.createBreakoutRoom.freeJoin": "Kullanıcılar katılacakları grup odasını seçebilsin",
"app.createBreakoutRoom.leastOneWarnBreakout": "Bir grup odasına en az bir kullanıcı atamalısınız..",
"app.createBreakoutRoom.minimumDurationWarnBreakout": "En kısa grup odası süresi {0} dakikadır.",
"app.createBreakoutRoom.modalDesc": "İpucu: Herhangi bir grup odasına atamak için kullanıcıların adını sürükleyip bırakabilirsiniz.",
"app.createBreakoutRoom.freeJoin": "Kullanıcılar katılacakları çalışma grubu odasını seçebilsin",
"app.createBreakoutRoom.captureNotes": "Çalışma grubu odaları kapatıldığında paylaşılan notları al",
"app.createBreakoutRoom.captureSlides": "Çalışma grubu odaları kapatıldığında beyaz tahtayı al",
"app.createBreakoutRoom.leastOneWarnBreakout": "Bir çalışma grubu odasına en az bir kullanıcı göndermelisiniz..",
"app.createBreakoutRoom.minimumDurationWarnBreakout": "En kısa çalışma grubu odası süresi {0} dakikadır.",
"app.createBreakoutRoom.modalDesc": "İpucu: Herhangi bir çalışma grubu odasına atamak için kullanıcıların adını sürükleyip bırakabilirsiniz.",
"app.createBreakoutRoom.roomTime": "{0} dakika",
"app.createBreakoutRoom.numberOfRoomsError": "Oda sayısı geçersiz.",
"app.createBreakoutRoom.duplicatedRoomNameError": "Odaların adı aynı olamaz.",
@ -919,8 +1073,16 @@
"app.createBreakoutRoom.setTimeInMinutes": "Süreyi ayarla (dakika)",
"app.createBreakoutRoom.setTimeLabel": "Uygula",
"app.createBreakoutRoom.setTimeCancel": "Vazgeç",
"app.createBreakoutRoom.setTimeHigherThanMeetingTimeError": "Grup odalarının süresi, kalan toplantı süresini aşamaz.",
"app.createBreakoutRoom.roomNameInputDesc": "Grup odasının adını günceller",
"app.createBreakoutRoom.setTimeHigherThanMeetingTimeError": "Çalışma grubu odalarının süresi, kalan toplantı süresini aşamaz.",
"app.createBreakoutRoom.roomNameInputDesc": "Çalışma grubu odasının adını günceller",
"app.createBreakoutRoom.movedUserLabel": "{0} kullanıcısı {1} odasına gönderildi",
"app.updateBreakoutRoom.modalDesc": "Bir kullanıcıyı güncellemek ya da çağırmak için kullanıcı sürükleyip istediğiniz odaya bırakın.",
"app.updateBreakoutRoom.cancelLabel": "İptal",
"app.updateBreakoutRoom.title": "Çalışma grubu odalarını güncelle",
"app.updateBreakoutRoom.confirm": "Uygula",
"app.updateBreakoutRoom.userChangeRoomNotification": "{0} odasına gönderildiniz.",
"app.smartMediaShare.externalVideo": "Dış görüntüler",
"app.update.resetRoom": "Kullanıcının odasını sıfırla",
"app.externalVideo.start": "Yeni bir görüntü paylaş",
"app.externalVideo.title": "Dışarıdan bir görüntü paylaş",
"app.externalVideo.input": "Dışarıdaki görüntünün adresi",
@ -946,18 +1108,27 @@
"app.debugWindow.form.enableAutoarrangeLayoutDescription": "(kamera alanını sürükler ya da yeniden boyutlandırırsanız devre dışı bırakılır)",
"app.debugWindow.form.chatLoggerLabel": "Sohbet kaydedici düzeylerini sına",
"app.debugWindow.form.button.apply": "Uygula",
"app.layout.modal.title": "Ekran düzenleri",
"app.layout.modal.confirm": "Onayla",
"app.layout.modal.cancel": "İptal",
"app.layout.modal.layoutLabel": "Ekran düzeninizi seçin",
"app.layout.modal.keepPushingLayoutLabel": "Ekran düzenini herkese gönder",
"app.layout.modal.pushLayoutLabel": "Herkese gönder",
"app.layout.modal.layoutToastLabel": "Ekran düzeni ayarları değişti",
"app.layout.modal.layoutSingular": "Ekran düzeni",
"app.layout.modal.layoutBtnDesc": "Ekran düzenini seçilmiş seçenek olarak ayarla",
"app.layout.style.custom": "Özel",
"app.layout.style.smart": "Akıllı ekran düzeni",
"app.layout.style.presentationFocus": "Sunuma odaklan",
"app.layout.style.videoFocus": "Görüntüye odaklan",
"app.layout.style.customPush": "Özel ekran düzeni (herkese uygulansın)",
"app.layout.style.smartPush": "Akıllı ekran düzeni (herkese uygulansın)",
"app.layout.style.presentationFocusPush": "Sunuma odaklanmış düzen (herkese uygulansın)",
"app.layout.style.videoFocusPush": "Görüntüye odaklanmış düzen (herkese uygulansın)",
"app.layout.style.presentationFocusPush": "Sunuma odaklanmış ekran düzeni (herkese uygulansın)",
"app.layout.style.videoFocusPush": "Görüntüye odaklanmış ekran düzeni (herkese uygulansın)",
"playback.button.about.aria": "Hakkında",
"playback.button.clear.aria": "Aramayı temizle",
"playback.button.close.aria": "Üste açılan pencereyi kapat",
"playback.button.fullscreen.aria": "İçeriği tam ekranda görüntüle",
"playback.button.fullscreen.aria": "İçeriği tam ekran görüntüle",
"playback.button.restore.aria": "İçeriği önceki boyutuna döndür",
"playback.button.search.aria": "Arama",
"playback.button.section.aria": "Yan bölüm",
@ -995,6 +1166,7 @@
"playback.player.thumbnails.wrapper.aria": "Küçük görsel alanı",
"playback.player.webcams.wrapper.aria": "Kameralar alanı",
"app.learningDashboard.dashboardTitle": "Öğrenme istatistikleri panosu",
"app.learningDashboard.bigbluebuttonTitle": "BigBlueButton",
"app.learningDashboard.downloadSessionDataLabel": "Oturum verilerini indir",
"app.learningDashboard.lastUpdatedLabel": "Son güncellenme",
"app.learningDashboard.sessionDataDownloadedLabel": "İndirildi!",
@ -1019,6 +1191,12 @@
"app.learningDashboard.userDetails.response": "Yanıt",
"app.learningDashboard.userDetails.mostCommonAnswer": "En çok verilen yanıt",
"app.learningDashboard.userDetails.anonymousAnswer": "Anonim oylama",
"app.learningDashboard.userDetails.talkTime": "Konuşma süresi",
"app.learningDashboard.userDetails.messages": "İletiler",
"app.learningDashboard.userDetails.emojis": "Emojiler",
"app.learningDashboard.userDetails.raiseHands": "El kaldırmalar",
"app.learningDashboard.userDetails.pollVotes": "Anket oyları",
"app.learningDashboard.userDetails.onlineIndicator": "{0} çevrim içi süresi",
"app.learningDashboard.usersTable.title": "Özet",
"app.learningDashboard.usersTable.colOnline": "Çevrim içi süresi",
"app.learningDashboard.usersTable.colTalk": "Konuşma süresi",
@ -1042,8 +1220,13 @@
"app.learningDashboard.pollsTable.anonymousRowName": "Anonim",
"app.learningDashboard.pollsTable.noPollsCreatedHeading": "Henüz bir oylama oluşturulmamış",
"app.learningDashboard.pollsTable.noPollsCreatedMessage": "Kullanıcılara bir oylama gönderildiğinde, sonuçları bu listede görüntülenir.",
"app.learningDashboard.pollsTable.answerTotal": "Toplam",
"app.learningDashboard.pollsTable.userLabel": "Kullanıcı",
"app.learningDashboard.statusTimelineTable.title": "Zaman çizelgesi",
"app.learningDashboard.statusTimelineTable.thumbnail": "Sunum küçük görseli",
"app.learningDashboard.statusTimelineTable.presentation": "Sunum",
"app.learningDashboard.statusTimelineTable.pageNumber": "Sayfa",
"app.learningDashboard.statusTimelineTable.setAt": "Şu zamana ayarla",
"app.learningDashboard.errors.invalidToken": "Oturum kodu geçersiz",
"app.learningDashboard.errors.dataUnavailable": "Veriler artık kullanılamıyor",
"mobileApp.portals.list.empty.addFirstPortal.label": "Yukarıdaki düğmeyi kullanarak ilk portalinizi ekleyin.",
@ -1057,6 +1240,4 @@
"mobileApp.portals.addPortalPopup.validation.emptyFields": "Zorunlu alanlar",
"mobileApp.portals.addPortalPopup.validation.portalNameAlreadyExists": "Adı başkası kullanıyor",
"mobileApp.portals.addPortalPopup.validation.urlInvalid": "Sayfa yüklenirken bir sorun çıktı. Adresi ve ağ bağlantınızı denetleyin"
}

View File

@ -50,6 +50,12 @@ You can also use this also through the test tree, adding the test suite / group
$ npm run test:filter "notifications chat"
```
If you don't have `BBB_URL` and `BBB_SECRET` set, but have ssh access to the test server, you can use the following command to obtain `BBB_URL` and `BBB_SECRET` via ssh:
```bash
$ npm run test:ssh -- HOSTNAME
```
#### Recording Meteor messages
A modified version of `websockify` can be used to record the Meteor messages exchanged between client and server, by inserted a WebSocket proxy between the client and server, configured to record the sessions.

View File

@ -1,5 +1,6 @@
const { test } = require('@playwright/test');
const { API } = require('./api.js');
const { APIBreakout } = require('./breakout.js');
test.describe.parallel('API', () => {
@ -13,4 +14,29 @@ test.describe.parallel('API', () => {
await api.testGetMeetingInfo();
});
test('breakoutWithoutParent', async ({ browser, context }) => {
const api = new APIBreakout(browser, context);
await api.testBreakoutWithoutParent();
});
test('breakoutWithoutSequenceNumber', async ({ browser, context, page }) => {
const api = new APIBreakout(browser, context);
await api.initModPage(page);
await api.testBreakoutWithoutSequenceNumber();
});
test('breakoutWithNonexistentParent', async ({ browser, context }) => {
const api = new APIBreakout(browser, context);
await api.testBreakoutWithNonexistentParent();
});
test('breakoutMeetingInfo', async ({ browser, context, page }) => {
const api = new APIBreakout(browser, context);
await api.initPages(page);
await api.create();
await api.testBreakoutMeetingInfoNoJoins();
await api.joinRoom();
await api.testBreakoutMeetingInfoOneJoin();
});
});

View File

@ -0,0 +1,125 @@
const { expect } = require("@playwright/test");
const { Join } = require('../breakout/join');
const parameters = require('../core/parameters');
const { apiCall, createMeetingPromise } = require('../core/helpers');
function getMeetingInfo(meetingID) {
return apiCall('getMeetingInfo', {meetingID: meetingID});
}
class APIBreakout extends Join {
constructor(browser, context) {
super(browser, context);
}
// Attempt to use API to create a breakout room without a parent
async testBreakoutWithoutParent() {
const response = await createMeetingPromise(parameters, `isBreakout=true&sequence=1`)
.catch(error => error);
expect(response.response.status).toEqual(500);
}
// Attempt to use API to create a break room without a sequence number
async testBreakoutWithoutSequenceNumber() {
const response = await createMeetingPromise(parameters, `isBreakout=true&parentMeetingID=${this.modPage.meetingId}`)
.catch(error => error);
expect(response.response.status).toEqual(500);
}
// Attempt to use API to create a break room with a non-existent parent meeting
async testBreakoutWithNonexistentParent() {
const response = await createMeetingPromise(parameters, `isBreakout=true&parentMeetingID=0000000&sequence=1`)
.catch(error => error);
expect(response.response.status).toEqual(500);
}
// Check that breakout rooms created via the GUI appear properly in the API's meeting info
async testBreakoutMeetingInfoNoJoins() {
// We have two breakout rooms, but neither user has joined a breakout room.
// Make sure the API getMeetingInfo returns expected results
const response1 = await getMeetingInfo(this.modPage.meetingId);
expect(response1.response.returncode).toEqual(['SUCCESS']);
expect(response1.response.isBreakout).toEqual(['false']);
expect(response1.response.breakoutRooms[0].breakout.length).toEqual(2);
for (const breakoutRoom of response1.response.breakoutRooms[0].breakout) {
const response2 = await getMeetingInfo(breakoutRoom);
const expectedMeeting = {meetingID : [breakoutRoom],
isBreakout: ['true'],
running: ['false'],
participantCount: ['0'],
hasUserJoined: ['false'],
attendees: ['\n'], /* no attendees; the newline is an artifact of xml2js */
freeJoin: ['false'],
sequence: [ expect.stringMatching('[12]') ],
parentMeetingID: response1.response.internalMeetingID,
};
expect(response2.response.returncode).toEqual(['SUCCESS']);
expect(response2.response).toMatchObject(expectedMeeting);
}
}
async testBreakoutMeetingInfoOneJoin() {
// We have two breakout rooms, and one user has joined a breakout room.
// Make sure the API getMeetingInfo returns expected results
// First, check that we can retrieve the parent meeting
const response1 = await getMeetingInfo(this.modPage.meetingId);
expect(response1.response.returncode).toEqual(['SUCCESS']);
expect(response1.response.isBreakout).toEqual(['false']);
// Then, check that the parent meeting lists two breakout rooms
const breakoutRooms = response1.response.breakoutRooms[0].breakout;
expect(breakoutRooms.length).toEqual(2);
// Retrieve meeting info for both breakout rooms
// Attendee, a VIEWER in the parent meeting, becomes a MODERATOR (and presenter) in the breakout room
const expectedUser = expect.objectContaining({fullName: ['Attendee'],
role: ['MODERATOR'],
isPresenter: ['true'],
});
const expectedMeeting1 = {isBreakout: ['true'],
running: ['true'],
participantCount: ['1'],
hasUserJoined: ['true'],
attendees: [{ attendee: [ expectedUser ] }],
freeJoin: ['false'],
sequence: [ '1' ],
parentMeetingID: response1.response.internalMeetingID,
};
const expectedMeeting2 = {isBreakout: ['true'],
running: ['false'],
participantCount: ['0'],
hasUserJoined: ['false'],
attendees: ['\n'], /* no attendees; the newline is an artifact of xml2js */
freeJoin: ['false'],
sequence: [ '2' ],
parentMeetingID: response1.response.internalMeetingID,
};
const expectedResponse1 = {response: expect.objectContaining(expectedMeeting1)};
const expectedResponse2 = {response: expect.objectContaining(expectedMeeting2)};
// Note that this is an array of two responses from two API calls,
// not a single API call response containing two breakout rooms
const response2array = await Promise.all(breakoutRooms.map(getMeetingInfo));
expect(response2array).toEqual(expect.arrayContaining([expectedResponse1, expectedResponse2]));
}
}
exports.APIBreakout = APIBreakout;

View File

@ -12,7 +12,8 @@ class Audio extends Page {
const { autoJoinAudioModal, listenOnlyCallTimeout } = this.settings;
if (!autoJoinAudioModal) await this.waitAndClick(e.joinAudio);
await this.waitAndClick(e.listenOnlyButton);
await this.wasRemoved(e.establishingAudioLabel);
await this.waitForSelector(e.establishingAudioLabel);
await this.wasRemoved(e.establishingAudioLabel, ELEMENT_WAIT_LONGER_TIME);
await this.waitForSelector(e.leaveListenOnly, listenOnlyCallTimeout);
await this.waitAndClick(e.audioDropdownMenu);
await this.hasElement(e.leaveAudio);

View File

@ -3,7 +3,6 @@ const { Create } = require('./create');
const { Join } = require('./join');
test.describe.parallel('Breakout', () => {
test.describe.parallel('Creating', () => {
test('Create Breakout room @ci', async ({ browser, context, page }) => {
const create = new Create(browser, context);
@ -39,7 +38,7 @@ test.describe.parallel('Breakout', () => {
const create = new Create(browser, context);
await create.initPages(page);
await create.dragDropUserInRoom();
});
});
});
test.describe.parallel('After creating', () => {

View File

@ -50,7 +50,7 @@ class Create extends MultiUsers {
await this.modPage.waitAndClick(e.increaseBreakoutTime);
await this.modPage.waitAndClick(e.modalConfirmButton, ELEMENT_WAIT_LONGER_TIME);
await this.modPage.waitAndClick(e.breakoutRoomsItem);
await this.modPage.hasText(e.breakoutRemainingTime, /15:[0-5][0-9]/);
await this.modPage.hasText(e.breakoutRemainingTime, /15:[0-5][0-9]/, ELEMENT_WAIT_LONGER_TIME);
}
async changeRoomsName() {
@ -87,7 +87,7 @@ class Create extends MultiUsers {
//testing no user assigned
await this.modPage.waitAndClick(e.modalConfirmButton);
await this.modPage.hasElement(e.warningNoUserAssigned);
//await this.modPage.hasElementDisabled(e.modalConfirmButton);
const modalConfirmButton = await this.modPage.getLocator(e.modalConfirmButton);
await expect(modalConfirmButton, 'Getting error when trying to create a breakout room without designating any user.').toBeDisabled();

View File

@ -1,9 +1,10 @@
const { Create } = require('./create');
const utilScreenShare = require('../screenshare/util');
const e = require('../core/elements');
const { ELEMENT_WAIT_LONGER_TIME } = require('../core/constants');
const { ELEMENT_WAIT_LONGER_TIME, ELEMENT_WAIT_TIME } = require('../core/constants');
const { getSettings } = require('../core/settings');
const { expect } = require('@playwright/test');
const { sleep } = require('../core/helpers');
class Join extends Create {
constructor(browser, context) {
@ -109,7 +110,7 @@ class Join extends Create {
await this.modPage.waitAndClick(e.sendButtonDurationTime);
await this.modPage.hasText(e.breakoutRemainingTime, /[11-12]:[0-5][0-9]/);
await breakoutUserPage.hasText(e.timeRemaining,/[11-12]:[0-5][0-9]/);
await breakoutUserPage.hasText(e.timeRemaining, /[11-12]:[0-5][0-9]/);
}
async endAllBreakoutRooms() {
@ -133,8 +134,8 @@ class Join extends Create {
await this.modPage.waitAndClick(e.modalConfirmButton);
await this.userPage.waitForSelector(e.modalConfirmButton);
await expect(breakoutUserPage.page.isClosed(), "Previous breakout room page did not close!").toBeTruthy();
await breakoutUserPage.hasElement(e.errorScreenMessage);
await breakoutUserPage.hasText(e.errorScreenMessage, e.error403removedLabel);
await this.userPage.waitAndClick(e.modalConfirmButton);
await this.modPage.hasText(e.userNameBreakoutRoom2, /Attendee/);

View File

@ -201,7 +201,8 @@ exports.pollingContainer = 'div[data-test="pollingContainer"]';
exports.pollLetterAlternatives = 'button[data-test="pollLetterAlternatives"]';
exports.pollOptionItem = 'input[data-test="pollOptionItem"]';
exports.anonymousPoll = 'input[data-test="anonymousPollBtn"]';
exports.publishPollingLabel = 'button[data-test="publishPollingLabel"]';
const pollAnswerOptionBtn = 'button[data-test="publishPollingLabel"]';
exports.publishPollingLabel = pollAnswerOptionBtn;
exports.pollAnswerOptionBtn = 'button[data-test="pollAnswerOption"]';
exports.receivedAnswer = 'td[data-test="receivedAnswer"]';
exports.quickPoll = 'button[data-test="quickPollBtn"]';
@ -228,8 +229,8 @@ exports.answer2 = 'div[data-test="numberOfVotes"]>>nth=1';
exports.errorNoValueInput = 'div[data-test="errorNoValueInput"]';
exports.smartSlides1 = 'smartSlidesPresentation.pdf';
exports.responsePollQuestion = 'div[data-test="pollQuestion"]';
exports.pollAnswerOptionBtn = 'button[data-test="pollAnswerOption"]>>nth=0';
exports.checkboxInput = 'div[data-test="optionsAnswers"] > div';
exports.firstPollAnswerOptionBtn = `${pollAnswerOptionBtn}>>nth=0`;
exports.checkboxInput = `${pollAnswerOptionBtn} > div`;
// Presentation
exports.currentSlideImg = 'img[id="slide-background-shape_image"]';
exports.uploadPresentationFileName = 'uploadTest.png';
@ -254,7 +255,6 @@ exports.presentationContainer = 'div[data-test="presentationContainer"]';
exports.minimizePresentation = 'button[data-test="minimizePresentation"]';
exports.restorePresentation = 'button[data-test="restorePresentation"]';
exports.shareExternalVideoBtn = 'li[data-test="shareExternalVideo"]';
exports.externalVideoModalHeader = 'header[data-test="videoModalHeader"]';
exports.videoModalInput = 'input[id="video-modal-input"]';
exports.startShareVideoBtn = 'button[data-test="startNewVideo"]';
exports.videoPlayer = 'div[data-test="videoPlayer"]';
@ -307,7 +307,7 @@ exports.copyStats = 'span[data-test="copyStats"]';
exports.dataSavingScreenshare = 'input[data-test="dataSavingScreenshare"]';
exports.screenshareLocked = 'button[data-test="screenshareLocked"]';
exports.connectionStatusItemEmpty = 'div[data-test="connectionStatusItemEmpty"]';
exports.connectionStatusTab2 = 'div[data-tab="2"]';
exports.connectionStatusTab2 = 'li[id="react-tabs-2"]';
exports.connectionStatusItemUser = 'div[data-test="connectionStatusItemUser"]';
exports.connectionStatusLinkToSettings = `${networkDataContainer} span[role="button"]`;
exports.dataSavingWebcams = 'input[data-test="dataSavingWebcams"]';
@ -329,10 +329,14 @@ exports.promoteToModerator = 'li[data-test="promoteToModerator"]';
exports.demoteToViewer = 'li[data-test="demoteToViewer"]';
exports.makePresenter = 'li[data-test="makePresenter"]';
exports.takePresenter = 'li[data-test="takePresenter"]';
exports.muteAll = 'li[data-test="muteAll"]';
exports.muteAllExceptPresenter = 'li[data-test="muteAllExceptPresenter"]';
exports.error403removedLabel = 'You have been removed from the meeting';
// Lock Viewers
exports.lockViewersButton = 'li[data-test="lockViewersButton"]';
exports.unlockUserButton = 'li[data-test="unlockUserButton"]';
exports.applyLockSettings ='button[data-test="applyLockSettings"]';
exports.applyLockSettings = 'button[data-test="applyLockSettings"]';
exports.lockShareWebcam = 'input[data-test="lockShareWebcam"]';
exports.lockSeeOtherViewersWebcam = 'input[data-test="lockSeeOtherViewersWebcam"]';
exports.lockShareMicrophone = 'input[data-test="lockShareMicrophone"]';

View File

@ -1,6 +1,5 @@
require('dotenv').config();
const sha1 = require('sha1');
const path = require('path');
const axios = require('axios');
const { test } = require('@playwright/test');
const xml2js = require('xml2js');
@ -9,9 +8,6 @@ const { expect } = require("@playwright/test");
const parameters = require('./parameters');
const httpPath = path.join(path.dirname(require.resolve('axios')), 'lib/adapters/http');
const http = require(httpPath);
function getRandomInt(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
@ -28,7 +24,7 @@ function apiCallUrl(name, callParams) {
function apiCall(name, callParams) {
const url = apiCallUrl(name, callParams);
return axios.get(url, { adapter: http }).then(response => xml2js.parseStringPromise(response.data));
return axios.get(url, { adapter: 'http' }).then(response => xml2js.parseStringPromise(response.data));
}
function createMeetingUrl(params, customParameter) {
@ -47,7 +43,7 @@ function createMeetingUrl(params, customParameter) {
function createMeetingPromise(params, customParameter) {
const url = createMeetingUrl(params, customParameter);
return axios.get(url, { adapter: http });
return axios.get(url, { adapter: 'http' });
}
async function createMeeting(params, customParameter) {

View File

@ -83,7 +83,7 @@ test.describe.parallel('Notifications', () => {
test('Screenshare notification', async ({ browser, browserName, context, page }) => {
test.skip(browserName === 'firefox' && process.env.DISPLAY === undefined,
"Screenshare tests not able in Firefox browser without desktop");
"Screenshare tests not able in Firefox browser without desktop");
const presenterNotifications = new PresenterNotifications(browser, context);
await presenterNotifications.initModPage(page);
await presenterNotifications.screenshareToast();

View File

@ -54,7 +54,7 @@ async function waitAndClearNotification(testPage) {
}
async function waitAndClearDefaultPresentationNotification(testPage) {
await testPage.waitForSelector(e.whiteboard,ELEMENT_WAIT_LONGER_TIME);
await testPage.waitForSelector(e.whiteboard, ELEMENT_WAIT_LONGER_TIME);
const hasCurrentPresentationToast = await testPage.checkElement(e.currentPresentationToast);
if (hasCurrentPresentationToast) {
await waitAndClearNotification(testPage);

View File

@ -1,26 +1,26 @@
{
"name": "npm-proj-1662355536800-0.49467469802579256kg5mNL",
"name": "playwright",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"dependencies": {
"@playwright/test": "^1.25.0",
"axios": "^0.26.1",
"@playwright/test": "^1.28.1",
"axios": "^1.2.0",
"chalk": "^4.1.2",
"dotenv": "^16.0.0",
"playwright": "^1.19.2",
"playwright": "^1.28.1",
"sha1": "^1.1.1",
"xml2js": "^0.4.23"
}
},
"node_modules/@playwright/test": {
"version": "1.25.0",
"resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.25.0.tgz",
"integrity": "sha512-j4EZhTTQI3dBeWblE21EV//swwmBtOpIrLdOIJIRv4uqsLdHgBg1z+JtTg+AeC5o2bAXIE26kDNW5A0TimG8Bg==",
"version": "1.28.1",
"resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.28.1.tgz",
"integrity": "sha512-xN6spdqrNlwSn9KabIhqfZR7IWjPpFK1835tFNgjrlysaSezuX8PYUwaz38V/yI8TJLG9PkAMEXoHRXYXlpTPQ==",
"dependencies": {
"@types/node": "*",
"playwright-core": "1.25.0"
"playwright-core": "1.28.1"
},
"bin": {
"playwright": "cli.js"
@ -29,21 +29,10 @@
"node": ">=14"
}
},
"node_modules/@playwright/test/node_modules/playwright-core": {
"version": "1.25.0",
"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.25.0.tgz",
"integrity": "sha512-kZ3Jwaf3wlu0GgU0nB8UMQ+mXFTqBIFz9h1svTlNduNKjnbPXFxw7mJanLVjqxHJRn62uBfmgBj93YHidk2N5Q==",
"bin": {
"playwright": "cli.js"
},
"engines": {
"node": ">=14"
}
},
"node_modules/@types/node": {
"version": "17.0.40",
"resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.40.tgz",
"integrity": "sha512-UXdBxNGqTMtm7hCwh9HtncFVLrXoqA3oJW30j6XWp5BH/wu3mVeaxo7cq5benFdBw34HB3XDT2TRPI7rXZ+mDg=="
"version": "18.11.15",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.15.tgz",
"integrity": "sha512-VkhBbVo2+2oozlkdHXLrb3zjsRkpdnaU2bXmX8Wgle3PUi569eLRaHGlgETQHR7lLL1w7GiG3h9SnePhxNDecw=="
},
"node_modules/ansi-styles": {
"version": "4.3.0",
@ -59,12 +48,19 @@
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
},
"node_modules/axios": {
"version": "0.26.1",
"resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz",
"integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==",
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.2.1.tgz",
"integrity": "sha512-I88cFiGu9ryt/tfVEi4kX2SITsvDddTajXTOFmt2uK1ZVA8LytjtdeyefdQWEf5PU8w+4SSJDoYnggflB5tW4A==",
"dependencies": {
"follow-redirects": "^1.14.8"
"follow-redirects": "^1.15.0",
"form-data": "^4.0.0",
"proxy-from-env": "^1.1.0"
}
},
"node_modules/chalk": {
@ -106,6 +102,17 @@
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
},
"node_modules/combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"dependencies": {
"delayed-stream": "~1.0.0"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/crypt": {
"version": "0.0.2",
"resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz",
@ -114,18 +121,26 @@
"node": "*"
}
},
"node_modules/delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/dotenv": {
"version": "16.0.1",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.1.tgz",
"integrity": "sha512-1K6hR6wtk2FviQ4kEiSjFiH5rpzEVi8WW0x96aztHVMhEspNpc4DVOUTEHtEva5VThQ8IaBX1Pe4gSzpVVUsKQ==",
"version": "16.0.3",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz",
"integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==",
"engines": {
"node": ">=12"
}
},
"node_modules/follow-redirects": {
"version": "1.15.1",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz",
"integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==",
"version": "1.15.2",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
"integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==",
"funding": [
{
"type": "individual",
@ -141,6 +156,19 @@
}
}
},
"node_modules/form-data": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
"integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
"dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"mime-types": "^2.1.12"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@ -149,13 +177,32 @@
"node": ">=8"
}
},
"node_modules/mime-db": {
"version": "1.52.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/mime-types": {
"version": "2.1.35",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
"dependencies": {
"mime-db": "1.52.0"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/playwright": {
"version": "1.22.2",
"resolved": "https://registry.npmjs.org/playwright/-/playwright-1.22.2.tgz",
"integrity": "sha512-hUTpg7LytIl3/O4t0AQJS1V6hWsaSY5uZ7w1oCC8r3a1AQN5d6otIdCkiB3cbzgQkcMaRxisinjMFMVqZkybdQ==",
"version": "1.28.1",
"resolved": "https://registry.npmjs.org/playwright/-/playwright-1.28.1.tgz",
"integrity": "sha512-92Sz6XBlfHlb9tK5UCDzIFAuIkHHpemA9zwUaqvo+w7sFMSmVMGmvKcbptof/eJObq63PGnMhM75x7qxhTR78Q==",
"hasInstallScript": true,
"dependencies": {
"playwright-core": "1.22.2"
"playwright-core": "1.28.1"
},
"bin": {
"playwright": "cli.js"
@ -165,9 +212,9 @@
}
},
"node_modules/playwright-core": {
"version": "1.22.2",
"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.22.2.tgz",
"integrity": "sha512-w/hc/Ld0RM4pmsNeE6aL/fPNWw8BWit2tg+TfqJ3+p59c6s3B6C8mXvXrIPmfQEobkcFDc+4KirNzOQ+uBSP1Q==",
"version": "1.28.1",
"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.28.1.tgz",
"integrity": "sha512-3PixLnGPno0E8rSBJjtwqTwJe3Yw72QwBBBxNoukIj3lEeBNXwbNiKrNuB1oyQgTBw5QHUhNO3SteEtHaMK6ag==",
"bin": {
"playwright": "cli.js"
},
@ -175,6 +222,11 @@
"node": ">=14"
}
},
"node_modules/proxy-from-env": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
},
"node_modules/sax": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
@ -183,7 +235,7 @@
"node_modules/sha1": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz",
"integrity": "sha1-rdqnqTFo85PxnrKxUJFhjicA+Eg=",
"integrity": "sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==",
"dependencies": {
"charenc": ">= 0.0.1",
"crypt": ">= 0.0.1"
@ -226,25 +278,18 @@
},
"dependencies": {
"@playwright/test": {
"version": "1.25.0",
"resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.25.0.tgz",
"integrity": "sha512-j4EZhTTQI3dBeWblE21EV//swwmBtOpIrLdOIJIRv4uqsLdHgBg1z+JtTg+AeC5o2bAXIE26kDNW5A0TimG8Bg==",
"version": "1.28.1",
"resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.28.1.tgz",
"integrity": "sha512-xN6spdqrNlwSn9KabIhqfZR7IWjPpFK1835tFNgjrlysaSezuX8PYUwaz38V/yI8TJLG9PkAMEXoHRXYXlpTPQ==",
"requires": {
"@types/node": "*",
"playwright-core": "1.25.0"
},
"dependencies": {
"playwright-core": {
"version": "1.25.0",
"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.25.0.tgz",
"integrity": "sha512-kZ3Jwaf3wlu0GgU0nB8UMQ+mXFTqBIFz9h1svTlNduNKjnbPXFxw7mJanLVjqxHJRn62uBfmgBj93YHidk2N5Q=="
}
"playwright-core": "1.28.1"
}
},
"@types/node": {
"version": "17.0.40",
"resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.40.tgz",
"integrity": "sha512-UXdBxNGqTMtm7hCwh9HtncFVLrXoqA3oJW30j6XWp5BH/wu3mVeaxo7cq5benFdBw34HB3XDT2TRPI7rXZ+mDg=="
"version": "18.11.15",
"resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.15.tgz",
"integrity": "sha512-VkhBbVo2+2oozlkdHXLrb3zjsRkpdnaU2bXmX8Wgle3PUi569eLRaHGlgETQHR7lLL1w7GiG3h9SnePhxNDecw=="
},
"ansi-styles": {
"version": "4.3.0",
@ -254,12 +299,19 @@
"color-convert": "^2.0.1"
}
},
"asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
},
"axios": {
"version": "0.26.1",
"resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz",
"integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==",
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.2.1.tgz",
"integrity": "sha512-I88cFiGu9ryt/tfVEi4kX2SITsvDddTajXTOFmt2uK1ZVA8LytjtdeyefdQWEf5PU8w+4SSJDoYnggflB5tW4A==",
"requires": {
"follow-redirects": "^1.14.8"
"follow-redirects": "^1.15.0",
"form-data": "^4.0.0",
"proxy-from-env": "^1.1.0"
}
},
"chalk": {
@ -289,38 +341,79 @@
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
},
"combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"requires": {
"delayed-stream": "~1.0.0"
}
},
"crypt": {
"version": "0.0.2",
"resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz",
"integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow=="
},
"delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
},
"dotenv": {
"version": "16.0.1",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.1.tgz",
"integrity": "sha512-1K6hR6wtk2FviQ4kEiSjFiH5rpzEVi8WW0x96aztHVMhEspNpc4DVOUTEHtEva5VThQ8IaBX1Pe4gSzpVVUsKQ=="
"version": "16.0.3",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz",
"integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ=="
},
"follow-redirects": {
"version": "1.15.1",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz",
"integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA=="
"version": "1.15.2",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
"integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA=="
},
"form-data": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
"integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
"requires": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"mime-types": "^2.1.12"
}
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
},
"playwright": {
"version": "1.22.2",
"resolved": "https://registry.npmjs.org/playwright/-/playwright-1.22.2.tgz",
"integrity": "sha512-hUTpg7LytIl3/O4t0AQJS1V6hWsaSY5uZ7w1oCC8r3a1AQN5d6otIdCkiB3cbzgQkcMaRxisinjMFMVqZkybdQ==",
"mime-db": {
"version": "1.52.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
},
"mime-types": {
"version": "2.1.35",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
"requires": {
"playwright-core": "1.22.2"
"mime-db": "1.52.0"
}
},
"playwright": {
"version": "1.28.1",
"resolved": "https://registry.npmjs.org/playwright/-/playwright-1.28.1.tgz",
"integrity": "sha512-92Sz6XBlfHlb9tK5UCDzIFAuIkHHpemA9zwUaqvo+w7sFMSmVMGmvKcbptof/eJObq63PGnMhM75x7qxhTR78Q==",
"requires": {
"playwright-core": "1.28.1"
}
},
"playwright-core": {
"version": "1.22.2",
"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.22.2.tgz",
"integrity": "sha512-w/hc/Ld0RM4pmsNeE6aL/fPNWw8BWit2tg+TfqJ3+p59c6s3B6C8mXvXrIPmfQEobkcFDc+4KirNzOQ+uBSP1Q=="
"version": "1.28.1",
"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.28.1.tgz",
"integrity": "sha512-3PixLnGPno0E8rSBJjtwqTwJe3Yw72QwBBBxNoukIj3lEeBNXwbNiKrNuB1oyQgTBw5QHUhNO3SteEtHaMK6ag=="
},
"proxy-from-env": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
},
"sax": {
"version": "1.2.4",
@ -330,7 +423,7 @@
"sha1": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz",
"integrity": "sha1-rdqnqTFo85PxnrKxUJFhjicA+Eg=",
"integrity": "sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==",
"requires": {
"charenc": ">= 0.0.1",
"crypt": ">= 0.0.1"

View File

@ -1,6 +1,7 @@
{
"scripts": {
"test": "npx playwright test",
"test:ssh": "set -e; fn () { target=$1; shift; secret=$(ssh $target sudo bbb-conf --secret); env=$(echo \"$secret\" | sed -e 's/^ *URL: /BBB_URL=/' -e '/^BBB_URL/s/$/api/' -e 's/^ *Secret: /BBB_SECRET=/' -e '/^BBB/p' -e d); env $env npx playwright test $@; }; fn",
"test:filter": "npx playwright test -g",
"test:headed": "npx playwright test --headed",
"test:debug": "npx playwright test --debug -g",
@ -8,11 +9,11 @@
"test-firefox-ci": "export CI='true' && npx playwright test --project=firefox --grep @ci"
},
"dependencies": {
"@playwright/test": "^1.25.0",
"playwright": "^1.19.2",
"axios": "^0.26.1",
"chalk": "^4.1.2",
"@playwright/test": "^1.28.1",
"axios": "^1.2.0",
"dotenv": "^16.0.0",
"playwright": "^1.28.1",
"chalk": "^4.1.2",
"sha1": "^1.1.1",
"xml2js": "^0.4.23"
}

View File

@ -4,7 +4,7 @@ const CI = process.env.CI === 'true';
const DEBUG_MODE = process.env.DEBUG_MODE === 'true';
const config = {
workers: 2,
workers: CI ? 1 : 2,
timeout: 3 * 60 * 1000,
reporter: [
[CI ? 'github' : 'list'],
@ -15,7 +15,7 @@ const config = {
headless: true,
trace: DEBUG_MODE ? 'on'
: CI ? 'retain-on-failure'
: 'off',
: 'off',
screenshot: 'on',
video: 'on',
},

View File

@ -6,6 +6,7 @@ const utilPresentation = require('../presentation/util');
const { ELEMENT_WAIT_LONGER_TIME } = require('../core/constants');
const { getSettings } = require('../core/settings');
const { waitAndClearDefaultPresentationNotification } = require('../notifications/util');
const { sleep } = require('../core/helpers');
class Polling extends MultiUsers {
constructor(browser, context) {
@ -206,7 +207,7 @@ class Polling extends MultiUsers {
async smartSlidesQuestions() {
await utilPresentation.uploadSinglePresentation(this.modPage, e.smartSlides1, ELEMENT_WAIT_LONGER_TIME);
await this.userPage.hasElement(e.presentationTitle);
await this.modPage.waitAndClick(e.quickPoll);
await this.userPage.hasElement(e.responsePollQuestion);
await this.userPage.type(e.pollAnswerOptionInput, 'test');
@ -221,11 +222,11 @@ class Polling extends MultiUsers {
await this.userPage.waitAndClick(e.submitAnswersMultiple);
await this.modPage.hasText(e.answer1, '1');
await this.modPage.waitAndClick(e.publishPollingLabel);
await this.modPage.waitAndClick(e.nextSlide);
await this.modPage.waitAndClick(e.quickPoll);
await this.userPage.waitAndClick(e.pollAnswerOptionBtn);
await this.userPage.waitAndClick(e.pollAnswerDescTest1);
await this.modPage.hasText(e.answer1, '1');
await this.modPage.hasElementDisabled(e.nextSlide);

View File

@ -50,7 +50,7 @@ class Presentation extends MultiUsers {
await this.modPage.waitForSelector(e.whiteboard);
await this.modPage.waitAndClick(e.actions);
await this.modPage.waitAndClick(e.shareExternalVideoBtn);
await this.modPage.waitForSelector(e.externalVideoModalHeader);
await this.modPage.waitForSelector(e.closeModal);
await this.modPage.type(e.videoModalInput, e.youtubeLink);
await this.modPage.waitAndClick(e.startShareVideoBtn);
@ -62,6 +62,7 @@ class Presentation extends MultiUsers {
}
async uploadSinglePresentationTest() {
await this.modPage.waitForSelector(e.whiteboard, ELEMENT_WAIT_LONGER_TIME);
await this.modPage.waitForSelector(e.skipSlide);
const modSlides0 = await getSlideOuterHtml(this.modPage);
@ -81,14 +82,14 @@ class Presentation extends MultiUsers {
async uploadMultiplePresentationsTest() {
await this.modPage.waitForSelector(e.skipSlide);
const modSlides0 = await this.modPage.page.evaluate(getSvgOuterHtml);
const userSlides0 = await this.userPage.page.evaluate(getSvgOuterHtml);
const modSlides0 = await getSlideOuterHtml(this.modPage);
const userSlides0 = await getSlideOuterHtml(this.userPage);
await expect(modSlides0).toEqual(userSlides0);
await uploadMultiplePresentations(this.modPage, [e.uploadPresentationFileName, e.questionSlideFileName]);
const modSlides1 = await this.userPage.page.evaluate(async () => document.querySelector('svg g g g').outerHTML);
const userSlides1 = await this.modPage.page.evaluate(async () => document.querySelector('svg g g g').outerHTML);
const modSlides1 = await getSlideOuterHtml(this.modPage);
const userSlides1 = await getSlideOuterHtml(this.userPage);
await expect(modSlides1).toEqual(userSlides1);
await expect(modSlides0).not.toEqual(modSlides1);
@ -100,9 +101,9 @@ class Presentation extends MultiUsers {
await this.modPage.waitForSelector(e.skipSlide);
await this.modPage.waitAndClick(e.userListToggleBtn);
await uploadSinglePresentation(this.modPage, e.uploadPresentationFileName);
const width1 = await this.modPage.page.locator(e.whiteboard).getAttribute("width");
const width1 = (await this.modPage.page.locator(e.whiteboard).boundingBox()).width;
await this.modPage.waitAndClick(e.fitToWidthButton);
const width2 = await this.modPage.page.locator(e.whiteboard).getAttribute("width");
const width2 = (await this.modPage.page.locator(e.whiteboard).boundingBox()).width;
await expect(Number(width2) > Number(width1)).toBeTruthy();
}
@ -136,11 +137,11 @@ class Presentation extends MultiUsers {
async uploadAndRemoveAllPresentations() {
await waitAndClearDefaultPresentationNotification(this.modPage);
await uploadSinglePresentation(this.modPage, e.uploadPresentationFileName);
const modSlides1 = await getSlideOuterHtml(this.modPage);
const userSlides1 = await getSlideOuterHtml(this.userPage);
await expect(modSlides1).toEqual(userSlides1);
// Remove
await this.modPage.waitForSelector(e.whiteboard, ELEMENT_WAIT_LONGER_TIME);
await this.modPage.waitAndClick(e.actions);
@ -148,44 +149,44 @@ class Presentation extends MultiUsers {
await this.modPage.waitAndClick(e.removePresentation);
await this.modPage.waitAndClick(e.removePresentation);
await this.modPage.waitAndClick(e.confirmManagePresentation);
await this.modPage.wasRemoved(e.whiteboard);
await this.modPage.hasElementDisabled(e.minimizePresentation);
await this.userPage.wasRemoved(e.whiteboard);
await this.userPage.hasElementDisabled(e.minimizePresentation);
// Check removed presentations inside the Manage Presentations
await this.modPage.waitAndClick(e.actions);
await this.modPage.waitAndClick(e.managePresentations);
await this.modPage.wasRemoved(e.presentationsList);
await this.modPage.waitAndClick(e.confirmManagePresentation);
// Making viewer a presenter
await this.modPage.waitAndClick(e.userListItem);
await this.modPage.waitAndClick(e.makePresenter);
await this.userPage.waitAndClick(e.actions);
await this.userPage.waitAndClick(e.managePresentations);
await this.userPage.wasRemoved(e.presentationsList);
}
async removePreviousPresentationFromPreviousPresenter() {
await waitAndClearDefaultPresentationNotification(this.modPage);
await uploadSinglePresentation(this.modPage, e.uploadPresentationFileName);
const modSlides1 = await getSlideOuterHtml(this.modPage);
const userSlides1 = await getSlideOuterHtml(this.userPage);
await expect(modSlides1).toEqual(userSlides1);
await this.modPage.waitAndClick(e.userListItem);
await this.modPage.waitAndClick(e.makePresenter);
await this.userPage.waitAndClick(e.actions);
await this.userPage.waitAndClick(e.managePresentations);
await this.userPage.waitAndClick(e.removePresentation);
await this.userPage.waitAndClick(e.removePresentation);
await this.userPage.waitAndClick(e.confirmManagePresentation);
await this.userPage.wasRemoved(e.whiteboard);
await this.userPage.waitAndClick(e.actions);
await this.userPage.waitAndClick(e.managePresentations);

View File

@ -76,7 +76,7 @@ test.describe.parallel('Presentation', () => {
await presentation.initPages(page);
await presentation.uploadAndRemoveAllPresentations();
});
test('Remove previous presentation from previous presenter', async ({ browser, context, page }) => {
const presentation = new Presentation(browser, context);
await presentation.initPages(page);

View File

@ -4,7 +4,7 @@ const Page = require('../core/page');
const e = require('../core/elements');
const { waitAndClearDefaultPresentationNotification } = require('../notifications/util');
const { sleep } = require('../core/helpers');
const { checkAvatarIcon, checkIsPresenter } = require('./util');
const { checkAvatarIcon, checkIsPresenter, checkMutedUsers } = require('./util');
const { checkTextContent } = require('../core/util');
const { getSettings } = require('../core/settings');
const { ELEMENT_WAIT_LONGER_TIME } = require('../core/constants');
@ -231,6 +231,40 @@ class MultiUsers {
}, e.multiUsersWhiteboardOff);
await expect(resp).toBeTruthy();
}
async muteAllUsers() {
await this.modPage.joinMicrophone();
await this.modPage2.joinMicrophone();
await this.userPage.joinMicrophone();
await this.modPage.waitAndClick(e.manageUsers);
await this.modPage.waitAndClick(e.muteAll);
await checkMutedUsers(this.modPage);
await checkMutedUsers(this.modPage2);
await checkMutedUsers(this.userPage);
}
async muteAllUsersExceptPresenter(){
await this.modPage.joinMicrophone();
await this.modPage2.joinMicrophone();
await this.userPage.joinMicrophone();
await this.modPage.waitAndClick(e.manageUsers);
await this.modPage.waitAndClick(e.muteAllExceptPresenter);
await this.modPage.hasElement(e.isTalking);
await checkMutedUsers(this.modPage2);
await checkMutedUsers(this.userPage);
}
async giveAndRemoveWhiteboardAccess() {
await this.whiteboardAccess();
await this.modPage.waitForSelector(e.whiteboard);
await this.modPage.waitAndClick(e.userListItem);
await this.modPage.waitAndClick(e.changeWhiteboardAccess);
await this.modPage.hasElement(e.multiUsersWhiteboardOn);
}
}
exports.MultiUsers = MultiUsers;

View File

@ -64,11 +64,18 @@ test.describe.parallel('User', () => {
await multiusers.initModPage2();
await multiusers.demoteToViewer();
});
test('Give and remove whiteboard access', async ({ browser, context, page }) => {
const multiusers = new MultiUsers(browser, context);
await multiusers.initModPage(page);
await multiusers.initModPage2();
await multiusers.giveAndRemoveWhiteboardAccess();
});
});
test.describe.parallel('Manage', () => {
test.describe.parallel('Guest policy', () => {
test.describe.parallel('ASK_MODERATOR', () => {
test.describe.parallel('ASK_MODERATOR', () => {
// https://docs.bigbluebutton.org/2.6/release-tests.html#ask-moderator
test('Message to guest lobby', async ({ browser, context, page }) => {
const guestPolicy = new GuestPolicy(browser, context);
@ -85,7 +92,7 @@ test.describe.parallel('User', () => {
await guestPolicy.initModPage(page);
await guestPolicy.denyEveryone();
});
test('Remember choice', async ({ browser, context, page }) => {
const guestPolicy = new GuestPolicy(browser, context);
await guestPolicy.initModPage(page);
@ -98,13 +105,13 @@ test.describe.parallel('User', () => {
await guestPolicy.initModPage(page);
await guestPolicy.messageToSpecificUser();
});
test('Accept', async ({ browser, context, page }) => {
const guestPolicy = new GuestPolicy(browser, context);
await guestPolicy.initModPage(page);
await guestPolicy.acceptSpecificUser();
});
test('Deny', async ({ browser, context, page }) => {
const guestPolicy = new GuestPolicy(browser, context);
await guestPolicy.initModPage(page);
@ -203,6 +210,22 @@ test.describe.parallel('User', () => {
await multiusers.initModPage(page);
await multiusers.selectRandomUser();
});
test('Mute all users', async ({ browser, context, page }) => {
const multiusers = new MultiUsers(browser, context);
await multiusers.initModPage(page, false);
await multiusers.initModPage2(false);
await multiusers.initUserPage(false);
await multiusers.muteAllUsers();
});
test('Mute all users except presenter', async ({ browser, context, page }) => {
const multiusers = new MultiUsers(browser, context);
await multiusers.initModPage(page, false);
await multiusers.initModPage2(false);
await multiusers.initUserPage(false);
await multiusers.muteAllUsersExceptPresenter();
});
});
test.describe.parallel('Mobile devices', () => {

View File

@ -27,8 +27,14 @@ async function checkIsPresenter(test) {
}, [e.currentUser, e.userAvatar])
}
async function checkMutedUsers(test) {
await test.wasRemoved(e.muteMicButton);
await test.hasElement(e.unmuteMicButton);
}
exports.setStatus = setStatus;
exports.openLockViewers = openLockViewers;
exports.setGuestPolicyOption = setGuestPolicyOption;
exports.checkAvatarIcon = checkAvatarIcon;
exports.checkIsPresenter = checkIsPresenter;
exports.checkMutedUsers = checkMutedUsers;

Some files were not shown because too many files have changed in this diff Show More