iobroker.lovelace
Version:
With this adapter you can build visualization for ioBroker with Home Assistant Lovelace UI
116 lines (108 loc) • 3.64 kB
JavaScript
const axios = require('axios');
/**
* Tests whether the given variable is a real object and not an Array
*
* @param {any} it The variable to test
* @returns {it is Record<string, any>} Whether the variable is a real object
*/
function isObject(it) {
// This is necessary because:
// typeof null === 'object'
// typeof [] === 'object'
// [] instanceof Object === true
return Object.prototype.toString.call(it) === '[object Object]';
}
/**
* Tests whether the given variable is really an Array
*
* @param {any} it The variable to test
* @returns {it is any[]} Whether the variable is an Array
*/
function isArray(it) {
if (typeof Array.isArray === 'function') {
return Array.isArray(it);
}
return Object.prototype.toString.call(it) === '[object Array]';
}
/**
* Translates text to the target language. Automatically chooses the right translation API.
*
* @param {string} text The text to translate
* @param {string} targetLang The target languate
* @param {string} [yandexApiKey] The yandex API key. You can create one for free at https://translate.yandex.com/developers
* @returns {Promise<string>} The translated text
*/
async function translateText(text, targetLang, yandexApiKey) {
if (targetLang === 'en') {
return text;
}
if (yandexApiKey) {
return await translateYandex(text, targetLang, yandexApiKey);
} else {
return await translateGoogle(text, targetLang);
}
}
/**
* Translates text with Yandex API
*
* @param {string} text The text to translate
* @param {string} targetLang The target language
* @param {string} [apiKey] The yandex API key. You can create one for free at https://translate.yandex.com/developers
* @returns {Promise<string>} The translated text
*/
async function translateYandex(text, targetLang, apiKey) {
if (targetLang === 'zh-cn') {
targetLang = 'zh';
}
try {
const url = `https://translate.yandex.net/api/v1.5/tr.json/translate?key=${apiKey}&text=${encodeURIComponent(text)}&lang=en-${targetLang}`;
const response = await axios({ url, timeout: 15000 });
if (response.data && response.data['text']) {
return response.data['text'][0];
}
throw new Error('Invalid response for translate request');
} catch (e) {
throw new Error(`Could not translate to "${targetLang}": ${e}`);
}
}
async function delay(t) {
return new Promise(function (resolve) {
setTimeout(function () {
resolve();
}, t);
});
}
let countTranslations = 0;
/**
* Translates text with Google API
*
* @param {string} text The text to translate
* @param {string} targetLang The target languate
* @returns {Promise<string>} The translated text
*/
async function translateGoogle(text, targetLang) {
if (countTranslations > 0) {
if (countTranslations % 10 === 0) {
await delay(15000);
} else {
await delay(2000);
}
}
try {
const url = `http://translate.googleapis.com/translate_a/single?client=gtx&sl=en&tl=${targetLang}&dt=t&q=${encodeURIComponent(text)}&ie=UTF-8&oe=UTF-8`;
const response = await axios({ url, timeout: 15000 });
if (isArray(response.data)) {
countTranslations += 1;
// we got a valid response
return response.data[0][0][0];
}
throw new Error('Invalid response for translate request');
} catch (e) {
throw new Error(`Could not translate to "${targetLang}": ${e}`);
}
}
module.exports = {
isArray,
isObject,
translateText,
};