audio updates, webaudio etc
@ -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
@ -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>
|
||||
10
iframe.html
@ -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
@ -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
|
After Width: | Height: | Size: 7.3 KiB |
BIN
images/mic-slash.gif
Normal file
|
After Width: | Height: | Size: 807 B |
BIN
images/mic.gif
Normal file
|
After Width: | Height: | Size: 489 B |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 299 KiB |
BIN
images/old_logo.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
2
images/sd.svg
Normal 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 |
163
index.html
@ -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'));">
|
||||
|
||||
<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'));">
|
||||
|
||||
<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"> <i class="las la-video-slash"></i></span>
|
||||
@ -639,25 +674,36 @@
|
||||
<span data-translate="change-to-high-quality"> <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>
|
||||
|
||||
89
main.css
@ -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);
|
||||
}
|
||||
17
popout.html
@ -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>
|
||||
|
||||
|
||||
21
thirdparty/CodecsHandler.js
vendored
@ -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.
|
||||
|
||||
@ -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",
|
||||
|
||||
@ -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>&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": " <i class=\"las la-video-slash\"></i>",
|
||||
"change-to-medium-quality": " <i class=\"las la-video\"></i>",
|
||||
"change-to-high-quality": " <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"
|
||||
}
|
||||
}
|
||||
@ -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",
|
||||
|
||||
@ -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",
|
||||
|
||||
@ -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",
|
||||
|
||||
@ -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": " <i class=\"las la-video-slash\"></i>",
|
||||
"change-to-medium-quality": " <i class=\"las la-video\"></i>",
|
||||
"change-to-high-quality": " <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"
|
||||
}
|
||||
}
|
||||
@ -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",
|
||||
|
||||
@ -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",
|
||||
|
||||
@ -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",
|
||||
|
||||
@ -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",
|
||||
|
||||
@ -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>&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": " <i class=\"las la-video\"></i>",
|
||||
"change-to-high-quality": " <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"
|
||||
}
|
||||
}
|
||||
@ -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",
|
||||
|
||||
@ -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",
|
||||
|
||||
@ -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;
|
||||
}
|
||||