// Banchi di prova delle traduzioni (node, fuori dal pacchetto RPM). // node tests/i18n.test.js // Verifica che i quattro cataloghi abbiano le stesse chiavi dell'app Flutter, // che i segnaposto '{}' siano conservati e che t() li sostituisca come fa il // TranslationService originale. var I18N = require("../qml/js/i18n.js"); var CATALOG = require("../qml/js/catalog.js"); var failures = 0; function check(name, got, expected) { var ok = JSON.stringify(got) === JSON.stringify(expected); if (!ok) failures++; console.log((ok ? "OK " : "FAIL ") + name + " got=" + JSON.stringify(got) + (ok ? "" : " expected=" + JSON.stringify(expected))); } var S = I18N.HF_STRINGS; check("quattro lingue", I18N.availableLanguages(), ["de", "en", "fr", "it"]); // stesse chiavi in tutte le lingue (contratto fra i cataloghi) var enKeys = Object.keys(S.en).sort(); ["it", "fr", "de"].forEach(function (lang) { var keys = Object.keys(S[lang]).sort(); var missing = enKeys.filter(function (k) { return keys.indexOf(k) === -1; }); var extra = keys.filter(function (k) { return enKeys.indexOf(k) === -1; }); check(lang + ": stesse chiavi dell'inglese (" + enKeys.length + ")", [missing, extra], [[], []]); }); // nessuna traduzione vuota ["en", "it", "fr", "de"].forEach(function (lang) { var empty = enKeys.filter(function (k) { return !String(S[lang][k] || "").trim(); }); check(lang + ": nessuna voce vuota", empty, []); }); // segnaposto coerenti fra le lingue enKeys.forEach(function (k) { var n = (String(S.en[k]).match(/\{\}/g) || []).length; ["it", "fr", "de"].forEach(function (lang) { var m = (String(S[lang][k]).match(/\{\}/g) || []).length; if (m !== n) { failures++; console.log("FAIL segnaposto in '" + k + "' (" + lang + "): " + m + " invece di " + n); } }); }); console.log("OK segnaposto '{}' coerenti in tutte le lingue"); // t(): sostituzione, array, fallback check("t() senza segnaposto", I18N.t("new_order", null, "it"), "Nuovo ordine"); check("t() con un argomento", I18N.t("in_days", "3", "it").indexOf("3") >= 0, true); check("t() con array", I18N.t("share_order_msg", ["Marans", "2", "28/04/2026"], "en").indexOf("Marans") >= 0, true); check("t() lingua sconosciuta -> inglese", I18N.t("new_order", null, "xx"), S.en.new_order); check("t() chiave sconosciuta -> chiave", I18N.t("chiave_inesistente", null, "it"), "chiave_inesistente"); // lingua effettiva: 'system' segue il telefono check("langFor: scelta esplicita", I18N.langFor("fr", "it_IT"), "fr"); check("langFor: system -> lingua del telefono", I18N.langFor("system", "de_DE"), "de"); check("langFor: system non supportata -> inglese", I18N.langFor("system", "es_ES"), "en"); check("langFor: scelta non valida -> inglese", I18N.langFor("xx", "it_IT"), "en"); // il testo con a capo e' una vera nuova riga (in main.dart e' '\n') check("newline reale (no_breeds_sel)", S.it.no_breeds_sel.indexOf("\n") > 0, true); check("nessun backslash-n letterale nel testo", S.it.no_breeds_sel.indexOf("\\n") === -1, true); // contratto: nessuna chiave resta non tradotta (l'app originale, senza // fallback, mostrava la chiave stessa: in francese "name_generic"). // L'inglese e' escluso: li' la chiave 'hens' ha come testo "hens", parola vera. ["it", "fr", "de"].forEach(function (lang) { var leaked = enKeys.filter(function (k) { return I18N.t(k, null, lang) === k; }); check(lang + ": nessuna chiave grezza a schermo", leaked, []); }); // catalogo razze var ids = CATALOG.HF_BREEDS.map(function (b) { return b.id; }); check("7 razze nel catalogo", ids.length, 7); check("le razze dello store ci sono", ["marans", "araucana", "olive", "livorno", "sussex", "australorp", "generic"].every(function (id) { return ids.indexOf(id) >= 0; }), true); check("nome/descrizione sono chiavi tradotte", CATALOG.HF_BREEDS.every(function (b) { return S.en[b.name] !== undefined && S.en[b.description] !== undefined && S.en[b.eggColor] !== undefined; }), true); check("breedFromId sconosciuto -> null", CATALOG.breedFromId("nope"), null); check("percorso foto installata", CATALOG.HF_BREEDS[0].asset, "/usr/share/harbour-henflow/breeds/marans.jpg"); console.log(failures === 0 ? "\ntutti i controlli superati" : "\n" + failures + " controlli falliti"); process.exit(failures === 0 ? 0 : 1);