Skip to content

Commit

Permalink
reworked translation widget to work with and without global widget used
Browse files Browse the repository at this point in the history
  • Loading branch information
LorenzoJokhan committed Apr 22, 2024
1 parent 82025f9 commit c1124ed
Show file tree
Hide file tree
Showing 2 changed files with 216 additions and 171 deletions.
336 changes: 185 additions & 151 deletions packages/cms/lib/modules/openstad-global/public/js/always.js
@@ -1,177 +1,211 @@
apos.on('ready', function () {
var firstTimeLoading = true;
var nodes = [];
var nlContents = [];

var languageSelectContainer = $('.language-select-container');

$('#translation-widget-select-global')
.on('change', function (e) {
changeLanguage(e);
});
var translatedFirstTimeLoadingGlobal = true;
var translationNodesGlobal = [];
var traslationNlContentsGlobal = [];

function setSelectDisabled(select) {
select.setAttribute('disabled', true);
languageSelectContainer.addClass('languageLoading');
};

function setSelectEnabled(select) {
select.removeAttribute('disabled');
languageSelectContainer.removeClass('languageLoading');
};

function saveLanguagePreference(targetLanguageCode) {
try{
localStorage.setItem("targetLanguageCode", targetLanguageCode);
} catch(quotaExceededError) {
console.log("Could not save the language preference");
}
apos.on('ready', function () {
$('#translation-widget-select-global').on('change', function (e) {
if (translatedFirstTimeLoadingGlobal) {
translationNodesGlobal = handleNode(translationNodesGlobal);
traslationNlContentsGlobal = getNlContentsFromNodes(
translationNodesGlobal
);
translatedFirstTimeLoadingGlobal = false;
}
changeLanguage(e, translationNodesGlobal, traslationNlContentsGlobal);
});

var select = document.querySelector('#translation-widget-select-global');
var isNormalUser = !hasModeratorRights; // references global var specified in layout.js
if (isNormalUser && select) {
setSelectedLanguage(localStorage.getItem('targetLanguageCode'));
} else if (select) {
select.setAttribute('disabled', true);
}
});

function changeLanguage(e, nodes = [], nlContents = []) {
var select = e.target;
var targetLanguageCode = select.value;
setSelectDisabled(select);

if (targetLanguageCode === 'nl') {
console.log(
'Language is set to the default: ' +
targetLanguageCode +
'. No need to translate'
);
changeTextInNodes(nlContents, nodes);
setSelectEnabled(select);
saveLanguagePreference(targetLanguageCode);
syncOtherTranslationWidgets(targetLanguageCode);
} else {
console.log('translating to', targetLanguageCode);

var toastContainer = document.querySelector('#openstad-toast');
addToast(toastContainer, 'info', 'De pagina wordt vertaald...', 5000);

$.ajax({
url: '/modules/translation-widgets/submit',
method: 'POST',
contentType: 'application/json',
data: JSON.stringify({
contents: nlContents,
sourceLanguageCode: 'nl',
targetLanguageCode: targetLanguageCode,
origin: window.location.href,
}),
success: function (sentences) {
saveLanguagePreference(targetLanguageCode);
sentences = sentences.map(function (sentence) {
return sentence.text;
});
changeTextInNodes(sentences, nodes);
setSelectEnabled(select);
addToast(toastContainer, 'success', 'De pagina is succesvol vertaald');
syncOtherTranslationWidgets(targetLanguageCode);
},
error: function () {
setSelectEnabled(select);
// setSelectedLanguage('nl');
addToast(toastContainer, 'error', 'De pagina kon niet worden vertaald');
},
});
}
}

function getNlContentsFromNodes(nodes) {
return nodes.map(function (itemToTranslate) {
return itemToTranslate.orgText;
});
}

function changeLanguage (e) {
var select = e.target;
var targetLanguageCode = select.value;
setSelectDisabled(select);
var node = document.body;

if (firstTimeLoading) {
nodes = handleNode(node, nodes);
nlContents = nodes.map(function(itemToTranslate) { return itemToTranslate.orgText });
firstTimeLoading = false;
}
function getSelectContainer() {
return $('.language-select-container');
}

if (targetLanguageCode === 'nl') {
console.log("Language is set to the default: " + targetLanguageCode +". No need to translate");
changeTextInNodes(nlContents, nodes);
setSelectEnabled(select);
saveLanguagePreference(targetLanguageCode);
syncOtherTranslationWidgets(targetLanguageCode);
} else {
console.log('translating to', targetLanguageCode);

var toastContainer = document.querySelector("#openstad-toast");
addToast(toastContainer, "info", "De pagina wordt vertaald...", 5000);

$.ajax({
url: '/modules/translation-widgets/submit',
method: 'POST',
contentType: "application/json",
data: JSON.stringify({
contents: nlContents,
sourceLanguageCode: 'nl',
targetLanguageCode: targetLanguageCode,
origin: window.location.href
}),
success: function (sentences) {
saveLanguagePreference(targetLanguageCode);
sentences = sentences.map(function(sentence) { return sentence.text });
changeTextInNodes(sentences, nodes);
setSelectEnabled(select);
addToast(toastContainer, "success", "De pagina is succesvol vertaald");
syncOtherTranslationWidgets(targetLanguageCode);
},
error: function() {
setSelectEnabled(select);
// setSelectedLanguage('nl');
addToast(toastContainer, "error", "De pagina kon niet worden vertaald");
}
});
}
};
function setSelectDisabled(select) {
var languageSelectContainer = getSelectContainer();
select.setAttribute('disabled', true);

if (languageSelectContainer) {
languageSelectContainer.addClass('languageLoading');
}
}

var select = document.querySelector('#translation-widget-select-global');
var isNormalUser = !hasModeratorRights; // references global var specified in layout.js
if(isNormalUser) {
setSelectedLanguage(localStorage.getItem('targetLanguageCode'));
} else if(select) {
select.setAttribute('disabled', true);
}
});
function setSelectEnabled(select) {
var languageSelectContainer = getSelectContainer();
select.removeAttribute('disabled');

if (languageSelectContainer) {
languageSelectContainer.removeClass('languageLoading');
}
}

function changeTextInNodes (sentences, nodes) {
sentences.forEach(function (sentence, index) {
nodes[index].node.textContent = sentence;
});
function changeTextInNodes(sentences, nodes) {
sentences.forEach(function (sentence, index) {
nodes[index].node.textContent = sentence;
});
}

function handleNode (node, toBeTranslated) {
var childNodes = node.childNodes;
for (var i = 0; i < childNodes.length; i++) {
if (childNodes[i].nodeType == Node.ELEMENT_NODE) {
var nodeName = childNodes[i].nodeName.toLowerCase();
if (nodeName != 'script' && nodeName != 'style') {
handleNode(childNodes[i], toBeTranslated);
}
} else if (childNodes[i].nodeType == Node.TEXT_NODE) {
var parentElement = childNodes[i].parentElement;
var shouldTranslate = parentElement && parentElement.getAttribute('translate') !== 'no';

if (shouldTranslate) {
var textContent = childNodes[i].textContent;

if (textContent) {
toBeTranslated.push({
node: childNodes[i],
orgText: textContent,
})
}
}
function handleNode(toBeTranslated, node = document.body) {
var childNodes = node.childNodes;
for (var i = 0; i < childNodes.length; i++) {
if (childNodes[i].nodeType == Node.ELEMENT_NODE) {
var nodeName = childNodes[i].nodeName.toLowerCase();
if (nodeName != 'script' && nodeName != 'style') {
handleNode(toBeTranslated, childNodes[i]);
}
} else if (childNodes[i].nodeType == Node.TEXT_NODE) {
var parentElement = childNodes[i].parentElement;
var shouldTranslate =
parentElement && parentElement.getAttribute('translate') !== 'no';

if (shouldTranslate) {
var textContent = childNodes[i].textContent;

if (textContent) {
toBeTranslated.push({
node: childNodes[i],
orgText: textContent,
});
}
}
}
return toBeTranslated;
}
return toBeTranslated;
}


function addToast(container, typeOfInfoErrorOrSuccess, text, timeout, onClick) {
if(container) {
var wrapperElement = document.createElement("div");
var messageElement = document.createElement("p");

if(typeOfInfoErrorOrSuccess === 'success') {
wrapperElement.setAttribute("class", "toast-wrapper toast-success");
} else if(typeOfInfoErrorOrSuccess === 'info') {
wrapperElement.setAttribute("class", "toast-wrapper toast-info");
} else if(typeOfInfoErrorOrSuccess === 'error') {
wrapperElement.setAttribute("class", "toast-wrapper toast-error");
}
messageElement.appendChild(document.createTextNode(text));
wrapperElement.appendChild(messageElement);

if(!timeout || timeout === 0) {
var removeButton = document.createElement("button");
var removeIcon = document.createElement("span");
removeIcon.setAttribute("class", " fa fa-times-circle");
removeButton.appendChild(removeIcon);

removeButton.onclick = function() {
container.removeChild(wrapperElement);
onClick && onClick();
};
wrapperElement.appendChild(removeButton);
}

container.appendChild(wrapperElement);

if(Number.isInteger(timeout) && timeout > 0) {
setTimeout(function(){
container.removeChild(wrapperElement);
}, timeout);
}
if (container) {
var wrapperElement = document.createElement('div');
var messageElement = document.createElement('p');

if (typeOfInfoErrorOrSuccess === 'success') {
wrapperElement.setAttribute('class', 'toast-wrapper toast-success');
} else if (typeOfInfoErrorOrSuccess === 'info') {
wrapperElement.setAttribute('class', 'toast-wrapper toast-info');
} else if (typeOfInfoErrorOrSuccess === 'error') {
wrapperElement.setAttribute('class', 'toast-wrapper toast-error');
}
messageElement.appendChild(document.createTextNode(text));
wrapperElement.appendChild(messageElement);

if (!timeout || timeout === 0) {
var removeButton = document.createElement('button');
var removeIcon = document.createElement('span');
removeIcon.setAttribute('class', ' fa fa-times-circle');
removeButton.appendChild(removeIcon);

removeButton.onclick = function () {
container.removeChild(wrapperElement);
onClick && onClick();
};
wrapperElement.appendChild(removeButton);
}

container.appendChild(wrapperElement);


if (Number.isInteger(timeout) && timeout > 0) {
setTimeout(function () {
container.removeChild(wrapperElement);
}, timeout);
}
}
}

// If there is a global select, let it handle managing the state of all translation-selects. If not the translation widget has already done its work, just update the other translation widgets
function setSelectedLanguage(language) {
$('#translation-widget-select-global').val(language ? language : 'nl').trigger('change');
const globalLangSelect = $('#translation-widget-select-global');
if(globalLangSelect) {
$('#translation-widget-select-global')
.val(language ? language : 'nl')
.trigger('change');
} else {
syncOtherTranslationWidgets(language);
}

}

function syncOtherTranslationWidgets(language) {
document.querySelectorAll("#translation-widget-select").forEach(function(select) {
function syncGlobalTranslationWidgets(language) {
document
.querySelectorAll('#translation-widget-select-global')
.forEach(function (select) {
select.value = language ? language : 'nl';
});
}

function syncOtherTranslationWidgets(language) {
document
.querySelectorAll('#translation-widget-select')
.forEach(function (select) {
select.value = language ? language : 'nl';
});
}
}

function saveLanguagePreference(targetLanguageCode) {
try {
localStorage.setItem('targetLanguageCode', targetLanguageCode);
} catch (quotaExceededError) {
console.log('Could not save the language preference');
}
}

0 comments on commit c1124ed

Please sign in to comment.