audio updates, webaudio etc

This commit is contained in:
STeve Seguin 2020-12-11 08:48:23 -05:00
parent 7baa26c99d
commit 4ec34fdb8a
29 changed files with 1720 additions and 611 deletions

View File

@ -121,10 +121,10 @@ $('#audioSource').on('mousedown touchend focusin focusout', function(e) {
});
$('#audioSource3').on('mousedown touchend focusin focusout', function(e) {
var state = $('#multiselect-trigger3').data('state') || 0;
var state = $('#multiselect-trigger3').attr('data-state') || 0;
if( state == 0 ) {
////open the dropdown
$('#multiselect-trigger3').data('state', '1').addClass('open').removeClass('closed');
$('#multiselect-trigger3').attr('data-state', '1').addClass('open').removeClass('closed');
$('#multiselect-trigger3').find('.chevron').removeClass('bottom');
$('#multiselect-trigger3').parent().find('.multiselect-contents').show();
$('#multiselect-trigger3').parent().find('.multiselect-contents').find('input[type="checkbox"]').parent().show();;
@ -154,17 +154,19 @@ $('#multiselect-trigger').on('mousedown touchend focusin focusout', function(e)
});
// multiselect dropdowns
$('#multiselect-trigger3').on('mousedown touchend focusin focusout', function(e) {
var state = $(this).data('state') || 0;
var state = $(this).attr('data-state') || 0;
if( state == 0 ) {
// open the dropdown
$(this).data('state', '1').addClass('open').removeClass('closed');
errorlog("STATE: "+state);
$(this).attr('data-state', '1').addClass('open').removeClass('closed');
$(this).find('.chevron').removeClass('bottom');
$(this).parent().find('.multiselect-contents').show();
$(this).parent().find('.multiselect-contents').find('input[type="checkbox"]').parent().show();;
$(this).parent().find('.multiselect-contents').find('input[type="checkbox"]').show();;
} else {
// close the dropdown
$(this).data('state', '0').addClass('closed').removeClass('open');
$(this).attr('data-state', '0').addClass('closed').removeClass('open');
$(this).find('.chevron').addClass('bottom');
$(this).parent().find('.multiselect-contents').find('input[type="checkbox"]').not(":checked").parent().hide();;
$(this).parent().find('.multiselect-contents').find('input[type="checkbox"]').hide();;

264
examples/stats.html Normal file
View File

@ -0,0 +1,264 @@
<html>
<head>
<title>OBS.Ninja IFRAME Outgoing Stats Example</title>
<link rel="shortcut icon" href="data:image/x-icon;," type="image/x-icon" />
<link rel="icon" type="image/png" sizes="32x32" href="./images/favicon-32x32.png" />
<link rel="icon" type="image/png" sizes="16x16" href="./images/favicon-16x16.png" />
<link rel="icon" href="./images/favicon.ico" />
<link itemprop="thumbnailUrl" href="./images/obsNinja_logo_full.png" />
<link rel="stylesheet" type="text/css" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
<style>
body {
padding: 0;
margin: 0;
background-color: rgb(20, 25, 38);
}
iframe {
border: 0;
margin: 2px auto;
padding: 0;
display: block;
margin: 10px;
width: 640px;
height: 320px;
background-color: black;
}
input {
padding: 5px;
margin: 5px;
}
button {
padding: 5px;
margin: 5px;
}
</style>
</head>
<body>
<div class="container-fluid">
<div class="row controls" style="margin-bottom:15px;border-bottom:1px solid black;">
<div class="col-8">
<input type="text" class="form-control" style="width:95%;margin:10px auto;" placeholder="Enter an OBS.Ninja View URL here" value="" id="viewlink" />
</div>
<div class="col-4">
<div class="row">
<div class="col-2"></div>
<div class="col-10">
<button type="button" class="btn btn-primary" style="margin:10px 0;width:calc(90% + 15px);margin-left:5px;" id="btnStart">Start</button>
</div>
</div>
</div>
</div>
<div class="row output">
<div class="col-7" id="source">
<iframe style="margin:0 auto;" allow="autoplay;camera;microphone" src=""></iframe>
</div>
<div class="col-5" id="sourcecontrols">
<div class="row text-light" style="margin-top:15px;">
<div class="col">
<p>This example will show all connections to the stream generated from this page using statistics gathered using the <a href="https://github.com/steveseguin/obsninja/blob/master/IFRAME.md">iFrame API</a>.</p>
<p>Click start to generate a stream using the OBS.Ninja URL shown. If you use the example URL shown, you can <a id="aView" href="" target="_blank">click here</a> to connect to this stream as a viewer in a new window/tab, this will then show in the table below. Expired connections will be removed after a short delay.</p>
</div>
</div>
<div class="row" style="margin-top:5px;">
<div style="padding-top:10px;" class="col-4 text-right font-weight-bold text-light">Audio:</div>
<div class="col-8">
<button type="button" class="btn btn-sm btn-secondary" style="width:45%;" id="btnMuteAudio">Disable</button>
<button type="button" class="btn btn-sm btn-success" style="width:45%;" id="btnUnMuteAudio">Enabled</button>
</div>
</div>
<div class="row">
<div style="padding-top:10px;" class="col-4 text-right font-weight-bold text-light">Video:</div>
<div class="col-8">
<button type="button" class="btn btn-sm btn-secondary" style="width:45%;" id="btnMuteVidio">Disable</button>
<button type="button" class="btn btn-sm btn-success" style="width:45%;" id="btnUnMuteVidio">Enabled</button>
</div>
</div>
<div class="row">
<div style="padding-top:10px;" class="col-4 text-right font-weight-bold text-light">Stats:</div>
<div class="col-8">
<button type="button" class="btn btn-sm btn-secondary" style="width:45%;" id="btnStatsAuto">Auto Refresh Off</button>
<button type="button" class="btn btn-sm btn-secondary" style="width:45%;" id="btnStatsRefresh">Refresh</button>
</div>
</div>
<div class="row">
<div style="padding-top:5px;" class="col-6 text-right font-weight-bold text-light">Outbound Connections:</div>
<div style="padding-top:5px;" class="col-6 font-weight-bold text-light" id="divTotalConnections">0</div>
</div>
</div>
</div>
<div class="row">
<div class="col-12">
<table id="viewers" style="margin-top:15px;" class="table table-hover text-center table-striped table-dark">
<thead>
<tr>
<th scope="col" class="align-middle">Label</th>
<th scope="col" class="align-middle">Added</th>
<th scope="col" class="align-middle">Quality Limit Reason</th>
<th scope="col" class="align-middle">Resolution</th>
<th scope="col" class="align-middle">Platform</th>
<th scope="col" class="align-middle">Encoder</th>
<th scope="col" class="align-middle">User Agent</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
<script>
var autorefresh = false;
var eventMethod = window.addEventListener ? "addEventListener" : "attachEvent";
var eventer = window[eventMethod];
var messageEvent = eventMethod === "attachEvent" ? "onmessage" : "message";
eventer(messageEvent, function(e) {
//Check message is coming from our iframe, otherwise we don't care
if (e.source != $('#source iframe')[0].contentWindow) return;
if ("stats" in e.data) {
var now = new Date(); //Used for "Added" column and to remove stale viewers
for (var viewer in e.data.stats.outbound_stats) {
//Check to see if a row exists for this viewier, if not then its a new viewer and we should create a row
if ($("#obsn_viewer_" + viewer).length == 0) {
var h = now.getHours();
var m = now.getMinutes();
var s = now.getSeconds();
$('#viewers tbody').append('<tr id="obsn_viewer_' + viewer + '"><th class="obsn_viewer_label" scope="row"></th><td class="obsn_viewer_added">' + ("0" + h).slice(-2) + ':' + ("0" + m).slice(-2) + ':' + ("0" + s).slice(-2) + '</td><td class="obsn_viewer_qlr"></td><td class="obsn_viewer_resolution"></td><td class="obsn_viewer_platform"></td><td class="obsn_viewer_encoder"></td><td class="obsn_viewer_useragent"></td></tr>');
}
//Insert/update stats
//Initially objects can be available but without any attributes, check they exist and ignore till the basics are available
if (e.data.stats.outbound_stats[viewer] == undefined) continue;
if (e.data.stats.outbound_stats[viewer].info == undefined) continue;
//Checking these exist as not all attributes are available straight away when stats are created
if (e.data.stats.outbound_stats[viewer].info.label != undefined) {
$("#obsn_viewer_" + viewer).find('.obsn_viewer_label').text(e.data.stats.outbound_stats[viewer].info.label);
}
if (e.data.stats.outbound_stats[viewer].quality_Limitation_Reason != undefined) {
$("#obsn_viewer_" + viewer).find('.obsn_viewer_qlr').text(e.data.stats.outbound_stats[viewer].quality_Limitation_Reason);
}
if (e.data.stats.outbound_stats[viewer].resolution != undefined) {
$("#obsn_viewer_" + viewer).find('.obsn_viewer_resolution').text(e.data.stats.outbound_stats[viewer].resolution);
}
if (e.data.stats.outbound_stats[viewer].info.platform != undefined) {
$("#obsn_viewer_" + viewer).find('.obsn_viewer_platform').text(e.data.stats.outbound_stats[viewer].info.platform);
}
if (e.data.stats.outbound_stats[viewer].encoder != undefined) {
$("#obsn_viewer_" + viewer).find('.obsn_viewer_encoder').text(e.data.stats.outbound_stats[viewer].encoder);
}
if (e.data.stats.outbound_stats[viewer].info.useragent != undefined) {
$("#obsn_viewer_" + viewer).find('.obsn_viewer_useragent').text(e.data.stats.outbound_stats[viewer].info.useragent);
}
$("#obsn_viewer_" + viewer).data('last', now.getTime()); //Used below to remove old viewers
}
//Mark and then remove viewers who have not been seen for a while
$('#viewers tbody tr').each(function(el) {
if (parseInt($(this).data('last')) < (now.getTime() - 10000)) { //10 seconds
$(this).remove();
} else if (parseInt($(this).data('last')) < (now.getTime())) { //Mark viewer in red to show they have disappeared, note that it takes a few seconds for this to happen
$(this).addClass('bg-danger');
} else { //Viewer is there, make sure they're not marked as missing
$(this).removeClass('bg-danger');
}
});
$('#divTotalConnections').text(e.data.stats.total_outbound_connections);
}
});
$(document).ready(function() {
$('#btnMuteAudio').on('click', function() {
$(this).addClass('btn-success').removeClass('btn-secondary').text('Disabled');
$('#btnUnMuteAudio').removeClass('btn-success').addClass('btn-secondary').text('Enable');
$('#source iframe')[0].contentWindow.postMessage({
"mic": false
}, '*');
});
$('#btnUnMuteAudio').on('click', function() {
$(this).addClass('btn-success').removeClass('btn-secondary').text('Enabled');
$('#btnMuteAudio').removeClass('btn-success').addClass('btn-secondary').text('Disable');
$('#source iframe')[0].contentWindow.postMessage({
"mic": true
}, '*');
});
$('#btnMuteVidio').on('click', function() {
$(this).addClass('btn-success').removeClass('btn-secondary').text('Disabled');
$('#btnUnMuteVidio').removeClass('btn-success').addClass('btn-secondary').text('Enable');
$('#source iframe')[0].contentWindow.postMessage({
"camera": false
}, '*');
});
$('#btnUnMuteVidio').on('click', function() {
$(this).addClass('btn-success').removeClass('btn-secondary').text('Enabled');
$('#btnMuteVidio').removeClass('btn-success').addClass('btn-secondary').text('Disable');
$('#source iframe')[0].contentWindow.postMessage({
"camera": true
}, '*');
});
$('#btnStatsAuto').on('click', function() {
if (autorefresh) {
autorefresh = false;
$('#btnStatsAuto').removeClass('btn-success').addClass('btn-secondary').text('Auto Refresh Off');
} else {
autorefresh = true;
$('#btnStatsAuto').addClass('btn-success').removeClass('btn-secondary').text('Auto Refresh On');
}
});
$('#btnStatsRefresh').on('click', function() {
$(this).addClass('btn-success').removeClass('btn-secondary').attr('disabled', true);
$('#source iframe')[0].contentWindow.postMessage({
"getStats": true
}, '*');
setTimeout(function() {
$('#btnStatsRefresh').addClass('btn-secondary').removeClass('btn-success').attr('disabled', false);
}, 700);
});
$('#btnStart').on('click', function() {
//Reset buttons as currently we can't check the state of these properties
$('#btnMuteAudio,#btnMuteVidio').removeClass('btn-success').addClass('btn-secondary').text('Disable');
$('#btnUnMuteAudio,#btnUnMuteVidio').addClass('btn-success').removeClass('btn-secondary').text('Enabled');
//Update the iframe source from the input field, yup, that simple
$('#source iframe').attr('src', $('#viewlink').val());
//Start autorefresh of stats
autorefresh = true;
$('#btnStatsAuto').addClass('btn-success').removeClass('btn-secondary').text('Auto Refresh On');
});
//Start checking for stats
setInterval(function() {
if (autorefresh == false) return;
$('#source iframe')[0].contentWindow.postMessage({
"getStats": true
}, '*');
}, 1000);
//Add in random ID and password strings to URL's, the below is purely for the purposes of this example
var pushid = makeid();
var password = makeid();
var baseUrl = "https://obs.ninja/";
$('#aView').attr('href', baseUrl + '?view=' + pushid + '&password=' + password + '&label=Test_Link');
$('#viewlink').val(baseUrl + '?push=' + pushid + '&password=' + password + '&autostart&turn=false&fps=25&maxbitrate=1000&cleanoutput&audiobitrate=32&aec=0&denoise=0&webcam');
});
//This function is purely used to generate random push id and password strings for the purposes of this example
function makeid() {
var result = '';
var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
var charactersLength = characters.length;
for (var i = 0; i < 8; i++) {
result += characters.charAt(Math.floor(Math.random() * charactersLength));
}
return result;
}
</script>
</body>
</html>

View File

@ -203,6 +203,16 @@ function loadIframe(){ // this is pretty important if you want to avoid camera
button.onclick = function(){iframe.contentWindow.postMessage({"automixer":false}, '*');};
iframeContainer.appendChild(button);
var button = document.createElement("button");
button.innerHTML = "ENABLE TALLY LIGHT";
button.onclick = function(){iframe.contentWindow.postMessage({"sceneState":true}, '*');};
iframeContainer.appendChild(button);
var button = document.createElement("button");
button.innerHTML = "STOP TALLY LIGHT";
button.onclick = function(){iframe.contentWindow.postMessage({"sceneState":false}, '*');};
iframeContainer.appendChild(button);
var button = document.createElement("button");
button.innerHTML = "Add Target Video";
button.onclick = function(){iframe.contentWindow.postMessage({"target":"*", "add":true, "settings":{"style":{"width":"640px", "height":"360px", "float":"left", "border":"10px solid red", "display":"block"}}}, '*');}; // target can be a stream ID or * for all.

2
images/hd.svg Normal file
View File

@ -0,0 +1,2 @@
<svg xmlns="http://www.w3.org/2000/svg" width="65" height="64"><style> .a{stroke-width:10;stroke:#000;}</style><title> background</title><rect height="66" width="67" y="-1" x="-1" fill="#0000"/><g height="100" width="100"><rect y="28.56" x="29.5" height="600" width="800" fill="url(#gridpattern)"/></g><title> Layer 1</title><rect height="3" width="1" y="27.02" x="302" style="fill:#0000;stroke-width:2;stroke:#0000"/><rect height="43" width="48" y="10.8" x="8.38" style="fill-opacity:null;fill:#0000;stroke-opacity:null;stroke-width:2;stroke:#FFF"/>
<text font-family="Helvetica, Arial, sans-serif" font-size="24" y="40.49" x="15.38" style="fill:#FFF;font-weight:bold"> HQ</text></svg>

After

Width:  |  Height:  |  Size: 697 B

BIN
images/mic-animate.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

BIN
images/mic-slash.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 807 B

BIN
images/mic.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 489 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 299 KiB

BIN
images/old_logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

2
images/sd.svg Normal file
View File

@ -0,0 +1,2 @@
<svg xmlns="http://www.w3.org/2000/svg" width="65" height="64"><style> .a{stroke-width:10;stroke:#000;}</style><title> background</title><rect height="66" width="67" y="-1" x="-1" fill="#0000"/><g height="100" width="100"><rect y="28.56" x="29.5" height="600" width="800" fill="url(#gridpattern)"/></g><title> Layer 1</title><rect height="3" width="1" y="27.02" x="302" style="fill:#0000;stroke-width:5;stroke:#0000"/><rect height="43" width="48" y="10.8" x="8.38" style="fill-opacity:null;fill:#0000;stroke-opacity:null;stroke-width:5;stroke:#FFF"/>
<text font-family="Helvetica, Arial, sans-serif" font-size="24" y="40.49" x="15.38" style="fill:#FFF;font-weight:bold"> LQ</text></svg>

After

Width:  |  Height:  |  Size: 697 B

View File

@ -52,7 +52,7 @@
<script type="text/javascript" crossorigin="anonymous" src="./thirdparty/adapter-latest.js"></script>
<script type="text/javascript" crossorigin="anonymous" src="./thirdparty/qrcode.min.js"></script>
<script type="text/javascript" src="./thirdparty/jquery.min.js"></script>
<link rel="stylesheet" href="./main.css?ver=22" />
<link rel="stylesheet" href="./main.css?ver=23" />
</head>
<body id="main" class="hidden">
<span itemprop="image" itemscope itemtype="image/png">
@ -62,8 +62,8 @@
<span itemprop="thumbnail" itemscope itemtype="http://schema.org/ImageObject">
<link itemprop="url" href="./images/obsNinja_logo_full.png" />
</span>
<script type="text/javascript" crossorigin="anonymous" src="./thirdparty/CodecsHandler.js?ver=22"></script>
<script type="text/javascript" crossorigin="anonymous" src="./webrtc.js?ver=119"></script>
<script type="text/javascript" crossorigin="anonymous" src="./thirdparty/CodecsHandler.js?ver=23"></script>
<script type="text/javascript" crossorigin="anonymous" src="./webrtc.js?ver=125"></script>
<input id="zoomSlider" type="range" style="display: none;" />
<div id="header">
<a id="logoname" href="./" style="text-decoration: none; color: white; margin: 2px;">
@ -118,12 +118,18 @@
<div id="mutevideobutton" title="Disable the Camera" onclick="toggleVideoMute()" class="advanced float" style="cursor: pointer;" alt="Toggle the camera">
<i id="mutevideotoggle" class="toggleSize las la-eye my-float"></i>
</div>
<div id="screensharebutton" title="Share a Screen with others" onclick="toggleScreenShare()" class="float advanced" style="cursor: pointer;">
<i id="screensharetoggle" class="toggleSize las la-desktop my-float"></i>
</div>
<div id="settingsbutton" title="Settings" onclick="toggleSettings()" class="advanced float" style="cursor: pointer;" alt="Toggle the Settings Menu">
<i id="settingstoggle" class="toggleSize las la-sliders-h my-float"></i>
<i id="settingstoggle" class="toggleSize las la-cog my-float"></i>
</div>
<div id="hangupbutton" title="Hangup the Call" onclick="hangup()" class="advanced float" style="cursor: pointer;" alt="Disconnect and End">
<i class="toggleSize my-float las la-phone rotate225" aria-hidden="true"></i>
</div>
<div id="raisehandbutton" data-raised="0" title="Alert the host you want to speak" onclick="raisehand()" class="advanced float" style="cursor: pointer;">
<i class="toggleSize my-float las la-hand-paper" style="position: relative; right: 1px;" aria-hidden="true"></i>
</div>
</div>
@ -158,32 +164,58 @@
<span data-translate="rooms-allow-for">Rooms allow for group-chat and the tools to manage multiple guests.</span>
<br />
<br />
<table>
<table >
<tr>
<th><b>
<th style="text-align:right;"><b>
<span data-translate="room-name">Room Name</span>:
</b></th>
<th><input id="videoname1" placeholder="Enter a Room Name here" onkeyup="enterPressed(event, createRoom);" size="30" maxlength="30" style="font-size: 110%; padding: 5px;" /></th>
<th style="text-align:left;"><input id="videoname1" placeholder="Enter a Room Name here" onkeyup="enterPressed(event, createRoom);" size="30" maxlength="30" style="font-size: 110%; padding: 5px;" /></th>
</tr><tr>
<th><b>
<th style="text-align:right;"><b>
<span data-translate="password-input-field">Password</span>:
</b>
</th><th>
</th><th style="text-align:left;">
<input id="passwordRoom" placeholder="Optional room password here" onkeyup="enterPressed(event, createRoom);" size="30" maxlength="30" style="font-size: 110%; padding: 5px;" />
</th>
</tr><tr><th></th><th>
<br />
<button onclick="createRoom()" class="gobutton" style="float: left;">
<span data-translate="enter-the-rooms-control">Enter the Room's Control Center</span>
</button>
<br /><br />
<button class="white" style="display: block;" onclick="toggle(document.getElementById('roomnotes'),this);">
<span data-translate="show-tips">Show me some tips..</span>
</button>
</th></tr>
</tr><tr style="line-height: 4em;">
<th style="text-align:right; padding: 5px;">
<input id="broadcastFlag" type="checkbox" title="For large group rooms, this option can reduce the load on remote guests substaintailly" />
</th><th style="text-align:left;">
<b>
<span data-translate="guests-only-see-director" title="For large group rooms, this option can reduce the load on remote guests substaintailly" >Guests can only see the Director's video</span>
</b>
</th>
</tr><tr>
<th style="text-align:right; padding: 5px;">
<select id="codecGroupFlag" type="checkbox" title="For large group rooms, this option can reduce the load on remote guests substaintailly" >
<option value="default" selected>Default</option>
<option value="vp9">VP9</option>
<option value="h264">H264</option>
<option value="vp8">VP8</option>
</select >
</th>
<th style="text-align:left;">
<b>
<span data-translate="default-codec-select" title="Which video codec would you want used by default?" >Preferred Video Codec</span>
</b>
</th>
</tr><tr>
<th></th>
<th style="text-align:right;">
<button onclick="createRoom()" class="gobutton" style="float: left;" title="You'll enter as the room's director">
<span data-translate="enter-the-rooms-control">Enter the Room's Control Center</span>
</button>
<br /><br />
<button class="white" style="display: block;" onclick="toggle(document.getElementById('roomnotes'),this);">
<span data-translate="show-tips">Show me some tips..</span>
</button>
</th>
</tr>
</table>
<br />
<ul style=" margin: auto auto; max-width: 500px; display: none; text-align: left;" id="roomnotes">
@ -193,7 +225,6 @@
<i>Important Tips:</i><br /><br />
</u>
<li>Invite only guests to the room that you trust.</li>
<li>iOS devices will share just their audio with other room guests; not video. This is intentional.</li>
<li>The "Recording" option is considered experimental.</li>
</span>
</ul>
@ -233,9 +264,9 @@
<i class="las la-video"></i><span data-translate="video-source"> Video Source </span>
<select id="videoSource" ></select>
<span id="gear_webcam" style="display: inline-block;" onclick="toggle(document.getElementById('videoSettings'));">
<span id="gear_webcam" style="display: inline-block; cursor:pointer;" onclick="toggle(document.getElementById('videoSettings'));">
&nbsp;&nbsp;
<i class="las la-sliders-h" style="font-size: 140%; vertical-align: middle;" aria-hidden="true"></i>
<i class="las la-cog" style="font-size: 140%; vertical-align: middle;" aria-hidden="true"></i>
</span>
</span>
<br />
@ -265,7 +296,7 @@
<div class="audioTitle">
<i class="las la-microphone-alt"></i><span data-translate="select-audio-source"> Audio Source(s) </span>
<i id='chevarrow1' class="chevron bottom" aria-hidden="true"></i>
<div class="meter" id="meter1"></div>
<div class="meter" id="meter1"></div><div class="meter2" id="meter2"></div>
</div>
</a>
<ul id="audioSource" class="multiselect-contents" >
@ -312,7 +343,7 @@
</button>
<span id="gear_screen" style="display: inline-block; cursor: pointer;" onclick="toggle(document.getElementById('videoSettings2'));">
&nbsp;&nbsp;
<i class="las la-sliders-h" style="font-size: 170%; vertical-align: middle;" aria-hidden="true"></i>
<i class="las la-cog" style="font-size: 170%; vertical-align: middle;" aria-hidden="true"></i>
</span>
<center>
<span id="videoSettings2" style="margin: auto auto; display: none; background-color: white; vertical-aligh: middle; border: 3px solid #ccc; max-width: 500px; padding: 10px 10px 5px 10px; margin: 10px 0 5px 0;">
@ -518,7 +549,7 @@
</div>
<div id="container-7" class="column columnfade pointer card advanced" style=" overflow-y: auto;" onclick="window.location = 'https://s10.fun/speedtest';">
<div id="container-7" class="column columnfade pointer card advanced" style=" overflow-y: auto;" onclick="window.location = './speedtest';">
<h2><span data-translate="run-a-speed-test">Run a Speed Test</span></h2>
<i style="margin-top:30px;font-size:600%;overflow:hidden;" <i class="las la-tachometer-alt"></i>
</div>
@ -543,7 +574,7 @@
<br />
<li>Youtube video
<i class="lab la-youtube"></i>
<a href="https://www.youtube.com/watch?v=6R_sQKxFAhg">Demoing it here</a>
<a href="https://www.youtube.com/watch?v=vLpRzMjUDaE&list=PLWodc2tCfAH1WHjl4WAOOoRSscJ8CHACe&index=2">Demoing it here</a>
</li>
<br />
<i>
@ -558,14 +589,14 @@
<li>If you have <a href="https://github.com/steveseguin/obsninja/wiki/FAQ#video-is-pixelated">"pixel smearing"</a> or corrupted video, try adding <b>&codec=vp9</b> or &codec=h264 to the OBS view link. Using Wi-Fi will make the issue worse.
</li>
<li>
iOS devices may have occasional audio or camera issues, such as no sound. Fully close Safari and reopen it if nothing else seems to work.
iOS devices may have occasional audio or camera issues, such as no sound or distorted sound. <a href="https://bugs.webkit.org/show_bug.cgi?id=218762">Partially fixed in iOS 14.3</a>
</li>
<li>
The VP9 codec on Chromium-based browsers seems to lag when screen-sharing at the moment. Use the OBS Virtual Camera as a capture source instead.
</li>
<br />
🎈 Site Updated: <a href="https://www.reddit.com/r/OBSNinja/comments/k02enh/version_134_of_obsninja_released_change_log_here/">November 27th, 2020</a>. The previous version can be found at
🎈 Site Updated: <a href="https://www.reddit.com/r/OBSNinja/comments/k02enh/version_134_of_obsninja_released_change_log_here/">Dec 6th, 2020</a>. The previous version can be found at
<a href="https://obs.ninja/v12/">https://obs.ninja/v12/</a> if you are having new issues.
<br />
@ -600,34 +631,38 @@
<span id="electronDragZone" style="pointer-events: none; z-index:-10; position:absolute;top:0;left:0;width:100%;height:5%;-webkit-app-region: drag;min-height:33px;"></span>
<div id="gridlayout" ></div>
<div id="overlayMsgs" onclick="function(e){e.target.innerHTML = '';}" style="display:none"></div>
<div id="bigPlayButton" onclick="function(e){e.target.innerHTML = '';}" style="display:none"></div>
<div id="controls_blank" style="display: none;">
<div class="controlsGrid">
<button data-action-type="addToScene" data-value="0" title="Add this Video to any remote '&scene=1'" onclick="directEnable(this, event);">
<i class="las la-plus-square"></i>
<span data-translate="add-to-scene">Add to Scene</span>
</button>
<button data-action-type="forward" data-value="0" title="Forward user to another room. They can always return." onclick="directMigrate(this, event);">
<i class="las la-paper-plane"></i>
<span data-translate="forward-to-room">Transfer</span>
</button>
<button data-action-type="direct-chat" title="Send Direct Message" onclick="directorSendMessage(this);">
<span data-translate="send-direct-chat"><i class="las la-envelope"></i> Message</span>
</button>
<button data-action-type="recorder" title="Start Recording this stream. *experimental*' views" onclick="recordVideo(this, event)">
<i class="las la-circle"></i>
<span data-translate="record"> Record</span>
<button data-action-type="addToScene" style="grid-column: 1;" data-value="0" title="Add this Video to any remote '&scene=1'" onclick="directEnable(this, event);">
<i class="las la-plus-square"></i>
<span data-translate="add-to-scene">Add to Scene</span>
</button>
<button data-action-type="hangup" data-value="0" title="Force the user to Disconnect. They can always reconnect." onclick="directHangup(this, event);">
<i class="las la-sign-out-alt"></i>
<span data-translate="disconnect-guest" >Hangup</span>
</button>
<input data-action-type="volume" class="slider" type="range" min="1" max="100" value="100" title="Change this Audio's volume in all remote '&scene' views" onclick="directVolume(this);" style="grid-column: 1; margin:5px; width: 93%; position: relative; top: 0px; background-color:#fff0;"/>
<button data-action-type="mute" style="grid-column: 2;" title="Remotely Mute this Audio in all remote '&scene' views" onclick="directMute(this, event);">
<button data-action-type="mute-scene" style="grid-column: 2;" title="Remotely Mute this Audio in all remote '&scene' views" onclick="directMute(this, event);">
<i class="las la-volume-off"></i>
<span data-translate="mute" >Mute in Scenes</span>
<span data-translate="mute-scene" >mute in scene</span>
</button>
<input data-action-type="volume" class="slider" type="range" min="1" max="100" value="100" title="Remotely change the volume of this guest" onclick="remoteVolume(this);" style="grid-column: 1; margin:5px; width: 93%; position: relative; top: 0px; background-color:#fff0;"/>
<button data-action-type="mute-guest" style="grid-column: 2;" title="Mute this guest everywhere" onclick="remoteMute(this, event);">
<i class="las la-volume-off"></i>
<span data-translate="mute-guest" >mute guest</span>
</button>
<span>
<button style="width: 36px" data-action-type="change-quality" title="Disable Video Preview" onclick="toggleQualityDirector(0, this.dataset.UUID, this);">
<span data-translate="change-to-low-quality">&nbsp;&nbsp;<i class="las la-video-slash"></i></span>
@ -639,25 +674,36 @@
<span data-translate="change-to-high-quality">&nbsp;&nbsp;<i class="las la-binoculars"></i></span>
</button>
</span>
<button data-action-type="direct-chat" title="Send Direct Message" onclick="directorSendMessage(this);">
<span data-translate="send-direct-chat"><i class="las la-envelope"></i> Message</span>
<button data-action-type="hangup" data-value="0" title="Force the user to Disconnect. They can always reconnect." onclick="directHangup(this, event);">
<i class="las la-sign-out-alt"></i>
<span data-translate="disconnect-guest" >Hangup</span>
</button>
<button data-action-type="recorder" title="Start Recording this stream. *experimental*' views" onclick="recordVideo(this, event)">
<i class="las la-circle"></i>
<span data-translate="record"> Record</span>
</button>
<button data-action-type="advanced-camera-settings" title="Advanced Settings and Remote Control" onclick="directorSendMessage(this);">
<span data-translate="advanced-camera-settings"><i class="las la-sliders-h"></i> Advanced</span>
<button data-action-type="advanced-camera-settings" title="Advanced Settings and Remote Control" onclick="directorAdvanced(this);">
<span data-translate="advanced-camera-settings"><i class="las la-cog"></i> Advanced</span>
</button>
<button data-action-type="voice-chat" title="Toggle Voice Chat with this Guest" onclick="directorSendMessage(this);">
<button data-action-type="voice-chat" title="Toggle Voice Chat with this Guest"">
<span data-translate="voice-chat"><i class="las la-microphone"></i> Voice Chat</span>
</button>
</div>
</div>
<div id="popupSelector" style="display:none;">
<span id="videoMenu3" class="videoMenu">
<i class="las la-video"></i><span data-translate="video-source"> Video Source </span>
<select id="videoSource3" ></select>
<select id="videoSource3" ></select>
<span id="refreshVideoButton" title="Activate or Reload this video device."><i style="top: 2px; cursor: pointer; position: relative; left: 10px;" class="las la-sync-alt"></i></span>
</span>
<br />
<br />
@ -684,9 +730,9 @@
<button id="shareScreenGear" style="width: 135px; padding:20px;text-align:center;" onclick="grabScreen()"><b>Share Screen</b><br /><i style="padding:5px; font-size:300%;" class="las la-desktop"></i></button><br />
<button onclick="toggleSettings()" style="width: 135px; background-color:#EFEFEF;padding:10px 12px 12px 2px;margin: 10px 0px 20px 0"><i class="chevron right" style="font-size:150%;top:3px;position:relative;"></i> <b>Close Settings</b></button>
<button id='advancedOptionsCamera' onclick="this.style.display = 'none'; toggle(getById('popupSelector_constraints_video'),false,false); getById('popupSelector_constraints_loading').style.visibility='visible';" style="display:none; background-color:#EFEFEF;padding:10px 12px 12px 2px;margin: 10px 0px 0px 10px"><i class="chevron bottom" style="font-size:150%;top:3px;position:relative;"></i> <b>Advanced Video</b></button>
<button id='advancedOptionsCamera' onclick="this.classList.toggle('highlight');toggle(getById('popupSelector_constraints_video'),false,false); getById('popupSelector_constraints_loading').style.visibility='visible';" class="advancedToggle"><i class="las la-sliders-h" style="font-size:150%;top:3px;position:relative;"></i> <b>Advanced Video</b></button>
<button id='advancedOptionsAudio' onclick="this.style.display = 'none'; toggle(getById('popupSelector_constraints_audio'),false,false); getById('popupSelector_constraints_loading').style.visibility='visible';" style="display:none; background-color:#EFEFEF;padding:10px 12px 12px 2px;margin: 10px 0px 0px 10px"><i class="chevron bottom" style="font-size:150%;top:3px;position:relative;"></i> <b>Advanced Audio</b></button>
<button id='advancedOptionsAudio' onclick="this.classList.toggle('highlight');toggle(getById('popupSelector_constraints_audio'),false,false); getById('popupSelector_constraints_loading').style.visibility='visible';" class="advancedToggle"><i class="las la-sliders-h" style="font-size:150%;top:3px;position:relative;"></i> <b>Advanced Audio</b></button>
<span id="popupSelector_constraints_audio" class="popupSelector_constraints" style="display: none;">
@ -720,7 +766,7 @@
<div id="roomTemplate" style="display:none;">
<div class='directorContainer half'>
<button class="grey" data-translate="click-for-quick-room-overview" onclick="toggle(getById('roomnotes2'),this,false);"><i class="las la-question-circle"></i> Click Here for a quick overview and help</button>
<span id="miniPerformer"><button id="press2talk" class="grey" onclick="press2talk();"><i class="las la-headset"></i><span data-translate="push-to-talk-enable"> Enable Director's Push-to-Talk Mode</span></button></span>
<span id="miniPerformer"><button id="press2talk" class="grey" onclick="press2talk();" title="You can also enable the director's Video Output from here"><i class="las la-headset"></i><span data-translate="push-to-talk-enable"> Enable Director's Push-to-Talk Mode</span></button></span>
</div>
<div id='roomnotes2' style='max-width:1200px;display:none;padding:0 0 0 10px;' >
@ -761,7 +807,7 @@
</div>
<div id="chatModule" style="display:none;text-align:right">
<a target="popup" style="cursor:pointer;text-align:right;color:#a3b7e9;" onclick="createPopoutChat();"><i class="las la-external-link-alt"></i></a>
<a target="popup" id="popOutChat" style="cursor:pointer;text-align:right;color:#B3C7F9;" onclick="createPopoutChat();"><i class="las la-external-link-alt"></i></a>
<div id="chatBody">
<div class="inMessage" data-translate='welcome-to-obs-ninja-chat'>
Welcome to OBS.Ninja! You can send text messages directly to connected peers from here.
@ -826,7 +872,7 @@
}
var session = WebRTC.Media; // session is a required global variable if configuring manually. Run before loading main.js but after webrtc.js.
session.version = "13.5b";
session.version = "14.0b";
session.streamID = session.generateStreamID(); // randomly generates a streamID for this session. You can set your own programmatically if needed
session.defaultPassword = "someEncryptionKey123"; // Disabling improves compatibility and is helpful for debugging.
@ -890,7 +936,8 @@
// If you wish to change branding, blank offers a good clean start.
<script type="text/javascript" id="main-js" src="./main.js" data-translation="blank"></script>
-->
<script type="text/javascript" crossorigin="anonymous" id="main-js" src="./main.js?ver=87"></script>
<script type="text/javascript" crossorigin="anonymous" id="mixer-js" src="./mixer.js?ver=2"></script>
<script type="text/javascript" crossorigin="anonymous" id="main-js" src="./main.js?ver=93"></script>
<script type="text/javascript" crossorigin="anonymous" src="./animations.js?ver=13"></script>
</body>
</html>

View File

@ -16,12 +16,41 @@
border: 0;
}
table {
display: inline-block;
padding:10px;
margin:10px;
}
#bigPlayButton {
margin:0 auto;
background-color: #0000;
color: white;
font-family: Cousine, monospace;
font-size: 4em;
line-height: 1.5em;
letter-spacing: 0.0em;
text-shadow: 0.05em 0.05em 0px rgba(0,0,0,1);
width:100%;
height:100vh;
z-index: 1;
vertical-align: top;
text-align: center;
top: 0;
position: fixed;
overflow-wrap: anywhere;
padding:3%;
pointer-events: none
}
#playButton {
font-size: 50vh;
font-size: min(50vw, 50vh);
cursor:pointer;
opacity:30%;
margin-top: 20vh;
}
tr {
padding:4px;
@ -35,7 +64,14 @@ th {
width: 0px;
height: 10px;
background: green;
transition: all 52ms linear;
transition: all 100ms linear;
}
.meter2 {
display: inline-block;
width: 0px;
height: 10px;
background: yellow;
transition: all 50ms linear;
}
#mynetwork {
@ -455,10 +491,6 @@ body {
height: 100%;
width: 100%;
background-color: var(--background-color);
background-color: -webkit-linear-gradient(to top, #181925, #141826, #0F2027);
/* Chrome 10-25, Safari 5.1-6 */
background-color: linear-gradient(to top, #181825, #141926, #0F2027);
/* W3C, IE 10+/ Edge, Firefox 16+, Chrome 26+, Opera 12+, Safari 7+ */
font-family: Helvetica, Arial, sans-serif;
display: flex;
flex-flow: column;
@ -538,6 +570,17 @@ body {
-webkit-app-region: no-drag;
}
.advancedToggle {
display:none;
background-color:#EFEFEF;
padding:10px 12px 12px 2px;
margin: 10px 0px 0px 10px;
}
.highlight {
background-color:#ddeeff;
}
/*https://css-tricks.com/styling-cross-browser-compatible-range-inputs-css/*/
input[type=range] {
-webkit-appearance: none;
@ -651,7 +694,14 @@ input[type=range]:focus::-ms-fill-upper {
}
}
@media screen and (max-width: 768px) {
#popOutChat{
display: none;
}
}
@media only screen and (max-width: 650px) {
.mainmenuclass {
display: inline-block;
}
@ -987,6 +1037,7 @@ img {
margin: 5px;
pointer-events: auto;
}
.rotate225 {
transform: rotate(135deg);
position: relative;
@ -1192,7 +1243,22 @@ img {
position: absolute;
}
.holder {
position: relative;
width: 100%;
height: 100%;
max-width: 100%;
max-height: 100%;
margin: auto;
object-fit: contain;
display: flex;
align-items: center;
justify-content: center;
pointer-events: none;
}
video {
pointer-events: auto;
background-color: transparent !important;
border: 0;
margin: 0;
@ -1400,6 +1466,7 @@ video.clean::-webkit-media-controls-timeline-container {
vertical-align: middle;
padding: 3px;
font-size: 93%;
max-width: 370px;
}
#outputSource {
background-color: #FFF;
@ -1896,4 +1963,16 @@ span#guestTips {
#guestTips > span > span {
line-height: 2.5em;
vertical-align: bottom;
}
.video-label {
position: absolute;
bottom: max(5px,0.6em);
left: max(5px,0.5em);
margin: 0px;
color: white;
padding: 5px 10px;
background: rgba(0, 0, 0, .5);
pointer-events:none;
font-size: min(4vh,2em);
}

1023
main.js

File diff suppressed because it is too large Load Diff

View File

@ -9,7 +9,7 @@
<link rel="stylesheet" href="./main.css?ver=22" />
<style>
#chatModule{
bottom: 1px;
bottom: 0px;
position: fixed;
align-self: center;
width: 100%;
@ -23,6 +23,19 @@
margin-left: 10px;
padding: 3px;
}
#chatBody {
z-index: 12;
background-color: #0000;
width: 100%;
border-radius: 5px;
padding: 1px 7px;
overflow-y: scroll;
overflow-wrap: anywhere;
max-height: 800px;
}
body{
background-color:#EEE;
}
</style>
</head>
<body>
@ -36,7 +49,7 @@
</div>
</div>
<input id="chatInput" placeholder="Enter chat message to send here" onkeypress="EnterButtonChat(event)" />
<button style="width:60px;background-color:#EEE;" onclick="sendChatMessage()" data-translate='send-chat'>Send</button>
<button style="width:60px;background-color:#ACA;" onclick="sendChatMessage()" data-translate='send-chat'>Send</button>
</div>
<script>

View File

@ -315,12 +315,23 @@ var CodecsHandler = (function() {
// Please see https://tools.ietf.org/html/rfc7587 for more details on OPUS settings
if (typeof params.minptime != 'undefined') { // max packet size in milliseconds
if (params.minptime != false) {
appendOpusNext += ';minptime:' + params.minptime; // 3, 5, 10, 20, 40, 60 and the default is 120. (20 is minimum recommended for webrtc)
}
}
if (typeof params.maxptime != 'undefined') { // max packet size in milliseconds
appendOpusNext += ';maxptime:' + params.maxptime; // 3, 5, 10, 20, 40, 60 and the default is 120. (20 is minimum recommended for webrtc)
if (params.maxptime != false) {
appendOpusNext += ';maxptime:' + params.maxptime; // 3, 5, 10, 20, 40, 60 and the default is 120. (20 is minimum recommended for webrtc)
}
}
if (typeof params.ptime != 'undefined') { // packet size; webrtc doesn't support less than 10 or 20 I think.
appendOpusNext += ';ptime:' + params.ptime;
if (params.ptime != false) {
appendOpusNext += ';ptime:' + params.ptime;
}
}
if (typeof params.stereo != 'undefined'){
@ -346,9 +357,9 @@ var CodecsHandler = (function() {
appendOpusNext += ';cbr=' + params.cbr; // default is 0 (vbr)
}
//if (typeof params.useinbandfec != 'undefined') { // useful for handling packet loss
// appendOpusNext += '; useinbandfec=' + params.useinbandfec; // Defaults to 0
//}
if (typeof params.useinbandfec != 'undefined') { // useful for handling packet loss
appendOpusNext += ';useinbandfec=' + params.useinbandfec; // Defaults to 0
}
if (typeof params.usedtx != 'undefined') { // Default is 0
appendOpusNext += ';usedtx=' + params.usedtx; // if decoder prefers the use of DTX.

View File

@ -107,7 +107,16 @@
"names-and-labels-coming-soon": "\n\t\t\t\t\tNames identifying connected peers will be a feature in an upcoming release.\n\t\t\t\t",
"send-chat": "Send",
"available-languages": "Available Languages:",
"add-more-here": "Add More Here!"
"add-more-here": "Add More Here!",
"waiting-for-camera-to-load":"waiting-for-camera-to-load",
"start": "START",
"share-your-mic": "Share your microphone",
"share-your-camera": "Share your Camera",
"share-your-screen": "Share your Screen",
"join-room-with-mic": "Join room with Microphone",
"share-screen-with-room": "Share-screen with Room",
"join-room-with-camera": "Join room with Camera",
"click-start-to-join": "Click Start to Join"
},
"placeholders": {
"join-by-room-name-here": "Join by Room Name here",

View File

@ -1,41 +1,41 @@
{
"titles": {
"toggle-the-chat": "Toggle the Chat",
"mute-the-speaker": "Mute the Speaker",
"mute-the-mic": "Mute the Mic",
"disable-the-camera": "Disable the Camera",
"settings": "Settings",
"hangup-the-call": "Hangup the Call",
"show-help-info": "Show Help Info",
"language-options": "Language Options",
"tip-hold-ctrl-command-to-select-multiple": "tip: Hold CTRL (command) to select Multiple",
"ideal-for-1080p60-gaming-if-your-computer-and-upload-are-up-for-it": "Ideal for 1080p60 gaming, if your computer and upload are up for it",
"better-video-compression-and-quality-at-the-cost-of-increased-cpu-encoding-load": "Better video compression and quality at the cost of increased CPU encoding load",
"disable-digital-audio-effects-and-increase-audio-bitrate": "Disable digital audio-effects and increase audio bitrate",
"the-guest-will-not-have-a-choice-over-audio-options": "The guest will not have a choice over audio-options",
"toggle-the-chat": "Vypnout/zapnout chat",
"mute-the-speaker": "Vypnout mikrofon mluvčího",
"mute-the-mic": "Vypnout mikrofon",
"disable-the-camera": "Vypnout kameru",
"settings": "Nastavení",
"hangup-the-call": "Zavěsit hovor",
"show-help-info": "Zobrazit menu pomoci",
"language-options": "Jazyková nastavení",
"tip-hold-ctrl-command-to-select-multiple": "tip: Podržte Ctrl (command), abyste vybrali více najednou",
"ideal-for-1080p60-gaming-if-your-computer-and-upload-are-up-for-it": "Ideální pro 1080p60 gaming, pokud vám na to vystačí prostředky počítače",
"better-video-compression-and-quality-at-the-cost-of-increased-cpu-encoding-load": "Lepší komprese videa a kvalita za cenu vyšší zátěže procesoru",
"disable-digital-audio-effects-and-increase-audio-bitrate": "Zakázat digitální zvukové efekty a zvýšit přenosovou rychlost zvuku",
"the-guest-will-not-have-a-choice-over-audio-options": "Host nebude mít na výběr z možností zvuku",
"the-guest-will-only-be-able-to-select-their-webcam-as-an-option": "The guest will only be able to select their webcam as an option",
"hold-ctrl-and-the-mouse-wheel-to-zoom-in-and-out-remotely-of-compatible-video-streams": "Hold CTRL and the mouse wheel to zoom in and out remotely of compatible video streams",
"add-a-password-to-make-the-stream-inaccessible-to-those-without-the-password": "Add a password to make the stream inaccessible to those without the password",
"add-the-guest-to-a-group-chat-room-it-will-be-created-automatically-if-needed-": "Add the guest to a group-chat room; it will be created automatically if needed.",
"customize-the-room-settings-for-this-guest": "Customize the room settings for this guest",
"hold-ctrl-or-cmd-to-select-multiple-files": "Hold CTRL (or CMD) to select multiple files",
"enter-an-https-url": "Enter an HTTPS URL",
"hold-ctrl-and-the-mouse-wheel-to-zoom-in-and-out-remotely-of-compatible-video-streams": "Podržte CTRL a kolečko myši pro vzdálené přiblížení a oddálení kompatibilních video streamů",
"add-a-password-to-make-the-stream-inaccessible-to-those-without-the-password": "Přidejte heslo, aby nebyl stream přístupný pro ty, kteří nemají heslo",
"add-the-guest-to-a-group-chat-room-it-will-be-created-automatically-if-needed-": "Přidejte hosta do skupinové chatovací místnosti; v případě potřeby se vytvoří automaticky.",
"customize-the-room-settings-for-this-guest": "Upravte nastavení místnosti pro tohoto hosta",
"hold-ctrl-or-cmd-to-select-multiple-files": "Podržením klávesy CTRL (nebo CMD) vyberte více souborů",
"enter-an-https-url": "Zadejte URL s HTTPS",
"lucy-g": "Lucy G",
"flaticon": "Flaticon",
"creative-commons-by-3-0": "Creative Commons BY 3.0",
"gregor-cresnar": "Gregor Cresnar",
"add-this-video-to-any-remote-scene-1-": "Add this Video to any remote '&scene=1'",
"forward-user-to-another-room-they-can-always-return-": "Forward user to another room. They can always return.",
"start-recording-this-stream-experimental-views": "Start Recording this stream. *experimental*' views",
"force-the-user-to-disconnect-they-can-always-reconnect-": "Force the user to Disconnect. They can always reconnect.",
"change-this-audio-s-volume-in-all-remote-scene-views": "Change this Audio's volume in all remote '&scene' views",
"remotely-mute-this-audio-in-all-remote-scene-views": "Remotely Mute this Audio in all remote '&scene' views",
"disable-video-preview": "Disable Video Preview",
"low-quality-preview": "Low-Quality Preview",
"high-quality-preview": "High-Quality Preview",
"send-direct-message": "Send Direct Message",
"advanced-settings-and-remote-control": "Advanced Settings and Remote Control",
"toggle-voice-chat-with-this-guest": "Toggle Voice Chat with this Guest"
"add-this-video-to-any-remote-scene-1-": "Přidejte toto video k jakémukoliv cílovému rozhraní '&scene=1'",
"forward-user-to-another-room-they-can-always-return-": "Přesměrujte uživatele na jiný room. Uživatel se může kdykoliv vrátit.",
"start-recording-this-stream-experimental-views": "Začít nahrávat tento stream. *experimentální*'",
"force-the-user-to-disconnect-they-can-always-reconnect-": "Odpojit tohoto uživatele. Uživatel se může kdykoliv připojit zpět.",
"change-this-audio-s-volume-in-all-remote-scene-views": "Změnit toto audio ve všech cílových '&scene' pohledech.",
"remotely-mute-this-audio-in-all-remote-scene-views": "Vzdáleně zlumit toto audio ve všech cílových '&scene' pohledech.",
"disable-video-preview": "Vypnout náhled videa",
"low-quality-preview": "Náhled videa v nízké kvalitě",
"high-quality-preview": "Náhled videa ve vysoké kvalitě",
"send-direct-message": "Poslat přímou zprávu",
"advanced-settings-and-remote-control": "Pokročilá nastavení a vzálené ovládání",
"toggle-voice-chat-with-this-guest": "Vypnout/zapnout voice chat tohoto hosta "
},
"innerHTML": {
"logo-header": "<font id=\"qos\" style=\"color: white;\">O</font>BS.Ninja ",
@ -56,7 +56,7 @@
"video-source": "Video zdroj",
"max-resolution": "MAX rozlišení",
"balanced": "Vyrovnaný",
"smooth-cool": "Super and Cool",
"smooth-cool": "Super a Cool",
"select-audio-source": "Zvolit zdroj Audia",
"no-audio": "Žádné Audio",
"select-output-source": " Audio výstup: \n\t\t\t\t\t",
@ -72,7 +72,7 @@
"force-vp9-video-codec": "Vynutit VP9 Video Codec (méně artefaktů)",
"enable-stereo-and-pro": "Povolit Stereo a Pro HD Audio",
"video-resolution": "Rozlišení videa: ",
"hide-mic-selection": "Force Default Microphone",
"hide-mic-selection": "Vynutit výchozí mikrofon",
"hide-screen-share": "Nezobrazovat možnost sdílet obrazovku",
"allow-remote-control": "Vzdálené ovládání přiblížení (android)",
"add-a-password-to-stream": " Přidat heslo:",
@ -81,10 +81,10 @@
"can-see-and-hear": "Slyšet a vidět ostatní členy",
"can-hear-only": "Pouze slyšet ostatní členy",
"cant-see-or-hear": "Neslyšet ani nevidět ostatní členy",
"share-local-video-file": "Stream Media File",
"share-website-iframe": "Share Website",
"run-a-speed-test": "Run a Speed Test",
"read-the-guides": "Browse the Guides",
"share-local-video-file": "Streamovat mediální soubor",
"share-website-iframe": "Sdílet webovou stránku",
"run-a-speed-test": "Zapnout speed test",
"read-the-guides": "Procházejte průvodce",
"info-blob": "\n\t\t\t\t\t\t<h2>Co je OBS.Ninja</h2><br>\n\t\t\t\t\t\t<li>100% <b>zdarma</b>; bez stahování; žádné osobní data; bez přihlašování</li>\n\t\t\t\t\t\t<li>Sdílejte video ze smartphonu, laptopu, počítače či svých kamarádů přímo do OBSka</li>\n\t\t\t\t\t\t<li>Používáme nejmodernější Peer-to-Peer forwarding technologii, která zaručuje bezpečnost a minimální lag</li>\n\t\t\t\t\t\t<br>\n\t\t\t\t\t\t<li>Youtube video <i class=\"fa fa-youtube-play\" aria-hidden=\"true\"></i> <a href=\"https://www.youtube.com/watch?v=6R_sQKxFAhg\">Demo</a> </li>\n\t\t\t\t\t\t<li>Open-source kód je dostupný zde: <i class=\"fa fa-github\" aria-hidden=\"true\"></i> <a href=\"https://github.com/steveseguin/obsninja\">https://github.com/steveseguin/obsninja</a> </li>\n\t\t\t\t\t\t<br>\n\t\t\t\t\t\t<i><font style=\"color:red\">Známé problémy:</font></i><br>\n\n\t\t\t\t\t\t<li><i class=\"fa fa-apple\" aria-hidden=\"true\"></i> Uživatelé MacOS musí používat OBS v23 nebo pozdější pro spřávné zachyceení <i>okna</i> prohlížeč Chrome s OBS v25</li>\n\t\t\t\t\t\t<li>Pokud máte problémy s \"pixelací\" videa. Prosím přidejte URL parameter <b>&amp;codec=vp9</b> do OBS Linku pro nápravu.</li>\n\t<h3><i>Koukněte na <a href=\"https://www.reddit.com/r/OBSNinja/\">sub-reddit</a> <i class=\"fa fa-reddit-alien\" aria-hidden=\"true\"></i> for pomoc a návody. Jsem také na <a href=\"https://discord.gg/EksyhGA\">Discord</a> a můžete mi psát na steve@seguin.email. Přeložil do CZ: <a href=\"http://karelvitek.cz\">Karel Vítek</a></i></h3>\n\t\t\t\t\t",
"add-to-scene": "Add to Scene",
"forward-to-room": "Transfer",
@ -94,28 +94,37 @@
"change-to-low-quality": "&nbsp;&nbsp;<i class=\"las la-video-slash\"></i>",
"change-to-medium-quality": "&nbsp;&nbsp;<i class=\"las la-video\"></i>",
"change-to-high-quality": "&nbsp;&nbsp;<i class=\"las la-binoculars\"></i>",
"send-direct-chat": "<i class=\"las la-envelope\"></i> Message",
"advanced-camera-settings": "<i class=\"las la-cog\"></i> Advanced",
"send-direct-chat": "<i class=\"las la-envelope\"></i> Chatovat",
"advanced-camera-settings": "<i class=\"las la-cog\"></i> Pokročilé",
"voice-chat": "<i class=\"las la-microphone\"></i> Voice Chat",
"open-in-new-tab": "Otevřít v nové záložce",
"copy-to-clipboard": "Kopírovat do schránky",
"click-for-quick-room-overview": "❔ Klidni zde pro krátký přehled o funkcích",
"push-to-talk-enable": "🔊 Povolit administrátorovi Push-to-Talk mód",
"welcome-to-control-room": "Welcome. This is the control-room for the group-chat. There are different things you can use this room for:<br><br>\t<li>You can host a group chat with friends using a room. Share the blue link to invite guests who will join the chat automatically.</li>\t<li>A group room can handle around 4 to 30 guests, depending on numerous factors, including CPU and available bandwidth of all guests in the room.</li>\t<li>Solo-views of each video are offered under videos as they load. These can be used within an OBS Browser Source.</li>\t<li>You can use the auto-mixing Group Scene, the green link, to auto arrange multiple videos for you in OBS.</li>\t<li>You can use this control room to record isolated video or audio streams, but it is an experimental feature still.</li>\t<li>Videos in the Director's room will be of low quality on purpose; to save bandwidth/CPU</li>\t<li>Guest's in the room will see each other's videos at a very limited quality to conserve bandwidth/CPU.</li>\t<li>OBS will see a guest's video in high-quality; the default video bitrate is 2500kbps.</li>\t<br>\tAs guests join, their videos will appear below. You can bring their video streams into OBS as solo-scenes or you can add them to the Group Scene.\t<br>The Group Scene auto-mixes videos that have been added to the group scene. Please note that the Auto-Mixer requires guests be manually added to it for them to appear in it; they are not added automatically.<br><br>Apple mobile devices, such as iPhones and iPads, do not fully support Video Group Chat. This is a hardware constraint.<br><br>\tFor advanced options and parameters, <a href=\"https://github.com/steveseguin/obsninja/wiki/Guides-and-How-to's#urlparameters\">see the Wiki.</a>",
"more-than-four-can-join": "These four guest slots are just for demonstration. More than four guests can actually join a room.",
"more-than-four-can-join": "Tyto čtyři sloty pro hosty slouží pouze k předvedení. K místnosti se mohou skutečně připojit více než čtyři hosté.",
"welcome-to-obs-ninja-chat": "\n\t\t\t\t\tVítejte na OBS.Ninja! můžete ihned poslat zprávy ostatním členům této místnosti\n\t\t\t\t",
"names-and-labels-coming-soon": "\n\t\t\t\t\tJména členů bude jedna z budoucích funkcí OBS.ninja.\n\t\t\t\t",
"send-chat": "Poslat",
"available-languages": "Dostupné jazyky:",
"add-more-here": "Přidat další!"
"add-more-here": "Přidat další!",
"waiting-for-camera-to-load":"Čekám na načtení kamery",
"start": "START",
"share-your-mic": "Sdílet mikrofon",
"share-your-camera": "Sdílet kameru",
"share-your-screen": "Sdílet obrazovku",
"join-room-with-mic": "Připojit se s mikrofonem",
"share-screen-with-room": "Sdílet obrazovku s místností",
"join-room-with-camera": "Připojit se s kamerou",
"click-start-to-join": "Kliknutím na start se připojíte"
},
"placeholders": {
"join-by-room-name-here": "Join by Room Name here",
"enter-a-room-name-here": "Enter a Room Name here",
"optional-room-password-here": "Optional room password here",
"give-this-media-source-a-name-optional-": "Give this media source a name (optional)",
"add-an-optional-password": "Add an optional password",
"enter-room-name-here": "Enter Room name here",
"enter-chat-message-to-send-here": "Enter chat message to send here"
"join-by-room-name-here": "Připojit se s názvem místnosti zde",
"enter-a-room-name-here": "Sem zadejte název místnosti",
"optional-room-password-here": "Volitelné heslo místnosti zde",
"give-this-media-source-a-name-optional-": "Pojmenujte tento zdroj médií (volitelné)",
"add-an-optional-password": "Přidat volitelné heslo",
"enter-room-name-here": "Sem zadejte název místnosti",
"enter-chat-message-to-send-here": "Sem zadejte vaši zprávu"
}
}

View File

@ -107,7 +107,16 @@
"names-and-labels-coming-soon": "\n\t\t\t\t\tNames identifying connected peers will be a feature in an upcoming release.\n\t\t\t\t",
"send-chat": "Send",
"available-languages": "Available Languages:",
"add-more-here": "Add More Here!"
"add-more-here": "Add More Here!",
"waiting-for-camera-to-load":"waiting-for-camera-to-load",
"start": "START",
"share-your-mic": "Share your microphone",
"share-your-camera": "Share your Camera",
"share-your-screen": "Share your Screen",
"join-room-with-mic": "Join room with Microphone",
"share-screen-with-room": "Share-screen with Room",
"join-room-with-camera": "Join room with Camera",
"click-start-to-join": "Click Start to Join"
},
"placeholders": {
"join-by-room-name-here": "Join by Room Name here",

View File

@ -107,7 +107,16 @@
"names-and-labels-coming-soon": "\n\t\t\t\t\tNames identifying connected peers will be a feature in an upcoming release.\n\t\t\t\t",
"send-chat": "Send",
"available-languages": "Available Languages:",
"add-more-here": "Add More Here!"
"add-more-here": "Add More Here!",
"waiting-for-camera-to-load":"waiting-for-camera-to-load",
"start": "START",
"share-your-mic": "Share your microphone",
"share-your-camera": "Share your Camera",
"share-your-screen": "Share your Screen",
"join-room-with-mic": "Join room with Microphone",
"share-screen-with-room": "Share-screen with Room",
"join-room-with-camera": "Join room with Camera",
"click-start-to-join": "Click Start to Join"
},
"placeholders": {
"join-by-room-name-here": "Join by Room Name here",

View File

@ -107,7 +107,16 @@
"names-and-labels-coming-soon": "\n\t\t\t\t\tNombres identificando a los compañeros conectados serán una nueva característica en una próxima versión.\n\t\t\t\t",
"send-chat": "Enviar",
"available-languages": "Idiomas disponibles:",
"add-more-here": "¡Añade más aquí!"
"add-more-here": "¡Añade más aquí!",
"waiting-for-camera-to-load":"waiting-for-camera-to-load",
"start": "START",
"share-your-mic": "Share your microphone",
"share-your-camera": "Share your Camera",
"share-your-screen": "Share your Screen",
"join-room-with-mic": "Join room with Microphone",
"share-screen-with-room": "Share-screen with Room",
"join-room-with-camera": "Join room with Camera",
"click-start-to-join": "Click Start to Join"
},
"placeholders": {
"join-by-room-name-here": "Join by Room Name here",

View File

@ -1,41 +1,41 @@
{
"titles": {
"toggle-the-chat": "Toggle the Chat",
"mute-the-speaker": "Mute the Speaker",
"mute-the-mic": "Mute the Mic",
"disable-the-camera": "Disable the Camera",
"settings": "Settings",
"hangup-the-call": "Hangup the Call",
"show-help-info": "Show Help Info",
"language-options": "Language Options",
"tip-hold-ctrl-command-to-select-multiple": "tip: Hold CTRL (command) to select Multiple",
"ideal-for-1080p60-gaming-if-your-computer-and-upload-are-up-for-it": "Ideal for 1080p60 gaming, if your computer and upload are up for it",
"better-video-compression-and-quality-at-the-cost-of-increased-cpu-encoding-load": "Better video compression and quality at the cost of increased CPU encoding load",
"disable-digital-audio-effects-and-increase-audio-bitrate": "Disable digital audio-effects and increase audio bitrate",
"the-guest-will-not-have-a-choice-over-audio-options": "The guest will not have a choice over audio-options",
"the-guest-will-only-be-able-to-select-their-webcam-as-an-option": "The guest will only be able to select their webcam as an option",
"hold-ctrl-and-the-mouse-wheel-to-zoom-in-and-out-remotely-of-compatible-video-streams": "Hold CTRL and the mouse wheel to zoom in and out remotely of compatible video streams",
"add-a-password-to-make-the-stream-inaccessible-to-those-without-the-password": "Add a password to make the stream inaccessible to those without the password",
"add-the-guest-to-a-group-chat-room-it-will-be-created-automatically-if-needed-": "Add the guest to a group-chat room; it will be created automatically if needed.",
"customize-the-room-settings-for-this-guest": "Customize the room settings for this guest",
"hold-ctrl-or-cmd-to-select-multiple-files": "Hold CTRL (or CMD) to select multiple files",
"enter-an-https-url": "Enter an HTTPS URL",
"toggle-the-chat": "Réduire le tchat",
"mute-the-speaker": "Mettre le haut parleur en sourdine",
"mute-the-mic": "Mettre le micro en sourdine",
"disable-the-camera": "Désactiver la caméra",
"settings": "Paramètres",
"hangup-the-call": "Raccrocher",
"show-help-info": "Montrer l'aide",
"language-options": "Options de langue",
"tip-hold-ctrl-command-to-select-multiple": "conseil : Maintenir CTRL (ou command) pour sélectionner plusieurs",
"ideal-for-1080p60-gaming-if-your-computer-and-upload-are-up-for-it": "Idéal pour le format gaming 1080p60 si votre ordinateur le permet",
"better-video-compression-and-quality-at-the-cost-of-increased-cpu-encoding-load": "Meilleure compression et qualité vidéo en contrepartie d'un chargement d'encodage CPU plus long",
"disable-digital-audio-effects-and-increase-audio-bitrate": "Désactiver les effets audio et augmenter le débit audio",
"the-guest-will-not-have-a-choice-over-audio-options": "L'invité ne pourra pas modifier les paramètres audio",
"the-guest-will-only-be-able-to-select-their-webcam-as-an-option": "L'invité pourra uniquement modifier sa caméra",
"hold-ctrl-and-the-mouse-wheel-to-zoom-in-and-out-remotely-of-compatible-video-streams": "Maintenir CTRL (ou command) et rouler la molette de la souris pour effectuer un zoom avant et arrière à distance sur les flux vidéo compatibles",
"add-a-password-to-make-the-stream-inaccessible-to-those-without-the-password": "Ajouter un mot de passe pour que le flux vidéo ne soit pas accessible au personne n'ayant pas le mot de passe",
"add-the-guest-to-a-group-chat-room-it-will-be-created-automatically-if-needed-": "Ajouter l'invité à une salle de discussion en groupe; elle sera créée automatiquement si nécessaire.",
"customize-the-room-settings-for-this-guest": "Personnaliser les paramètres de la salle pour cet invité",
"hold-ctrl-or-cmd-to-select-multiple-files": "Maintenir CTRL (ou command) pour sélectionner plusieurs fichiers à la fois",
"enter-an-https-url": "Saisir une URL en HTTPS",
"lucy-g": "Lucy G",
"flaticon": "Flaticon",
"creative-commons-by-3-0": "Creative Commons BY 3.0",
"gregor-cresnar": "Gregor Cresnar",
"add-this-video-to-any-remote-scene-1-": "Add this Video to any remote '&scene=1'",
"forward-user-to-another-room-they-can-always-return-": "Forward user to another room. They can always return.",
"start-recording-this-stream-experimental-views": "Start Recording this stream. *experimental*' views",
"force-the-user-to-disconnect-they-can-always-reconnect-": "Force the user to Disconnect. They can always reconnect.",
"change-this-audio-s-volume-in-all-remote-scene-views": "Change this Audio's volume in all remote '&scene' views",
"remotely-mute-this-audio-in-all-remote-scene-views": "Remotely Mute this Audio in all remote '&scene' views",
"disable-video-preview": "Disable Video Preview",
"low-quality-preview": "Low-Quality Preview",
"high-quality-preview": "High-Quality Preview",
"send-direct-message": "Send Direct Message",
"advanced-settings-and-remote-control": "Advanced Settings and Remote Control",
"toggle-voice-chat-with-this-guest": "Toggle Voice Chat with this Guest"
"add-this-video-to-any-remote-scene-1-": "Ajouter cette vidéo à n'importe quel flux '&scene=1'",
"forward-user-to-another-room-they-can-always-return-": "Transférer l'utilisateur vers une autre salle. Il pourra toujours revenir par la suite.",
"start-recording-this-stream-experimental-views": "Commencer à enregistrer ce flux. *experimental*' views",
"force-the-user-to-disconnect-they-can-always-reconnect-": "Forcer la déconnexion de l'utilisateur. Il pourra toujours se reconnecter par la suite.",
"change-this-audio-s-volume-in-all-remote-scene-views": "Modifier le volume de l'audio sur l'ensemble des flux '&scene' views",
"remotely-mute-this-audio-in-all-remote-scene-views": "Mettre en sourdine l'audio sur l'ensemble des flux '&scene' views",
"disable-video-preview": "Désactiver l'aperçu vidéo",
"low-quality-preview": "Aperçu faible définition",
"high-quality-preview": "Aperçu haute définition",
"send-direct-message": "Envoyer un message direct",
"advanced-settings-and-remote-control": "Paramètres avancés et contrôle à distance",
"toggle-voice-chat-with-this-guest": "Basculer le tchat vocal pour cet utilisateur"
},
"innerHTML": {
"logo-header": "<font id=\"qos\" style=\"color: white;\">O</font>BS.Ninja ",
@ -45,24 +45,24 @@
"add-group-chat": "Conversation de groupe",
"rooms-allow-for": "Les salles permettent une conversation de groupe simplifiée et la gestion avancée de plusieurs flux à la fois.",
"room-name": "Nom de la salle",
"password-input-field": "Password",
"password-input-field": "Mot de passe",
"enter-the-rooms-control": "Entrez dans le centre de contrôle de la pièce",
"show-tips": "Montrez-moi quelques conseils ..",
"added-notes": "\n\t\t\t\t<u><i>Added Notes:</i></u>\n\t\t\t\t<li>N'importe qui peut entrer dans une pièce s'il connaît le nom, alors gardez-le unique</li>\n\t\t\t\t<li>Il n'est pas conseillé d'avoir plus de quatre (4) personnes dans une pièce pour des raisons de performances, mais cela dépend de votre matériel.</li>\n\t\t\t\t<li>Les appareils iOS sont limités à des groupes de deux (2) personnes maximum. Il s'agit d'une limitation matérielle.</li>\n\t\t\t\t\n\t\t\t\t",
"show-tips": "Montrez-moi quelques conseils ...",
"added-notes": "\n\t\t\t\t<u><i>Added Notes:</i></u>\n\t\t\t\t<li>N'importe qui peut entrer dans une pièce s'il en connaît le nom, alors gardez-le unique</li>\n\t\t\t\t<li>Il n'est pas conseillé d'avoir plus de quatre (4) personnes dans une pièce pour des raisons de performances, mais cela dépend de votre matériel.</li>\n\t\t\t\t<li>Les appareils iOS sont limités à des groupes de deux (2) personnes maximum. Il s'agit d'une limitation matérielle.</li>\n\t\t\t\t\n\t\t\t\t",
"back": "Retour",
"add-your-camera": "Ajoutez votre caméra à OBS",
"ask-for-permissions": "Allow Access to Camera/Microphone",
"waiting-for-camera": "Waiting for Camera to Load",
"ask-for-permissions": "Autoriser l'accès à la caméra / au micro",
"waiting-for-camera": "Chargement de la caméra",
"video-source": "Source vidéo",
"max-resolution": "Résolution max",
"max-resolution": "Résolution max.",
"balanced": "Équilibré",
"smooth-cool": "Lisse et frais",
"select-audio-source": "Sélectionnez les sources audio",
"select-audio-source": "Sélectionner la source audio : \n\t\t\t\t\t",
"no-audio": "Pas de son",
"select-output-source": " Audio Output Destination: \n\t\t\t\t\t",
"select-output-source": "Sélectionner la sortie audio ",
"remote-screenshare-obs": "Partage d'écran à distance dans OBS",
"note-share-audio": "\n\t\t\t\t\t<b>note</b>: N'oubliez pas de cliquer sur Partager l'audio dans Chrome.<br>(Firefox ne prend pas en charge le partage audio.)",
"select-screen-to-share": "CHOISIR L'ÉCRAN À PARTAGER",
"select-screen-to-share": "Choisir l'écran à partager",
"audio-sources": "Sources audio",
"create-reusable-invite": "Créer une invitation réutilisable",
"here-you-can-pre-generate": "Ici, vous pouvez pré-générer un lien de source de navigateur réutilisable et un lien d'invitation d'invité associé.",
@ -72,25 +72,25 @@
"force-vp9-video-codec": "Forcer le codec vidéo VP9",
"enable-stereo-and-pro": "Activer l'audio stéréo et Pro HD",
"video-resolution": "Video Resolution: ",
"hide-mic-selection": "Force Default Microphone",
"hide-screen-share": "Hide Screenshare Option",
"allow-remote-control": "Remote Control Camera Zoom (android)",
"add-a-password-to-stream": " Add a password:",
"add-the-guest-to-a-room": " Add the guest to a room:",
"invite-group-chat-type": "This room guest can:",
"can-see-and-hear": "Can see and hear the group chat",
"can-hear-only": "Can only hear the group chat",
"cant-see-or-hear": "Cannot hear or see the group chat",
"share-local-video-file": "Stream Media File",
"share-website-iframe": "Share Website",
"run-a-speed-test": "Run a Speed Test",
"read-the-guides": "Browse the Guides",
"hide-mic-selection": "Forcer l'utilisation du micro par défaut",
"hide-screen-share": "Masquer les options de partage d'écran",
"allow-remote-control": "Contrôle à distance du zoom de la caméra (android)",
"add-a-password-to-stream": " Ajouter un mot de passe:",
"add-the-guest-to-a-room": " Ajouter l'invité à une salle:",
"invite-group-chat-type": "Cet invité peut:",
"can-see-and-hear": "Peut voir et entendre le tchat de groupe",
"can-hear-only": "Peut seulement entendre le tchat de groupe",
"cant-see-or-hear": "Ne peut ni entendre ni voir le tchat de groupe",
"share-local-video-file": "Partager un fichier média",
"share-website-iframe": "Partager site internet",
"run-a-speed-test": "Exécuter un test de vitesse",
"read-the-guides": "Parcourir les guides",
"info-blob": "\n\t\t\t\t\t\t<h2>Qu'est-ce que OBS.Ninja</h2><br>\n\t\t\t\t\t\t<li>100% <b> gratuit </b>; aucun téléchargement; aucune collecte de données personnelles; pas de connexion</li>\n\t\t\t\t\t\t<li>Importez des vidéos de votre smartphone, ordinateur portable, ordinateur ou de vos amis directement dans votre flux vidéo OBS</li>\n\t\t\t\t\t\t<li>Nous utilisons une technologie de transfert Peer-to-Peer de pointe qui offre une confidentialité et une latence ultra-faible</li>\n\t\t\t\t\t\t<br>\n\t\t\t\t\t\t<li>Youtube video <i class=\"fa fa-youtube-play\" aria-hidden=\"true\"></i> <a href=\"https://www.youtube.com/watch?v=6R_sQKxFAhg\">Démonstration ici</a> </li>\n\t\t\t\t\t\t<li>Le code est disponible ici: <i class=\"fa fa-github\" aria-hidden=\"true\"></i> <a href=\"https://github.com/steveseguin/obsninja\">https://github.com/steveseguin/obsninja</a> </li>\n\t\t\t\t\t\t<h3>\n\t\t\t\t\t<i>Découvrez le <a href=\"https://www.reddit.com/r/OBSNinja/\">sub-reddit</a> <i class=\"fa fa-reddit-alien\" aria-hidden=\"true\"></i> pour de l'aide et des informations avancées.</i></h3>",
"add-to-scene": "Add to Scene",
"forward-to-room": "Transfer",
"record": "Record",
"disconnect-guest": "Hangup",
"mute": "Mute",
"add-to-scene": "Ajouter à la scène",
"forward-to-room": "Transférer",
"record": "Enregistrer",
"disconnect-guest": "Raccrocher",
"mute": "Mettre en sourdine",
"change-to-low-quality": "&nbsp;&nbsp;<i class=\"las la-video-slash\"></i>",
"change-to-medium-quality": "&nbsp;&nbsp;<i class=\"las la-video\"></i>",
"change-to-high-quality": "&nbsp;&nbsp;<i class=\"las la-binoculars\"></i>",
@ -99,23 +99,32 @@
"voice-chat": "<i class=\"las la-microphone\"></i> Voice Chat",
"open-in-new-tab": "Ouvrir dans un nouvel onglet",
"copy-to-clipboard": "Copier dans le presse-papier",
"click-for-quick-room-overview": "❔ Click Here for a quick overview and help",
"push-to-talk-enable": "🔊 Enable Director's Push-to-Talk Mode",
"click-for-quick-room-overview": "❔ Cliquez ici pour un aperçu rapide et de l'aide",
"push-to-talk-enable": "🔊 Permettre à l'administrateur d'utiliser le push-to-talk",
"welcome-to-control-room": "Welcome. This is the control-room for the group-chat. There are different things you can use this room for:<br><br>\t<li>You can host a group chat with friends using a room. Share the blue link to invite guests who will join the chat automatically.</li>\t<li>A group room can handle around 4 to 30 guests, depending on numerous factors, including CPU and available bandwidth of all guests in the room.</li>\t<li>Solo-views of each video are offered under videos as they load. These can be used within an OBS Browser Source.</li>\t<li>You can use the auto-mixing Group Scene, the green link, to auto arrange multiple videos for you in OBS.</li>\t<li>You can use this control room to record isolated video or audio streams, but it is an experimental feature still.</li>\t<li>Videos in the Director's room will be of low quality on purpose; to save bandwidth/CPU</li>\t<li>Guest's in the room will see each other's videos at a very limited quality to conserve bandwidth/CPU.</li>\t<li>OBS will see a guest's video in high-quality; the default video bitrate is 2500kbps.</li>\t<br>\tAs guests join, their videos will appear below. You can bring their video streams into OBS as solo-scenes or you can add them to the Group Scene.\t<br>The Group Scene auto-mixes videos that have been added to the group scene. Please note that the Auto-Mixer requires guests be manually added to it for them to appear in it; they are not added automatically.<br><br>Apple mobile devices, such as iPhones and iPads, do not fully support Video Group Chat. This is a hardware constraint.<br><br>\tFor advanced options and parameters, <a href=\"https://github.com/steveseguin/obsninja/wiki/Guides-and-How-to's#urlparameters\">see the Wiki.</a>",
"more-than-four-can-join": "These four guest slots are just for demonstration. More than four guests can actually join a room.",
"welcome-to-obs-ninja-chat": "\n\t\t\t\t\tWelcome to OBS.Ninja! You can send text messages directly to connected peers from here.\n\t\t\t\t",
"names-and-labels-coming-soon": "\n\t\t\t\t\tNames identifying connected peers will be a feature in an upcoming release.\n\t\t\t\t",
"send-chat": "Send",
"available-languages": "Available Languages:",
"add-more-here": "Add More Here!"
"available-languages": "Options de langues disponibles :",
"add-more-here": "Ajouter ici!",
"waiting-for-camera-to-load":"Chargement de votre caméra",
"start": "REJOINDRE",
"share-your-mic": "Partager votre micro",
"share-your-camera": "Partager votre caméra",
"share-your-screen": "Partager votre écran",
"join-room-with-mic": "Rejoindre la salle avec votre micro",
"share-screen-with-room": "Partager votre écran avec la salle",
"join-room-with-camera": "Rejoindre la salle avec votre caméra",
"click-start-to-join": "Appuyer sur rejoindre pour commencer"
},
"placeholders": {
"join-by-room-name-here": "Join by Room Name here",
"enter-a-room-name-here": "Enter a Room Name here",
"optional-room-password-here": "Optional room password here",
"give-this-media-source-a-name-optional-": "Give this media source a name (optional)",
"add-an-optional-password": "Add an optional password",
"enter-room-name-here": "Enter Room name here",
"enter-chat-message-to-send-here": "Enter chat message to send here"
"join-by-room-name-here": "Rejoindre via le nom de salle ici",
"enter-a-room-name-here": "Saisir un nom de salle ici",
"optional-room-password-here": "Mot de passe (optionnel) pour la salle ici",
"give-this-media-source-a-name-optional-": "Donner un nom à cette source média (optionnel)",
"add-an-optional-password": "Ajouter un mot de passe optionnel",
"enter-room-name-here": "Saisir le nom de la salle ici",
"enter-chat-message-to-send-here": "Saisir un message ici pour l'envoyer dans le tchat"
}
}

View File

@ -107,7 +107,16 @@
"names-and-labels-coming-soon": "\n\t\t\t\t\tI nomi che identificano i peer connessi saranno una funzionalità in una prossima versione..\n\t\t\t\t",
"send-chat": "Invia",
"available-languages": "Lingue Disponibili:",
"add-more-here": "Aggiungi altro qui!"
"add-more-here": "Aggiungi altro qui!",
"waiting-for-camera-to-load":"waiting-for-camera-to-load",
"start": "START",
"share-your-mic": "Share your microphone",
"share-your-camera": "Share your Camera",
"share-your-screen": "Share your Screen",
"join-room-with-mic": "Join room with Microphone",
"share-screen-with-room": "Share-screen with Room",
"join-room-with-camera": "Join room with Camera",
"click-start-to-join": "Click Start to Join"
},
"placeholders": {
"join-by-room-name-here": "Join by Room Name here",

View File

@ -107,7 +107,16 @@
"names-and-labels-coming-soon": "\n\t\t\t\t\tNames identifying connected peers will be a feature in an upcoming release.\n\t\t\t\t",
"send-chat": "Send",
"available-languages": "Available Languages:",
"add-more-here": "Add More Here!"
"add-more-here": "Add More Here!",
"waiting-for-camera-to-load":"waiting-for-camera-to-load",
"start": "START",
"share-your-mic": "Share your microphone",
"share-your-camera": "Share your Camera",
"share-your-screen": "Share your Screen",
"join-room-with-mic": "Join room with Microphone",
"share-screen-with-room": "Share-screen with Room",
"join-room-with-camera": "Join room with Camera",
"click-start-to-join": "Click Start to Join"
},
"placeholders": {
"join-by-room-name-here": "Join by Room Name here",

View File

@ -107,7 +107,16 @@
"names-and-labels-coming-soon": "\n\t\t\t\t\tNames identifying connected peers will be a feature in an upcoming release.\n\t\t\t\t",
"send-chat": "Send",
"available-languages": "Available Languages:",
"add-more-here": "Add More Here!"
"add-more-here": "Add More Here!",
"waiting-for-camera-to-load":"waiting-for-camera-to-load",
"start": "START",
"share-your-mic": "Share your microphone",
"share-your-camera": "Share your Camera",
"share-your-screen": "Share your Screen",
"join-room-with-mic": "Join room with Microphone",
"share-screen-with-room": "Share-screen with Room",
"join-room-with-camera": "Join room with Camera",
"click-start-to-join": "Click Start to Join"
},
"placeholders": {
"join-by-room-name-here": "Join by Room Name here",

View File

@ -107,7 +107,16 @@
"names-and-labels-coming-soon": "\n\t\t\t\t\tErehay ouyay ancay epray-enerategay.\n\t\t\t\t",
"send-chat": "Erehay ouyay ancay epray-enerategay",
"available-languages": "AErehay ouyay ancay epray-enerategay:",
"add-more-here": "AErehay ouyay ancay epray-enerategaye!"
"add-more-here": "AErehay ouyay ancay epray-enerategaye!",
"waiting-for-camera-to-load":"waiting-for-camera-to-load",
"start": "START",
"share-your-mic": "Share your microphone",
"share-your-camera": "Share your Camera",
"share-your-screen": "Share your Screen",
"join-room-with-mic": "Join room with Microphone",
"share-screen-with-room": "Share-screen with Room",
"join-room-with-camera": "Join room with Camera",
"click-start-to-join": "Click Start to Join"
},
"placeholders": {
"join-by-room-name-here": "Erehay ouyay ancay epray-enerategay",

View File

@ -1,41 +1,41 @@
{
"titles": {
"toggle-the-chat": "Toggle the Chat",
"mute-the-speaker": "Mute the Speaker",
"mute-the-mic": "Mute the Mic",
"disable-the-camera": "Disable the Camera",
"settings": "Settings",
"hangup-the-call": "Hangup the Call",
"show-help-info": "Show Help Info",
"language-options": "Language Options",
"tip-hold-ctrl-command-to-select-multiple": "tip: Hold CTRL (command) to select Multiple",
"ideal-for-1080p60-gaming-if-your-computer-and-upload-are-up-for-it": "Ideal for 1080p60 gaming, if your computer and upload are up for it",
"better-video-compression-and-quality-at-the-cost-of-increased-cpu-encoding-load": "Better video compression and quality at the cost of increased CPU encoding load",
"disable-digital-audio-effects-and-increase-audio-bitrate": "Disable digital audio-effects and increase audio bitrate",
"the-guest-will-not-have-a-choice-over-audio-options": "The guest will not have a choice over audio-options",
"the-guest-will-only-be-able-to-select-their-webcam-as-an-option": "The guest will only be able to select their webcam as an option",
"hold-ctrl-and-the-mouse-wheel-to-zoom-in-and-out-remotely-of-compatible-video-streams": "Hold CTRL and the mouse wheel to zoom in and out remotely of compatible video streams",
"add-a-password-to-make-the-stream-inaccessible-to-those-without-the-password": "Add a password to make the stream inaccessible to those without the password",
"add-the-guest-to-a-group-chat-room-it-will-be-created-automatically-if-needed-": "Add the guest to a group-chat room; it will be created automatically if needed.",
"customize-the-room-settings-for-this-guest": "Customize the room settings for this guest",
"hold-ctrl-or-cmd-to-select-multiple-files": "Hold CTRL (or CMD) to select multiple files",
"enter-an-https-url": "Enter an HTTPS URL",
"toggle-the-chat": "Ativar/desativar chat",
"mute-the-speaker": "Desligar som",
"mute-the-mic": "Desligar microfone",
"disable-the-camera": "Desligar câmera",
"settings": "Definições",
"hangup-the-call": "Desligar a chamada",
"show-help-info": "Mostrar ajuda",
"language-options": "Opções de língua",
"tip-hold-ctrl-command-to-select-multiple": "dica: Matenha pressionado CTRL (command) para seleção múltipla",
"ideal-for-1080p60-gaming-if-your-computer-and-upload-are-up-for-it": "Ideal para gaming 1080p60, se o teu computador e upload aguentarem",
"better-video-compression-and-quality-at-the-cost-of-increased-cpu-encoding-load": "Melhor compressão de vídeo e qualidade com o custo de mais carga no CPU",
"disable-digital-audio-effects-and-increase-audio-bitrate": "Desativar efeitos de áudio digitais e aumentar bitrate de áudio",
"the-guest-will-not-have-a-choice-over-audio-options": "O convidado não terá escolha sobre as opções de áudio",
"the-guest-will-only-be-able-to-select-their-webcam-as-an-option": "O convidado apenas poderá escolher a webcam como opção",
"hold-ctrl-and-the-mouse-wheel-to-zoom-in-and-out-remotely-of-compatible-video-streams": "Segure CTRL e o scroll do rato para fazer zoom in e out remotamente em streams de vídeo compatíveis",
"add-a-password-to-make-the-stream-inaccessible-to-those-without-the-password": "Adicione uma password para tornar o stream inacessível a quem não a tenha.",
"add-the-guest-to-a-group-chat-room-it-will-be-created-automatically-if-needed-": "Adicione o convidado a uma sala; será criada automaticamente se necessário.",
"customize-the-room-settings-for-this-guest": "Personalize as definições da sala para este convidado",
"hold-ctrl-or-cmd-to-select-multiple-files": "Segure CTRL (ou CMD) para selecionar mais de um ficheiro",
"enter-an-https-url": "Introduza um URL HTTPS",
"lucy-g": "Lucy G",
"flaticon": "Flaticon",
"creative-commons-by-3-0": "Creative Commons BY 3.0",
"gregor-cresnar": "Gregor Cresnar",
"add-this-video-to-any-remote-scene-1-": "Add this Video to any remote '&scene=1'",
"forward-user-to-another-room-they-can-always-return-": "Forward user to another room. They can always return.",
"start-recording-this-stream-experimental-views": "Start Recording this stream. *experimental*' views",
"force-the-user-to-disconnect-they-can-always-reconnect-": "Force the user to Disconnect. They can always reconnect.",
"change-this-audio-s-volume-in-all-remote-scene-views": "Change this Audio's volume in all remote '&scene' views",
"remotely-mute-this-audio-in-all-remote-scene-views": "Remotely Mute this Audio in all remote '&scene' views",
"disable-video-preview": "Disable Video Preview",
"low-quality-preview": "Low-Quality Preview",
"high-quality-preview": "High-Quality Preview",
"send-direct-message": "Send Direct Message",
"advanced-settings-and-remote-control": "Advanced Settings and Remote Control",
"toggle-voice-chat-with-this-guest": "Toggle Voice Chat with this Guest"
"add-this-video-to-any-remote-scene-1-": "Adicionar este vídeo a todas as cenas '&scene=1'",
"forward-user-to-another-room-they-can-always-return-": "Enviar convidado para outra sala. O convidado poderá voltar.",
"start-recording-this-stream-experimental-views": "Gravar stream. *experimental*",
"force-the-user-to-disconnect-they-can-always-reconnect-": "Force o utilizador a desligar. Ele poderá reconectar.",
"change-this-audio-s-volume-in-all-remote-scene-views": "Altere o volume de áudio em todas as cenas '&scene'",
"remotely-mute-this-audio-in-all-remote-scene-views": "Tire o som em todas as cenas '&scene'",
"disable-video-preview": "Desativar Previsualização de Vídeo",
"low-quality-preview": "Previsualização de baixa qualidade",
"high-quality-preview": "Previsualização de alta qualidade",
"send-direct-message": "Enviar mensagem direta",
"advanced-settings-and-remote-control": "Opções avançadas e Controlo Remoto",
"toggle-voice-chat-with-this-guest": "Ativar/desativar conversa de voz com este convidado"
},
"innerHTML": {
"logo-header": "<font id=\"qos\" style=\"color: white;\">O</font>BS.Ninja ",
@ -48,15 +48,15 @@
"password-input-field": "Password",
"enter-the-rooms-control": "Entrar no Centro de Controlo da Sala",
"show-tips": "Mostre-me algumas dicas..",
"added-notes": "\n\t\t\t\t<u><i>Added Notes:</i></u>\n\t\t\t\t<li>Qualquer pessoa pode entrar numa Sala se souber o nome, por isso mantenha-o único.</li>\n\t\t\t\t<li>Ter mais de quatro (4) pessoas numa Sala não é aconselhável devido a problemas de performance, mas depende do seu hardware.</li>\n\t\t\t\t<li>Dispositivos iOS são limitados a grupos de não mais de duas (2) pessoas. Esta é uma limitação de hardware.</li>\n\t\t\t\t<li>A opção \"Gravar\"é nova e considerada experimental.</li>\n\t\t\t\t<li>Deve \"Adicionar\" uma feed de vídeo à \"Cena de Grupo\" para que ela apareça lá.</li>\n\t\t\t\t<li>Existe um botão \"ecrã completo melhorado\" adicionado à vista de Convidado.</li>\n\t\t\t\t",
"added-notes": "\n\t\t\t\t<u><i>Notas adicionais:</i></u>\n\t\t\t\t<li>Qualquer pessoa pode entrar numa Sala se souber o nome, por isso mantenha-o único.</li>\n\t\t\t\t<li>Ter mais de quatro (4) pessoas numa Sala não é aconselhável devido a problemas de performance, mas depende do seu hardware.</li>\n\t\t\t\t<li>Dispositivos iOS são limitados a grupos de não mais de duas (2) pessoas. Esta é uma limitação de hardware.</li>\n\t\t\t\t<li>A opção \"Gravar\"é nova e considerada experimental.</li>\n\t\t\t\t<li>Deve \"Adicionar\" uma feed de vídeo à \"Cena de Grupo\" para que ela apareça lá.</li>\n\t\t\t\t<li>Existe um botão \"ecrã completo melhorado\" adicionado à vista de Convidado.</li>\n\t\t\t\t",
"back": "Voltar",
"add-your-camera": "Adicione a sua câmera ao OBS",
"ask-for-permissions": "Allow Access to Camera/Microphone",
"ask-for-permissions": "Permita acesso à Câmera/Microfone",
"waiting-for-camera": "Esperando pela câmera",
"video-source": "Fonte de vídeo",
"max-resolution": "Resolução Máxima",
"balanced": "Balanceado",
"smooth-cool": "Smooth and Cool",
"smooth-cool": "Suave e leve",
"select-audio-source": "Selecionar fontes de áudio",
"no-audio": "Sem áudio",
"select-output-source": " Saída de áudio: \n\t\t\t\t\t",
@ -82,9 +82,9 @@
"can-hear-only": "Pode apenas ouvir o chat de grupo",
"cant-see-or-hear": "Não pode ver ou ouvir o chat de grupo",
"share-local-video-file": "Fazer Stream de ficheiro de media",
"share-website-iframe": "Share Website",
"run-a-speed-test": "Run a Speed Test",
"read-the-guides": "Browse the Guides",
"share-website-iframe": "Partilhe um site",
"run-a-speed-test": "Corra um teste de velocidade",
"read-the-guides": "Descubra os Guias",
"info-blob": "\n\t\t\t\t\t\t<h2>O que é o OBS.Ninja</h2><br>\n\t\t\t\t\t\t<li>100% <b>grátis</b>; sem downloads; sem recolha de dados pessoais; sem login</li>\n\t\t\t\t\t\t<li>Leve vídeo do seu smartphone, portátil, computador, ou dos seus amigos diretamente para o seu stream de vídeo do OBS</li>\n\t\t\t\t\t\t<li>Usamos tecnologia de ponta de encaminhamento Peer-to-Peer que oferece privacidade e latência ultra-baixa</li>\n\t\t\t\t\t\t<br>\n\t\t\t\t\t\t<li>Vídeo de youtube <i class=\"fa fa-youtube-play\" aria-hidden=\"true\"></i> <a href=\"https://www.youtube.com/watch?v=6R_sQKxFAhg\">Demoing it here</a> </li>\n\t\t\t\t\t\t\n\t\t\t\t\t\t<br>\n\t\t\t\t\t\t<i><font style=\"color:red\">Problemas conhecidos:</font></i><br>\n\n\t\t\t\t\t\t<li><i class=\"fa fa-apple\" aria-hidden=\"true\"></i> Utilizadores de MacOS precisam de usar OBS v23 ou usar <i>Captura de ecrã</i> de um browser Chrome com OBS v25</li>\n\t\t\t\t\t\t<li>Alguns utilizadores terão problemas de \"pixelização\" com vídeos. Por favor adicione o parâmetro <b>&amp;codec=vp9</b> ao URL dos links OBS para o corrigir.</li>\n\t\t\t\t\t\t<br><i></i><h3><i>Visite o <a href=\"https://www.reddit.com/r/OBSNinja/\">sub-reddit</a> <i class=\"fa fa-reddit-alien\" aria-hidden=\"true\"></i> para ajuda e informação avançada. Também estou no <a href=\"https://discord.gg/EksyhGA\">Discord</a> e pode contactar-me por email em steve@seguin.email</i></h3>\n\t\t\t\t\t",
"add-to-scene": "Adicionar à Cena",
"forward-to-room": "Transferir",
@ -95,7 +95,7 @@
"change-to-medium-quality": "&nbsp;&nbsp;<i class=\"las la-video\"></i>",
"change-to-high-quality": "&nbsp;&nbsp;<i class=\"las la-binoculars\"></i>",
"send-direct-chat": "<i class=\"las la-envelope\"></i> Enviar mensagem",
"advanced-camera-settings": "<i class=\"las la-cog\"></i> Advanced",
"advanced-camera-settings": "<i class=\"las la-cog\"></i> Avançadas",
"voice-chat": "<i class=\"las la-microphone\"></i> Voice Chat",
"open-in-new-tab": "Abrir num novo separador",
"copy-to-clipboard": "Copiar para área de transferência",
@ -107,15 +107,24 @@
"names-and-labels-coming-soon": "\n\t\t\t\t\tNomes a identificar as ligações será uma funcionalidade futura.\n\t\t\t\t",
"send-chat": "Enviar",
"available-languages": "Línguas disponíveis:",
"add-more-here": "Adicionar mais aqui!"
"add-more-here": "Adicionar mais aqui!",
"waiting-for-camera-to-load":"À espera que a câmera fique pronta",
"start": "INICIAR",
"share-your-mic": "Partilhar o microfone",
"share-your-camera": "Partilhar a câmera",
"share-your-screen": "Partilhar o ecrã",
"join-room-with-mic": "Entrar na sala com microfone",
"share-screen-with-room": "Partilhar o ecrã com a sala",
"join-room-with-camera": "Entrar na sala com câmera",
"click-start-to-join": "Clique iniciar para se juntar"
},
"placeholders": {
"join-by-room-name-here": "Join by Room Name here",
"enter-a-room-name-here": "Enter a Room Name here",
"optional-room-password-here": "Optional room password here",
"give-this-media-source-a-name-optional-": "Give this media source a name (optional)",
"add-an-optional-password": "Add an optional password",
"enter-room-name-here": "Enter Room name here",
"enter-chat-message-to-send-here": "Enter chat message to send here"
"join-by-room-name-here": "Entre aqui numa sala pelo seu nome",
"enter-a-room-name-here": "Introduza nome da sala",
"optional-room-password-here": "Introduza password da sala (opcional)",
"give-this-media-source-a-name-optional-": "Dê um nome a esta fonte de mídia (opcional)",
"add-an-optional-password": "Introduza uma password (opcional)",
"enter-room-name-here": "Introduza nome da sala aqui",
"enter-chat-message-to-send-here": "Introduza mensagem a enviar aqui"
}
}

View File

@ -107,7 +107,16 @@
"names-and-labels-coming-soon": "\n\t\t\t\t\tNames identifying connected peers will be a feature in an upcoming release.\n\t\t\t\t",
"send-chat": "Отправить",
"available-languages": "Доступные языки:",
"add-more-here": "Добавить больше!"
"add-more-here": "Добавить больше!",
"waiting-for-camera-to-load":"waiting-for-camera-to-load",
"start": "START",
"share-your-mic": "Share your microphone",
"share-your-camera": "Share your Camera",
"share-your-screen": "Share your Screen",
"join-room-with-mic": "Join room with Microphone",
"share-screen-with-room": "Share-screen with Room",
"join-room-with-camera": "Join room with Camera",
"click-start-to-join": "Click Start to Join"
},
"placeholders": {
"join-by-room-name-here": "Join by Room Name here",

View File

@ -107,7 +107,16 @@
"names-and-labels-coming-soon": "\n\t\t\t\t\tBağlanan kişileri tanımlayan isimler ileriki bir geliştirmede yer alacak.\n\t\t\t\t",
"send-chat": "Gönder",
"available-languages": "Diller:",
"add-more-here": "Daha fazla ekle!"
"add-more-here": "Daha fazla ekle!",
"waiting-for-camera-to-load":"waiting-for-camera-to-load",
"start": "START",
"share-your-mic": "Share your microphone",
"share-your-camera": "Share your Camera",
"share-your-screen": "Share your Screen",
"join-room-with-mic": "Join room with Microphone",
"share-screen-with-room": "Share-screen with Room",
"join-room-with-camera": "Join room with Camera",
"click-start-to-join": "Click Start to Join"
},
"placeholders": {
"join-by-room-name-here": "Join by Room Name here",

View File

@ -1,139 +1,162 @@
// Copy and paste this code into OBS.Ninja's developer's console to generate new Translation files
function downloadTranslation(filename, trans={}){ // downloads the current translation to a file
var textDoc = JSON.stringify(trans, null, 2);
function downloadTranslation(filename, trans = {}) { // downloads the current translation to a file
var hiddenElement = document.createElement('a');
hiddenElement.href = 'data:text/html,' + encodeURIComponent(textDoc);
hiddenElement.target = '_blank';
hiddenElement.download = filename+".json";
hiddenElement.click();
return trans;
const textDoc = JSON.stringify(trans, null, 2);
const hiddenElement = document.createElement('a');
hiddenElement.href = `data:text/html,${
encodeURIComponent(textDoc)
}`;
hiddenElement.target = '_blank';
hiddenElement.download = `${filename}.json`;
hiddenElement.click();
return trans;
}
function updateTranslation(filename){ // updates the website with a specific translation
var request = new XMLHttpRequest();
request.open('GET', "./translations/"+filename+'.json?'+(Math.random()*100).toString(), false); // `false` makes the request synchronous
request.send(null);
function updateTranslation(filename) { // updates the website with a specific translation
const request = new XMLHttpRequest();
request.open('GET', `./translations/${filename}.json?${
(Math.random() * 100).toString()
}`, false); // `false` makes the request synchronous
request.send(null);
if (request.status !== 200) {
return;
}
try{
var data = JSON.parse(request.responseText);
} catch(e){
console.log(request.responseText);
console.error(e);
return false;
}
var oldTransItems = data; // UPDATE AFTER to point to data.innerHTML
var allItems1 = document.querySelectorAll('[data-translate]');
allItems1.forEach(function(ele){
if (ele.dataset.translate in oldTransItems){
ele.innerHTML = oldTransItems[ele.dataset.translate];
}
});
var oldTransTitles = {}; // UPDATED AFTER to point to DATA.title
var allTitles1 = document.querySelectorAll('[title]');
allTitles1.forEach(function(ele){
var key = ele.title.replace(/[\W]+/g,"-").toLowerCase();
if (key in oldTransTitles){
ele.title = oldTransTitles[key];
}
});
var oldTransPlaceholders = {}; // UPDATED AFTER to point to DATA.placeholders
var allPlaceholders1 = document.querySelectorAll('[placeholder]');
allPlaceholders1.forEach(function(ele){
var key = ele.placeholder.replace(/[\W]+/g,"-").toLowerCase();
if (key in oldTransPlaceholders){
ele.placeholder = oldTransPlaceholders[key];
}
});
return true;
if (request.status !== 200) {
return false, {};
}
try {
var data = JSON.parse(request.responseText);
} catch (e) {
console.log(request.responseText);
console.error(e);
return false, {};
}
const oldTransItems = data.innerHTML;
const allItems1 = document.querySelectorAll('[data-translate]');
allItems1.forEach((ele) => {
if (ele.dataset.translate in oldTransItems) {
ele.innerHTML = oldTransItems[ele.dataset.translate];
}
});
const oldTransTitles = data.titles;
const allTitles1 = document.querySelectorAll('[title]');
allTitles1.forEach((ele) => {
const key = ele.title.replace(/[\W]+/g, "-").toLowerCase();
if (key in oldTransTitles) {
ele.title = oldTransTitles[key];
}
});
const oldTransPlaceholders = data.placeholders;
const allPlaceholders1 = document.querySelectorAll('[placeholder]');
allPlaceholders1.forEach((ele) => {
const key = ele.placeholder.replace(/[\W]+/g, "-").toLowerCase();
if (key in oldTransPlaceholders) {
ele.placeholder = oldTransPlaceholders[key];
}
});
return [true, data];
}
var updateList = ["cs","de", "en", "es", "fr", "it", "ja", "nl", "pig", "pt", "ru", "tr", "blank" ]; // list of languages to update. Update this if you add a new language.
const updateList = [
"cs",
"de",
"en",
"es",
"fr",
"it",
"ja",
"nl",
"pig",
"pt",
"ru",
"tr",
"blank"
]; // list of languages to update. Update this if you add a new language.
var allItems = document.querySelectorAll('[data-translate]');
var defaultTrans = {};
allItems.forEach(function(ele){
var key = ele.dataset.translate.replace(/[\W]+/g,"-").toLowerCase();
defaultTrans[key] = ele.innerHTML;
const allItems = document.querySelectorAll('[data-translate]');
const defaultTrans = {};
allItems.forEach((ele) => {
const key = ele.dataset.translate.replace(/[\W]+/g, "-").toLowerCase();
defaultTrans[key] = ele.innerHTML;
});
var defaultTransTitles = {};
var allTitles = document.querySelectorAll('[title]');
allTitles.forEach(function(ele){
defaultTransTitles[ele.title] = ele.title;
const defaultTransTitles = {};
const allTitles = document.querySelectorAll('[title]');
allTitles.forEach((ele) => {
defaultTransTitles[ele.title] = ele.title;
});
var defaultTransPlaceholders = {};
var allPlaceholders = document.querySelectorAll('[placeholder]');
allPlaceholders.forEach(function(ele){
defaultTransPlaceholders[ele.placeholder] = ele.placeholder;
const defaultTransPlaceholders = {};
const allPlaceholders = document.querySelectorAll('[placeholder]');
allPlaceholders.forEach((ele) => {
defaultTransPlaceholders[ele.placeholder] = ele.placeholder;
});
var combinedTrans = {}
const combinedTrans = {};
combinedTrans.titles = defaultTransTitles;
combinedTrans.innerHTML = defaultTrans;
combinedTrans.placeholders = defaultTransPlaceholders;
var counter=0;
for (var i in updateList){
var lang = updateList[i];
setTimeout(function(ln){
var suceess = updateTranslation(ln); // we don't need to worry about DATA.
if (suceess==true){
var newTrans = {};
var allItems = document.querySelectorAll('[data-translate]');
allItems.forEach(function(ele){
var key = ele.dataset.translate;
newTrans[key] = ele.innerHTML;
});
var newTransTitles = {};
var allTitles = document.querySelectorAll('[title]');
allTitles.forEach(function(ele){
var key = ele.title.replace(/[\W]+/g,"-").toLowerCase();
newTransTitles[key] = ele.title;
});
var newPlaceholders = {};
var allPlaceholders = document.querySelectorAll('[placeholder]');
allPlaceholders.forEach(function(ele){
var key = ele.placeholder.replace(/[\W]+/g,"-").toLowerCase();
newPlaceholders[key] = ele.placeholder;
});
////// DOWNLOAD UPDATED TRANSLATION
var outputTrans = {}
outputTrans.titles = newTransTitles;
outputTrans.innerHTML = newTrans;
outputTrans.placeholders = newPlaceholders;
downloadTranslation(ln, outputTrans);
}
////////// RESET THING BACK
allItems.forEach(function(ele){
if (ele.dataset.translate in defaultTrans){
ele.innerHTML = defaultTrans[ele.dataset.translate];
}
});
allTitles.forEach(function(ele){
var key = ele.title.replace(/[\W]+/g,"-").toLowerCase();
if (key in defaultTransTitles){
ele.title = defaultTransTitles[key];
}
});
allPlaceholders.forEach(function(ele){
var key = ele.placeholder.replace(/[\W]+/g,"-").toLowerCase();
if (key in defaultTransPlaceholders){
ele.placeholder = defaultTransPlaceholders[key];
}
});
},counter,lang);
counter+=300;
var counter = 0;
for (const i in updateList) {
const lang = updateList[i];
setTimeout((ln) => {
var suceess = updateTranslation(ln); // we don't need to worry about DATA.
if (suceess[0] == true) {
const newTrans = suceess[1].innerHTML;
const allItems = document.querySelectorAll('[data-translate]');
allItems.forEach((ele) => {
const key = ele.dataset.translate;
newTrans[key] = ele.innerHTML;
});
const newTransTitles = suceess[1].titles;
const allTitles = document.querySelectorAll('[title]');
allTitles.forEach((ele) => {
const key = ele.title.replace(/[\W]+/g, "-").toLowerCase();
newTransTitles[key] = ele.title;
});
const newPlaceholders = suceess[1].placeholders;
const allPlaceholders = document.querySelectorAll('[placeholder]');
allPlaceholders.forEach((ele) => {
const key = ele.placeholder.replace(/[\W]+/g, "-").toLowerCase();
newPlaceholders[key] = ele.placeholder;
});
// //// DOWNLOAD UPDATED TRANSLATION
const outputTrans = {};
outputTrans.titles = newTransTitles;
outputTrans.innerHTML = newTrans;
outputTrans.placeholders = newPlaceholders;
downloadTranslation(ln, outputTrans);
}
// //////// RESET THING BACK
allItems.forEach((ele) => {
if (ele.dataset.translate in defaultTrans) {
ele.innerHTML = defaultTrans[ele.dataset.translate];
}
});
allTitles.forEach((ele) => {
const key = ele.title.replace(/[\W]+/g, "-").toLowerCase();
if (key in defaultTransTitles) {
ele.title = defaultTransTitles[key];
}
});
allPlaceholders.forEach((ele) => {
const key = ele.placeholder.replace(/[\W]+/g, "-").toLowerCase();
if (key in defaultTransPlaceholders) {
ele.placeholder = defaultTransPlaceholders[key];
}
});
}, counter, lang);
counter += 300;
}