Language fixes
This commit is contained in:
parent
932a21647d
commit
0efb495339
11 changed files with 210 additions and 131 deletions
|
|
@ -240,7 +240,7 @@ def get_translation():
|
||||||
source=detectedLanguage, target=settings["LANGUAGE"]["TRANSLATE_TO"]
|
source=detectedLanguage, target=settings["LANGUAGE"]["TRANSLATE_TO"]
|
||||||
).translate(message)
|
).translate(message)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
return jsonify({"error": e}), 500
|
return jsonify({"error": "Could not translate, continuing with next language"}), 500
|
||||||
return jsonify({"translation": translated}), 200
|
return jsonify({"translation": translated}), 200
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -274,7 +274,7 @@ h1 {
|
||||||
|
|
||||||
.username.sender {
|
.username.sender {
|
||||||
padding: 0px 5px 5px 30px;
|
padding: 0px 5px 5px 30px;
|
||||||
margin: 20px 5px 5px 30px;
|
margin: 20px 5px 5px 25px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.username.user {
|
.username.user {
|
||||||
|
|
@ -505,13 +505,20 @@ h1 {
|
||||||
background-color: var(--main-color1);
|
background-color: var(--main-color1);
|
||||||
}
|
}
|
||||||
|
|
||||||
.emoji-picker {
|
.emotes {
|
||||||
margin-left: auto;
|
position: relative;
|
||||||
visibility: hidden;
|
cursor: pointer;
|
||||||
bottom: 50px;
|
}
|
||||||
left: 0px;
|
|
||||||
|
.dark {
|
||||||
|
display: none;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
|
top: -400px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.emotes:hover .dark {
|
||||||
|
display: block;
|
||||||
}
|
}
|
||||||
|
|
||||||
.fi {
|
.fi {
|
||||||
|
|
@ -539,11 +546,15 @@ h1 {
|
||||||
padding: 0px 0px 0px 0px;
|
padding: 0px 0px 0px 0px;
|
||||||
margin: -45px 0px 0px -40px;
|
margin: -45px 0px 0px -40px;
|
||||||
top: 30px;
|
top: 30px;
|
||||||
left: 20px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.language-icon {
|
.language-icon {
|
||||||
position: relative;
|
position: relative;
|
||||||
top: 45px;
|
top: 45px;
|
||||||
left: 20px;
|
}
|
||||||
|
|
||||||
|
.flag-icon {
|
||||||
|
width: 20px !important;
|
||||||
|
height: 20px !important;
|
||||||
|
left: 18px;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -61,11 +61,6 @@
|
||||||
color: var(--main-color2);
|
color: var(--main-color2);
|
||||||
}
|
}
|
||||||
|
|
||||||
.hdp:hover {
|
|
||||||
position: fixed;
|
|
||||||
/* filter: brightness(150%); */
|
|
||||||
}
|
|
||||||
|
|
||||||
.menu .items .item-active {
|
.menu .items .item-active {
|
||||||
background: -webkit-linear-gradient(left, var(--main-color2) 10%, var(--main-color2), var(--main-color1) 10%, var(--main-color1) 10%);
|
background: -webkit-linear-gradient(left, var(--main-color2) 10%, var(--main-color2), var(--main-color1) 10%, var(--main-color1) 10%);
|
||||||
color: var(--main-color2);
|
color: var(--main-color2);
|
||||||
|
|
@ -229,60 +224,50 @@
|
||||||
height: 100%;
|
height: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.btn {
|
|
||||||
background-color: blue;
|
|
||||||
color: red;
|
|
||||||
padding: 16px;
|
|
||||||
font-size: 16px;
|
|
||||||
border: none;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
.pop {
|
.pop {
|
||||||
position: relative;
|
position: relative;
|
||||||
display: inline-block;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
.pop.up {
|
.pop-selection {
|
||||||
|
width: 20px !important;
|
||||||
|
height: 20px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.miniText {
|
||||||
|
position: absolute;
|
||||||
|
font-size: 8pt;
|
||||||
|
color: white;
|
||||||
|
padding: 3px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.pop-content {
|
.pop-content {
|
||||||
display: none;
|
display: none;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
background-color: black;
|
background-color: var(--main-color3);
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
height: 400px;
|
height: 400px;
|
||||||
width: max-content;
|
width: max-content;
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
display: grid;
|
|
||||||
grid-template-columns: repeat(3, 1fr);
|
grid-template-columns: repeat(3, 1fr);
|
||||||
top: -400px;
|
top: -400px;
|
||||||
color: white;
|
color: white;
|
||||||
|
border: 1px solid #444;
|
||||||
}
|
}
|
||||||
pop-content div {
|
pop-content div {
|
||||||
color: white;
|
color: white;
|
||||||
padding: 12px 16px;
|
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
display: block;
|
display: block;
|
||||||
}
|
}
|
||||||
.pop-content div:hover {
|
.pop-content div:hover {
|
||||||
display: none;
|
backdrop-filter: invert(50%);
|
||||||
/* background-color: black; */
|
|
||||||
}
|
}
|
||||||
.pop:hover .pop-content {
|
.pop:hover .pop-content {
|
||||||
display: grid;
|
display: grid;
|
||||||
/* display: none; */
|
|
||||||
grid-template-columns: repeat(3, 1fr);
|
grid-template-columns: repeat(3, 1fr);
|
||||||
/* display: block; */
|
|
||||||
}
|
|
||||||
.pop:hover .btn {
|
|
||||||
background-color: blue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.language-select {
|
.language-select {
|
||||||
margin: 5px;
|
padding: 5px;
|
||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
|
|
||||||
.language-select:hover {
|
|
||||||
background-color: blue;
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -377,22 +377,17 @@ input[type='lol'] {
|
||||||
|
|
||||||
.tooltip {
|
.tooltip {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
display: inline-block;
|
font-size: 12pt;
|
||||||
visibility: hidden;
|
|
||||||
font-size: 12px;
|
|
||||||
line-height: 20px;
|
|
||||||
padding: 5px;
|
padding: 5px;
|
||||||
background: var(--main-color3);
|
background: var(--main-color3);
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
visibility: hidden;
|
visibility: hidden;
|
||||||
opacity: 1;
|
|
||||||
box-shadow: -2px 2px 5px rgba(0, 0, 0, 0.2);
|
box-shadow: -2px 2px 5px rgba(0, 0, 0, 0.2);
|
||||||
transition:
|
|
||||||
opacity 0.3s,
|
|
||||||
visibility 0s;
|
|
||||||
color: var(--main-color2);
|
color: var(--main-color2);
|
||||||
font-family: 'xxii_avenmedium';
|
font-family: 'xxii_avenmedium';
|
||||||
z-index: 999;
|
z-index: 999;
|
||||||
|
max-width: 200px;
|
||||||
|
width: max-content;
|
||||||
}
|
}
|
||||||
|
|
||||||
div[type='text']:disabled {
|
div[type='text']:disabled {
|
||||||
|
|
|
||||||
|
|
@ -78,24 +78,18 @@ textarea {
|
||||||
0 0 5px #070607,
|
0 0 5px #070607,
|
||||||
0 0 5px #070607,
|
0 0 5px #070607,
|
||||||
0 0 5px #070607;
|
0 0 5px #070607;
|
||||||
/* transition: all 0.15s ease-in-out; */
|
transition: all 0.15s ease-in-out;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.SmallButton:hover {
|
.SmallButton:hover {
|
||||||
/* color: var(--main-color1); */
|
color: var(--main-color1);
|
||||||
width: 50px;
|
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
/* filter: brightness(150%); */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.SmallButton:active {
|
.SmallButton:active {
|
||||||
color: var(--main-color1);
|
color: var(--main-color1);
|
||||||
transform: translateY(4px);
|
transform: translateY(4px);
|
||||||
text-shadow:
|
|
||||||
0 0 5px #000,
|
|
||||||
0 0 5px #000,
|
|
||||||
0 0 5px #000;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.AdvancedMenuButton {
|
.AdvancedMenuButton {
|
||||||
|
|
|
||||||
|
|
@ -44,13 +44,13 @@
|
||||||
<select name="defaultLanguage" class="top-select" id="language"></select>
|
<select name="defaultLanguage" class="top-select" id="language"></select>
|
||||||
</div>
|
</div>
|
||||||
<div id="window-controls">
|
<div id="window-controls">
|
||||||
<div class="button" id="min-button" tip="Minimize window" tip-left>
|
<div class="button" id="min-button" tip="Minimize window">
|
||||||
<i class="fa-solid fa-window-minimize"></i>
|
<i class="fa-solid fa-window-minimize"></i>
|
||||||
</div>
|
</div>
|
||||||
<div class="button" id="max-button" tip="Maximize window" tip-left>
|
<div class="button" id="max-button" tip="Maximize window">
|
||||||
<i class="fa-solid fa-window-maximize"></i>
|
<i class="fa-solid fa-window-maximize"></i>
|
||||||
</div>
|
</div>
|
||||||
<div class="button" id="close-button" tip="Close application" tip-left>
|
<div class="button" id="close-button" tip="Close application">
|
||||||
<i class="fa-solid fa-xmark"></i>
|
<i class="fa-solid fa-xmark"></i>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -577,13 +577,21 @@
|
||||||
<div id="chatBox" class="message-window"></div>
|
<div id="chatBox" class="message-window"></div>
|
||||||
<!-- User input box-->
|
<!-- User input box-->
|
||||||
<div id="userInput" class="chat-input">
|
<div id="userInput" class="chat-input">
|
||||||
<div id="emoji-picker" class="emoji-picker">
|
<div class="emotes">
|
||||||
|
<button class="SmallButton">
|
||||||
|
<i class="fa-regular fa-grin fa-2x" id="emojis" aria-hidden="true"></i>
|
||||||
|
</button>
|
||||||
<emoji-picker class="dark"></emoji-picker>
|
<emoji-picker class="dark"></emoji-picker>
|
||||||
</div>
|
</div>
|
||||||
<button class="SmallButton">
|
<div class="pop in">
|
||||||
<i class="fa-regular fa-grin fa-2x" id="emojis" aria-hidden="true"></i>
|
<div class="miniText">In</div>
|
||||||
</button>
|
<button class="SmallButton">
|
||||||
<div class="pop">
|
<i class="fa-solid fa-globe fa-2x" aria-hidden="true"></i>
|
||||||
|
</button>
|
||||||
|
<div class="pop-content"></div>
|
||||||
|
</div>
|
||||||
|
<div class="pop out">
|
||||||
|
<div class="miniText">Out</div>
|
||||||
<button class="SmallButton">
|
<button class="SmallButton">
|
||||||
<i class="fa-solid fa-globe fa-2x" aria-hidden="true"></i>
|
<i class="fa-solid fa-globe fa-2x" aria-hidden="true"></i>
|
||||||
</button>
|
</button>
|
||||||
|
|
@ -697,7 +705,7 @@
|
||||||
</section>
|
</section>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div id="VIEWERS_PANEL" tip="Hide Viewers" tip-left>
|
<div id="VIEWERS_PANEL" tip="Hide Viewers">
|
||||||
<div class="circle-right">
|
<div class="circle-right">
|
||||||
<i class="fa fa-eye hide" aria-hidden="true"></i>
|
<i class="fa fa-eye hide" aria-hidden="true"></i>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -47,6 +47,10 @@ async function getInstalledVoices() {
|
||||||
function setTranslatedMessage(message) {
|
function setTranslatedMessage(message) {
|
||||||
if (message.language.selectedLanguage.ISO639 !== message.language.detectedLanguage.ISO639) {
|
if (message.language.selectedLanguage.ISO639 !== message.language.detectedLanguage.ISO639) {
|
||||||
const messageBox = document.getElementById(message.messageId).getElementsByClassName('msg-box')[0];
|
const messageBox = document.getElementById(message.messageId).getElementsByClassName('msg-box')[0];
|
||||||
|
const languageBox = document.getElementById(message.messageId).getElementsByClassName('language-icon flag-icon')[0];
|
||||||
|
|
||||||
|
languageBox.classList = `fi fi-${message.language.detectedLanguage.ISO3166} fis language-icon flag-icon`;
|
||||||
|
languageBox.setAttribute('tip', message.language.detectedLanguage.name);
|
||||||
|
|
||||||
const translationHeader = document.createElement('div');
|
const translationHeader = document.createElement('div');
|
||||||
translationHeader.className = 'translation-header';
|
translationHeader.className = 'translation-header';
|
||||||
|
|
@ -57,7 +61,7 @@ function setTranslatedMessage(message) {
|
||||||
translationIcon.className = 'translation-icon';
|
translationIcon.className = 'translation-icon';
|
||||||
const languageElement = document.createElement('span');
|
const languageElement = document.createElement('span');
|
||||||
const language = getLanguageProperties(settings.LANGUAGE.TRANSLATE_TO);
|
const language = getLanguageProperties(settings.LANGUAGE.TRANSLATE_TO);
|
||||||
languageElement.classList = `fi fi-${message.language.selectedLanguage.ISO3166} fis`;
|
languageElement.classList = `fi fi-${message.language.selectedLanguage.ISO3166} fis flag-icon`;
|
||||||
languageElement.setAttribute('tip', message.language.selectedLanguage.name);
|
languageElement.setAttribute('tip', message.language.selectedLanguage.name);
|
||||||
addSingleTooltip(languageElement);
|
addSingleTooltip(languageElement);
|
||||||
translationIcon.appendChild(languageElement);
|
translationIcon.appendChild(languageElement);
|
||||||
|
|
@ -80,6 +84,7 @@ function setTranslatedMessage(message) {
|
||||||
language: message.language
|
language: message.language
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
return message.language.detectedLanguage;
|
||||||
}
|
}
|
||||||
|
|
||||||
async function getTranslatedMessage(message) {
|
async function getTranslatedMessage(message) {
|
||||||
|
|
@ -90,16 +95,23 @@ async function getTranslatedMessage(message) {
|
||||||
},
|
},
|
||||||
body: JSON.stringify({
|
body: JSON.stringify({
|
||||||
message: message.message,
|
message: message.message,
|
||||||
|
remainder: message.remainingDetectedLanguages,
|
||||||
language: message.language.detectedLanguage.IETF
|
language: message.language.detectedLanguage.IETF
|
||||||
}) // Convert the data to JSON and include it in the request body
|
}) // Convert the data to JSON and include it in the request body
|
||||||
};
|
};
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const response = await fetch(`http://127.0.0.1:${settings.GENERAL.PORT}/translate`, requestOptions);
|
const response = await fetch(`http://127.0.0.1:${settings.GENERAL.PORT}/translate`, requestOptions);
|
||||||
|
const responseData = await response.json();
|
||||||
if (response.ok) {
|
if (response.ok) {
|
||||||
const responseData = await response.json();
|
|
||||||
|
|
||||||
console.log('Translated message:', responseData);
|
console.log('Translated message:', responseData);
|
||||||
|
|
||||||
|
if (settings.LANGUAGE.BROADCAST_TRANSLATION) {
|
||||||
|
twitch.sendMessage(
|
||||||
|
`[${message.language.detectedLanguage.name} ${message.language.detectedLanguage.ISO639} > ${message.language.selectedLanguage.name} ${message.language.selectedLanguage.ISO639}] @${message.username}: ${responseData.translation}`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
setTranslatedMessage({
|
setTranslatedMessage({
|
||||||
originalMessage: message.message,
|
originalMessage: message.message,
|
||||||
translation: responseData.translation,
|
translation: responseData.translation,
|
||||||
|
|
@ -109,38 +121,65 @@ async function getTranslatedMessage(message) {
|
||||||
username: message.username,
|
username: message.username,
|
||||||
logoUrl: message.logoUrl
|
logoUrl: message.logoUrl
|
||||||
});
|
});
|
||||||
if (settings.LANGUAGE.BROADCAST_TRANSLATION) {
|
return message.language.detectedLanguage;
|
||||||
twitch.sendMessage(
|
|
||||||
`[${message.language.detectedLanguage.name} ${message.language.detectedLanguage.ISO639} > ${message.language.selectedLanguage.name} ${message.language.selectedLanguage.ISO639}] @${message.username}: ${responseData.translation}`
|
|
||||||
);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
console.error('Failed to send termination signal to Flask server.');
|
console.error(responseData);
|
||||||
message.message = 'Error,could not translate message';
|
if (message.remainingDetectedLanguages.length > 0) {
|
||||||
message.languaga = 'en-GB';
|
message.language.detectedLanguage = getLanguageProperties(message.remainingDetectedLanguages[0]);
|
||||||
getTranslatedMessage(message);
|
message.remainingDetectedLanguages.shift();
|
||||||
|
return getTranslatedMessage(message);
|
||||||
|
} else {
|
||||||
|
message.message = 'Error, Could not translate message';
|
||||||
|
message.language.detectedLanguage = getLanguageProperties('en-GB');
|
||||||
|
return getTranslatedMessage(message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Error sending termination signal:', error);
|
console.error('Error sending termination signal:', error);
|
||||||
|
message.message = 'Error, Could not translate message';
|
||||||
|
message.language.detectedLanguage = getLanguageProperties('en-GB');
|
||||||
|
getTranslatedMessage(message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function filterLanguage(message) {
|
async function filterLanguage(message) {
|
||||||
const selectedPrimaryLanguage = getLanguageProperties(settings.LANGUAGE.TRANSLATE_TO);
|
const selectedPrimaryLanguage = getLanguageProperties(settings.LANGUAGE.TRANSLATE_TO);
|
||||||
const selectedPrimaryLanguageIndex =
|
const selectedPrimaryLanguageIndex =
|
||||||
message.languages.indexOf(selectedPrimaryLanguage.ISO639) === -1 ? 99 : message.languages.indexOf(selectedPrimaryLanguage.ISO639);
|
message.languages.indexOf(selectedPrimaryLanguage.ISO639) === -1 ? 99 : message.languages.indexOf(selectedPrimaryLanguage.ISO639);
|
||||||
|
|
||||||
const selectedSecondaryLanguage = getLanguageProperties(settings.TTS.SECONDARY_TTS_LANGUAGE);
|
const selectedSecondaryLanguage = getLanguageProperties(settings.TTS.SECONDARY_TTS_LANGUAGE);
|
||||||
const selectedSecondaryLanguageIndex =
|
const selectedSecondaryLanguageIndex =
|
||||||
message.languages.indexOf(selectedSecondaryLanguage.ISO639) === -1 ? 99 : message.languages.indexOf(selectedSecondaryLanguage.ISO639);
|
message.languages.indexOf(selectedSecondaryLanguage.ISO639) === -1 ? 99 : message.languages.indexOf(selectedSecondaryLanguage.ISO639);
|
||||||
const detectedLanguage = getLanguageProperties(message.languages[0]);
|
|
||||||
|
let detectedLanguage = '';
|
||||||
|
const remainingDetectedLanguages = [];
|
||||||
|
const detectedLanguages = message.languages.slice();
|
||||||
|
|
||||||
|
for (const [index, language] of detectedLanguages.entries()) {
|
||||||
|
detectedLanguage = getLanguageProperties(language);
|
||||||
|
|
||||||
|
if (detectedLanguage !== 'error') {
|
||||||
|
detectedLanguages.splice(index, 1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const [index, language] of detectedLanguages.entries()) {
|
||||||
|
const remainderLanguage = getLanguageProperties(language);
|
||||||
|
if (remainderLanguage !== 'error') {
|
||||||
|
remainingDetectedLanguages.push(remainderLanguage.IETF);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const language = selectedPrimaryLanguageIndex < selectedSecondaryLanguageIndex ? selectedPrimaryLanguage : detectedLanguage;
|
const language = selectedPrimaryLanguageIndex < selectedSecondaryLanguageIndex ? selectedPrimaryLanguage : detectedLanguage;
|
||||||
if (settings.LANGUAGE.TRANSLATE_TO !== 'none' && selectedPrimaryLanguage.ISO639 !== detectedLanguage.ISO639) {
|
if (settings.LANGUAGE.TRANSLATE_TO !== 'none' && selectedPrimaryLanguage.ISO639 !== detectedLanguage.ISO639) {
|
||||||
getTranslatedMessage({
|
getTranslatedMessage({
|
||||||
message: message.message,
|
message: message.message,
|
||||||
messageId: message.messageId,
|
messageId: message.messageId,
|
||||||
|
remainingDetectedLanguages,
|
||||||
language: {
|
language: {
|
||||||
selectedLanguage: selectedPrimaryLanguage,
|
selectedLanguage: selectedPrimaryLanguage,
|
||||||
detectedLanguage
|
detectedLanguage: detectedLanguage
|
||||||
},
|
},
|
||||||
username: message.username,
|
username: message.username,
|
||||||
formattedMessage: message.formattedMessage,
|
formattedMessage: message.formattedMessage,
|
||||||
|
|
@ -160,6 +199,7 @@ function filterLanguage(message) {
|
||||||
logoUrl: message.logoUrl
|
logoUrl: message.logoUrl
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
return language;
|
return language;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -182,7 +222,7 @@ async function getDetectedLanguage(message) {
|
||||||
const responseData = await response.json();
|
const responseData = await response.json();
|
||||||
|
|
||||||
console.log('Detected Languages:', responseData);
|
console.log('Detected Languages:', responseData);
|
||||||
return filterLanguage({
|
return await filterLanguage({
|
||||||
languages: responseData.languages,
|
languages: responseData.languages,
|
||||||
message: message.message,
|
message: message.message,
|
||||||
messageId: message.messageId,
|
messageId: message.messageId,
|
||||||
|
|
|
||||||
|
|
@ -21,8 +21,8 @@ const languages = {
|
||||||
amharic: { IETF: 'am-ET', ISO639: 'am', ISO3166: 'et' },
|
amharic: { IETF: 'am-ET', ISO639: 'am', ISO3166: 'et' },
|
||||||
'antigua and barbuda creole english': { IETF: 'aig-AG', ISO639: 'aig', ISO3166: 'ag' },
|
'antigua and barbuda creole english': { IETF: 'aig-AG', ISO639: 'aig', ISO3166: 'ag' },
|
||||||
arabic: { IETF: 'ar-SA', ISO639: 'ar', ISO3166: 'sa' },
|
arabic: { IETF: 'ar-SA', ISO639: 'ar', ISO3166: 'sa' },
|
||||||
'arabic egyptian': { IETF: 'ar-EG', ISO639: 'ar', ISO3166: 'eg' },
|
'arabic egyptian': { IETF: 'ar-EG', ISO639: 'arz', ISO3166: 'eg' },
|
||||||
// aragonese: { IETF: 'an-ES', ISO639: 'an', ISO3166: 'es' },
|
aragonese: { IETF: 'es-ES', ISO639: 'an', ISO3166: 'es' },
|
||||||
armenian: { IETF: 'hy-AM', ISO639: 'hy', ISO3166: 'am' },
|
armenian: { IETF: 'hy-AM', ISO639: 'hy', ISO3166: 'am' },
|
||||||
assamese: { IETF: 'as-IN', ISO639: 'as', ISO3166: 'in' },
|
assamese: { IETF: 'as-IN', ISO639: 'as', ISO3166: 'in' },
|
||||||
asturian: { IETF: 'ast-ES', ISO639: 'ast', ISO3166: 'es' },
|
asturian: { IETF: 'ast-ES', ISO639: 'ast', ISO3166: 'es' },
|
||||||
|
|
|
||||||
|
|
@ -163,8 +163,25 @@ async function getAudioDevices() {
|
||||||
|
|
||||||
getAudioDevices();
|
getAudioDevices();
|
||||||
|
|
||||||
function setLanguagesinSelectx() {
|
function setSelectedLanguageinSelect(languageSelect, language) {
|
||||||
const languageSelect = document.querySelector('.pop-content'); // obtain the html reference of the google voices comboBox
|
const button = languageSelect.querySelector('.SmallButton');
|
||||||
|
const languageElement = document.createElement('span');
|
||||||
|
languageElement.classList = `fi fi-${language.ISO3166} fis pop-selection`;
|
||||||
|
languageElement.setAttribute('tip', language.name);
|
||||||
|
button.innerHTML = '';
|
||||||
|
button.appendChild(languageElement);
|
||||||
|
addSingleTooltip(languageElement);
|
||||||
|
}
|
||||||
|
|
||||||
|
function setLanguagesinSelectx(languageSelector, language) {
|
||||||
|
const languageSelect = document.querySelector(languageSelector); // obtain the html reference of the google voices comboBox
|
||||||
|
const languageSelectContent = languageSelect.querySelector('.pop-content');
|
||||||
|
|
||||||
|
languageSelectContent.addEventListener('click', e => {
|
||||||
|
console.log(e.target);
|
||||||
|
language = getLanguageProperties(e.target.getAttribute('value'));
|
||||||
|
setSelectedLanguageinSelect(languageSelect, language);
|
||||||
|
});
|
||||||
|
|
||||||
for (const language in languageObject.languages) {
|
for (const language in languageObject.languages) {
|
||||||
if (Object.prototype.hasOwnProperty.call(languageObject.languages, language)) {
|
if (Object.prototype.hasOwnProperty.call(languageObject.languages, language)) {
|
||||||
|
|
@ -177,24 +194,27 @@ function setLanguagesinSelectx() {
|
||||||
|
|
||||||
const languageElement = document.createElement('span');
|
const languageElement = document.createElement('span');
|
||||||
languageElement.classList = `fi fi-${ISO3166} fis`;
|
languageElement.classList = `fi fi-${ISO3166} fis`;
|
||||||
|
languageElement.style.pointerEvents = 'none';
|
||||||
option.setAttribute('tip', language);
|
option.setAttribute('tip', language);
|
||||||
|
|
||||||
const text = document.createElement('span');
|
const text = document.createElement('span');
|
||||||
|
text.style.pointerEvents = 'none';
|
||||||
text.innerHTML = ` - ${ISO639}`;
|
text.innerHTML = ` - ${ISO639}`;
|
||||||
|
|
||||||
option.value = IETF;
|
option.setAttribute('value', IETF);
|
||||||
|
|
||||||
languageSelect.appendChild(option);
|
languageSelectContent.appendChild(option);
|
||||||
option.appendChild(languageElement);
|
option.appendChild(languageElement);
|
||||||
option.appendChild(text);
|
option.appendChild(text);
|
||||||
addSingleTooltip(option);
|
addSingleTooltip(option);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// languageSelect.selectedIndex = setting;
|
setSelectedLanguageinSelect(languageSelect, language);
|
||||||
}
|
}
|
||||||
|
|
||||||
setLanguagesinSelectx();
|
setLanguagesinSelectx('.pop.in', getLanguageProperties(settings.LANGUAGE.SEND_TRANSLATION_IN));
|
||||||
|
setLanguagesinSelectx('.pop.out', getLanguageProperties(settings.LANGUAGE.SEND_TRANSLATION_OUT));
|
||||||
|
|
||||||
function setLanguagesinSelect(languageSelector, setting) {
|
function setLanguagesinSelect(languageSelector, setting) {
|
||||||
const languageSelect = document.querySelector(languageSelector); // obtain the html reference of the google voices comboBox
|
const languageSelect = document.querySelector(languageSelector); // obtain the html reference of the google voices comboBox
|
||||||
|
|
@ -232,6 +252,38 @@ function addVoiceService(name) {
|
||||||
addToselect('#secondaryTTSService');
|
addToselect('#secondaryTTSService');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function determineTootlTipPosition(element) {
|
||||||
|
const horizontal = document.body.clientWidth / 2;
|
||||||
|
const vertical = document.body.clientHeight / 2;
|
||||||
|
|
||||||
|
element.tip.style.left = `${element.mouse.x}px`;
|
||||||
|
element.tip.style.top = `${element.mouse.y}px`;
|
||||||
|
|
||||||
|
const tipPosition = element.tip.getBoundingClientRect();
|
||||||
|
|
||||||
|
if (element.position.x < horizontal && element.position.y < vertical) {
|
||||||
|
element.tip.style.top = `${parseInt(element.tip.style.top) + 25}px`;
|
||||||
|
element.tip.style.left = `${parseInt(element.tip.style.left) + 10}px`;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (element.position.x < horizontal && element.position.y > vertical) {
|
||||||
|
element.tip.style.top = `${parseInt(element.tip.style.top) - tipPosition.height}px`;
|
||||||
|
element.tip.style.left = `${parseInt(element.tip.style.left) + 10}px`;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (element.position.x > horizontal && element.position.y < vertical) {
|
||||||
|
element.tip.style.top = `${parseInt(element.tip.style.top) + 25}px`;
|
||||||
|
element.tip.style.left = `${parseInt(element.tip.style.left) - tipPosition.width}px`;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (element.position.x > horizontal && element.position.y > vertical) {
|
||||||
|
element.tip.style.top = `${parseInt(element.tip.style.top) - tipPosition.height}px`;
|
||||||
|
element.tip.style.left = `${parseInt(element.tip.style.left) - tipPosition.width}px`;
|
||||||
|
}
|
||||||
|
|
||||||
|
element.tip.style.visibility = 'visible';
|
||||||
|
}
|
||||||
|
|
||||||
// Small tooltip
|
// Small tooltip
|
||||||
function addSingleTooltip(el) {
|
function addSingleTooltip(el) {
|
||||||
const tip = document.createElement('div');
|
const tip = document.createElement('div');
|
||||||
|
|
@ -244,14 +296,14 @@ function addSingleTooltip(el) {
|
||||||
image.src = el.src;
|
image.src = el.src;
|
||||||
tip.appendChild(image);
|
tip.appendChild(image);
|
||||||
}
|
}
|
||||||
tip.style.transform = `translate(${el.hasAttribute('tip-left') ? 'calc(-100% - 5px)' : '15px'}, ${
|
|
||||||
el.hasAttribute('tip-top') ? '-100%' : '15px'
|
|
||||||
})`;
|
|
||||||
body.appendChild(tip);
|
body.appendChild(tip);
|
||||||
|
tip.pointerEvents = 'none';
|
||||||
element.onmousemove = e => {
|
element.onmousemove = e => {
|
||||||
tip.style.left = `${e.x}px`;
|
determineTootlTipPosition({
|
||||||
tip.style.top = `${e.y}px`;
|
position: element.getBoundingClientRect(),
|
||||||
tip.style.visibility = 'visible';
|
mouse: { x: e.x, y: e.y },
|
||||||
|
tip
|
||||||
|
});
|
||||||
};
|
};
|
||||||
element.onmouseleave = e => {
|
element.onmouseleave = e => {
|
||||||
tip.style.visibility = 'hidden';
|
tip.style.visibility = 'hidden';
|
||||||
|
|
@ -270,7 +322,7 @@ function showChatMessage(article) {
|
||||||
const messages = document.body.querySelectorAll('.msg-container');
|
const messages = document.body.querySelectorAll('.msg-container');
|
||||||
|
|
||||||
const lastMessage = messages[messages.length - 1];
|
const lastMessage = messages[messages.length - 1];
|
||||||
lastMessage.scrollIntoView();
|
lastMessage.scrollIntoView({ block: 'end', behavior: 'smooth' });
|
||||||
}
|
}
|
||||||
|
|
||||||
function getPostTime() {
|
function getPostTime() {
|
||||||
|
|
@ -338,33 +390,28 @@ if (fs.existsSync(emoteListSavePath)) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function getLanguageProperties(languageToDetect) {
|
function getLanguageProperties(languageToDetect) {
|
||||||
const filteredLanguage = Object.keys(languageObject.languages).reduce(function (accumulator, currentValue) {
|
try {
|
||||||
if (
|
const filteredLanguage = Object.keys(languageObject.languages).reduce(function (accumulator, currentValue) {
|
||||||
languageObject.languages[currentValue].IETF === languageToDetect ||
|
if (
|
||||||
languageObject.languages[currentValue].ISO639 === languageToDetect ||
|
languageObject.languages[currentValue].IETF === languageToDetect ||
|
||||||
languageObject.languages[currentValue].ISO3166 === languageToDetect
|
languageObject.languages[currentValue].ISO639 === languageToDetect ||
|
||||||
) {
|
languageObject.languages[currentValue].ISO3166 === languageToDetect
|
||||||
accumulator[currentValue] = languageObject.languages[currentValue];
|
) {
|
||||||
}
|
accumulator[currentValue] = languageObject.languages[currentValue];
|
||||||
return accumulator;
|
}
|
||||||
}, {});
|
return accumulator;
|
||||||
|
}, {});
|
||||||
|
|
||||||
const language = {
|
const language = {
|
||||||
name: Object.getOwnPropertyNames(filteredLanguage)[0],
|
name: Object.getOwnPropertyNames(filteredLanguage)[0],
|
||||||
ISO3166: filteredLanguage[Object.keys(filteredLanguage)[0]].ISO3166,
|
ISO3166: filteredLanguage[Object.keys(filteredLanguage)[0]].ISO3166,
|
||||||
ISO639: filteredLanguage[Object.keys(filteredLanguage)[0]].ISO639,
|
ISO639: filteredLanguage[Object.keys(filteredLanguage)[0]].ISO639,
|
||||||
IETF: filteredLanguage[Object.keys(filteredLanguage)[0]].IETF
|
IETF: filteredLanguage[Object.keys(filteredLanguage)[0]].IETF
|
||||||
};
|
};
|
||||||
|
|
||||||
return language;
|
return language;
|
||||||
}
|
} catch (e) {
|
||||||
|
// console.error(error);
|
||||||
document.body.querySelector('#emojis').addEventListener('click', () => {
|
return 'error';
|
||||||
emojiPicker.style.visibility === 'visible' ? (emojiPicker.style.visibility = 'hidden') : (emojiPicker.style.visibility = 'visible');
|
|
||||||
});
|
|
||||||
|
|
||||||
document.body.addEventListener('click', e => {
|
|
||||||
if (e.target.id !== 'emojis' && e.target.nodeName !== 'EMOJI-PICKER' && emojiPicker.style.visibility === 'visible') {
|
|
||||||
emojiPicker.style.visibility = 'hidden';
|
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
|
|
|
||||||
|
|
@ -752,7 +752,7 @@ document.body.querySelector('#ZOOMLEVEL').addEventListener('change', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
document.body.querySelector('emoji-picker').addEventListener('emoji-click', e => {
|
document.body.querySelector('emoji-picker').addEventListener('emoji-click', e => {
|
||||||
console.log(e.detail);
|
// console.log(e.detail);
|
||||||
const div = document.getElementById('textInput');
|
const div = document.getElementById('textInput');
|
||||||
if (e.detail.unicode === undefined) {
|
if (e.detail.unicode === undefined) {
|
||||||
div.value += e.detail.name + ' ';
|
div.value += e.detail.name + ' ';
|
||||||
|
|
|
||||||
|
|
@ -133,17 +133,18 @@ async function displayTwitchMessage(logoUrl, username, messageObject, filteredMe
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
showChatMessage(article);
|
||||||
|
|
||||||
if (settings.LANGUAGE.USE_DETECTION) {
|
if (settings.LANGUAGE.USE_DETECTION) {
|
||||||
await backend.getDetectedLanguage({ message: filteredMessage, messageId, username, logoUrl, formattedMessage }).then(language => {
|
await backend.getDetectedLanguage({ message: filteredMessage, messageId, username, logoUrl, formattedMessage }).then(language => {
|
||||||
|
console.log(language);
|
||||||
const languageElement = document.createElement('span');
|
const languageElement = document.createElement('span');
|
||||||
languageElement.classList = `fi fi-${language.ISO3166} fis language-icon`;
|
languageElement.classList = `fi fi-${language.ISO3166} fis language-icon flag-icon`;
|
||||||
languageElement.setAttribute('tip', language.name);
|
languageElement.setAttribute('tip', language.name);
|
||||||
article.appendChild(languageElement);
|
article.appendChild(languageElement);
|
||||||
addSingleTooltip(languageElement);
|
addSingleTooltip(languageElement);
|
||||||
|
|
||||||
// Appends the message to the main chat box (shows the message)
|
|
||||||
showChatMessage(article);
|
|
||||||
|
|
||||||
if (filteredMessage && !settings.LANGUAGE.OUTPUT_TO_TTS) {
|
if (filteredMessage && !settings.LANGUAGE.OUTPUT_TO_TTS) {
|
||||||
sound.playVoice({
|
sound.playVoice({
|
||||||
filteredMessage,
|
filteredMessage,
|
||||||
|
|
@ -154,16 +155,14 @@ async function displayTwitchMessage(logoUrl, username, messageObject, filteredMe
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
window.article = article;
|
// window.article = article;
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
showChatMessage(article);
|
|
||||||
|
|
||||||
if (filteredMessage) {
|
if (filteredMessage) {
|
||||||
sound.playVoice({ filteredMessage, logoUrl, username, formattedMessage });
|
sound.playVoice({ filteredMessage, logoUrl, username, formattedMessage });
|
||||||
}
|
}
|
||||||
|
|
||||||
window.article = article;
|
// window.article = article;
|
||||||
}
|
}
|
||||||
|
|
||||||
sound.playNotificationSound();
|
sound.playNotificationSound();
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue