mirror of
https://github.com/jokob-sk/NetAlertX.git
synced 2026-04-03 16:51:24 -07:00
Merge branch 'main' of github.com:netalertx/NetAlertX
This commit is contained in:
@@ -37,7 +37,7 @@
|
||||
body, .bg-yellow, .callout.callout-warning, .alert-warning, .label-warning, .modal-warning .modal-body {
|
||||
|
||||
background-color: #353c42 !important;
|
||||
color: #bec5cb !important;
|
||||
color: #ffffff !important;
|
||||
}
|
||||
h4 {
|
||||
color: #44def1;
|
||||
|
||||
@@ -387,78 +387,15 @@ function getString(key) {
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Get current language ISO code
|
||||
// below has to match exactly the values in /front/php/templates/language/lang.php & /front/js/common.js
|
||||
// Get current language ISO code.
|
||||
// The UI_LANG setting value is always in the form "Name (code)", e.g. "English (en_us)".
|
||||
// Extracting the code with a regex means this function never needs updating when a
|
||||
// new language is added — the single source of truth is languages.json.
|
||||
function getLangCode() {
|
||||
|
||||
UI_LANG = getSetting("UI_LANG");
|
||||
|
||||
let lang_code = 'en_us';
|
||||
|
||||
switch (UI_LANG) {
|
||||
case 'English (en_us)':
|
||||
lang_code = 'en_us';
|
||||
break;
|
||||
case 'Spanish (es_es)':
|
||||
lang_code = 'es_es';
|
||||
break;
|
||||
case 'German (de_de)':
|
||||
lang_code = 'de_de';
|
||||
break;
|
||||
case 'Farsi (fa_fa)':
|
||||
lang_code = 'fa_fa';
|
||||
break;
|
||||
case 'French (fr_fr)':
|
||||
lang_code = 'fr_fr';
|
||||
break;
|
||||
case 'Norwegian (nb_no)':
|
||||
lang_code = 'nb_no';
|
||||
break;
|
||||
case 'Polish (pl_pl)':
|
||||
lang_code = 'pl_pl';
|
||||
break;
|
||||
case 'Portuguese (pt_br)':
|
||||
lang_code = 'pt_br';
|
||||
break;
|
||||
case 'Portuguese (pt_pt)':
|
||||
lang_code = 'pt_pt';
|
||||
break;
|
||||
case 'Turkish (tr_tr)':
|
||||
lang_code = 'tr_tr';
|
||||
break;
|
||||
case 'Swedish (sv_sv)':
|
||||
lang_code = 'sv_sv';
|
||||
break;
|
||||
case 'Italian (it_it)':
|
||||
lang_code = 'it_it';
|
||||
break;
|
||||
case 'Japanese (ja_jp)':
|
||||
lang_code = 'ja_jp';
|
||||
break;
|
||||
case 'Russian (ru_ru)':
|
||||
lang_code = 'ru_ru';
|
||||
break;
|
||||
case 'Chinese (zh_cn)':
|
||||
lang_code = 'zh_cn';
|
||||
break;
|
||||
case 'Czech (cs_cz)':
|
||||
lang_code = 'cs_cz';
|
||||
break;
|
||||
case 'Arabic (ar_ar)':
|
||||
lang_code = 'ar_ar';
|
||||
break;
|
||||
case 'Catalan (ca_ca)':
|
||||
lang_code = 'ca_ca';
|
||||
break;
|
||||
case 'Ukrainian (uk_uk)':
|
||||
lang_code = 'uk_ua';
|
||||
break;
|
||||
case 'Vietnamese (vi_vn)':
|
||||
lang_code = 'vi_vn';
|
||||
break;
|
||||
}
|
||||
|
||||
return lang_code;
|
||||
const match = (UI_LANG || '').match(/\(([a-z]{2}_[a-z]{2})\)\s*$/i);
|
||||
return match ? match[1].toLowerCase() : 'en_us';
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
@@ -12,11 +12,9 @@ var timerRefreshData = ''
|
||||
|
||||
var emptyArr = ['undefined', "", undefined, null, 'null'];
|
||||
var UI_LANG = "English (en_us)";
|
||||
const allLanguages = ["ar_ar","ca_ca","cs_cz","de_de",
|
||||
"en_us","es_es","fa_fa","fr_fr",
|
||||
"it_it","ja_jp","nb_no","pl_pl",
|
||||
"pt_br","pt_pt","ru_ru","sv_sv",
|
||||
"tr_tr","uk_ua","vi_vn","zh_cn"]; // needs to be same as in lang.php
|
||||
// allLanguages is populated at init via fetchAllLanguages() from GET /languages.
|
||||
// Do not hardcode this list — add new languages to languages.json instead.
|
||||
let allLanguages = [];
|
||||
var settingsJSON = {}
|
||||
|
||||
// NAX_CACHE_VERSION and CACHE_KEYS moved to cache.js
|
||||
@@ -24,6 +22,25 @@ var settingsJSON = {}
|
||||
|
||||
// getCache, setCache, fetchJson, getAuthContext moved to cache.js
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
// Fetch the canonical language list from GET /languages and populate allLanguages.
|
||||
// Must be called after the API token is available (e.g. alongside cacheStrings).
|
||||
// -----------------------------------------------------------------------------
|
||||
function fetchAllLanguages(apiToken) {
|
||||
return fetch('/languages', {
|
||||
headers: { 'Authorization': 'Bearer ' + apiToken }
|
||||
})
|
||||
.then(function(resp) { return resp.json(); })
|
||||
.then(function(data) {
|
||||
if (data && data.success && Array.isArray(data.languages)) {
|
||||
allLanguages = data.languages.map(function(l) { return l.code; });
|
||||
}
|
||||
})
|
||||
.catch(function(err) {
|
||||
console.warn('[fetchAllLanguages] Failed to load language list:', err);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
function setCookie (cookie, value, expirationMinutes='') {
|
||||
|
||||
@@ -744,9 +744,6 @@ function getStatusBadgeParts(devPresentLastScan, devAlertDown, devFlapping, devM
|
||||
let status = 'unknown';
|
||||
let cssText = '';
|
||||
|
||||
console.log(devFlapping);
|
||||
|
||||
|
||||
if (devPresentLastScan == 1 && devFlapping == 0) {
|
||||
css = 'bg-green text-white statusOnline';
|
||||
cssText = 'text-green';
|
||||
|
||||
@@ -5,43 +5,20 @@
|
||||
// ###################################
|
||||
|
||||
$defaultLang = "en_us";
|
||||
$allLanguages = [ "ar_ar", "ca_ca", "cs_cz", "de_de",
|
||||
"en_us", "es_es", "fa_fa", "fr_fr",
|
||||
"it_it", "ja_jp", "nb_no", "pl_pl",
|
||||
"pt_br", "pt_pt", "ru_ru", "sv_sv",
|
||||
"tr_tr", "uk_ua", "vi_vn", "zh_cn"];
|
||||
|
||||
// Load the canonical language list from languages.json — do not hardcode here.
|
||||
$_langJsonPath = dirname(__FILE__) . '/languages.json';
|
||||
$_langJson = json_decode(file_get_contents($_langJsonPath), true);
|
||||
$allLanguages = array_column($_langJson['languages'], 'code');
|
||||
|
||||
global $db;
|
||||
|
||||
$result = $db->querySingle("SELECT setValue FROM Settings WHERE setKey = 'UI_LANG'");
|
||||
|
||||
// below has to match exactly the values in /front/php/templates/language/lang.php & /front/js/common.js
|
||||
switch($result){
|
||||
case 'Arabic (ar_ar)': $pia_lang_selected = 'ar_ar'; break;
|
||||
case 'Catalan (ca_ca)': $pia_lang_selected = 'ca_ca'; break;
|
||||
case 'Czech (cs_cz)': $pia_lang_selected = 'cs_cz'; break;
|
||||
case 'German (de_de)': $pia_lang_selected = 'de_de'; break;
|
||||
case 'English (en_us)': $pia_lang_selected = 'en_us'; break;
|
||||
case 'Spanish (es_es)': $pia_lang_selected = 'es_es'; break;
|
||||
case 'Farsi (fa_fa)': $pia_lang_selected = 'fa_fa'; break;
|
||||
case 'French (fr_fr)': $pia_lang_selected = 'fr_fr'; break;
|
||||
case 'Italian (it_it)': $pia_lang_selected = 'it_it'; break;
|
||||
case 'Japanese (ja_jp)': $pia_lang_selected = 'ja_jp'; break;
|
||||
case 'Norwegian (nb_no)': $pia_lang_selected = 'nb_no'; break;
|
||||
case 'Polish (pl_pl)': $pia_lang_selected = 'pl_pl'; break;
|
||||
case 'Portuguese (pt_br)': $pia_lang_selected = 'pt_br'; break;
|
||||
case 'Portuguese (pt_pt)': $pia_lang_selected = 'pt_pt'; break;
|
||||
case 'Russian (ru_ru)': $pia_lang_selected = 'ru_ru'; break;
|
||||
case 'Swedish (sv_sv)': $pia_lang_selected = 'sv_sv'; break;
|
||||
case 'Turkish (tr_tr)': $pia_lang_selected = 'tr_tr'; break;
|
||||
case 'Ukrainian (uk_ua)': $pia_lang_selected = 'uk_ua'; break;
|
||||
case 'Vietnamese (vi_vn)': $pia_lang_selected = 'vi_vn'; break;
|
||||
case 'Chinese (zh_cn)': $pia_lang_selected = 'zh_cn'; break;
|
||||
default: $pia_lang_selected = 'en_us'; break;
|
||||
}
|
||||
|
||||
if (isset($pia_lang_selected) == FALSE or (strlen($pia_lang_selected) == 0)) {$pia_lang_selected = $defaultLang;}
|
||||
// Extract the language code from the display value, e.g. "English (en_us)" => "en_us".
|
||||
// This regex means lang.php never needs updating when a new language is added.
|
||||
preg_match('/\(([a-z]{2}_[a-z]{2})\)\s*$/i', (string) $result, $_langMatch);
|
||||
$pia_lang_selected = isset($_langMatch[1]) ? strtolower($_langMatch[1]) : $defaultLang;
|
||||
|
||||
$result = $db->query("SELECT * FROM Plugins_Language_Strings");
|
||||
$strings = array();
|
||||
|
||||
25
front/php/templates/language/languages.json
Normal file
25
front/php/templates/language/languages.json
Normal file
@@ -0,0 +1,25 @@
|
||||
{
|
||||
"default": "en_us",
|
||||
"languages": [
|
||||
{ "code": "ar_ar", "display": "Arabic (ar_ar)" },
|
||||
{ "code": "ca_ca", "display": "Catalan (ca_ca)" },
|
||||
{ "code": "cs_cz", "display": "Czech (cs_cz)" },
|
||||
{ "code": "de_de", "display": "German (de_de)" },
|
||||
{ "code": "en_us", "display": "English (en_us)" },
|
||||
{ "code": "es_es", "display": "Spanish (es_es)" },
|
||||
{ "code": "fa_fa", "display": "Farsi (fa_fa)" },
|
||||
{ "code": "fr_fr", "display": "French (fr_fr)" },
|
||||
{ "code": "it_it", "display": "Italian (it_it)" },
|
||||
{ "code": "ja_jp", "display": "Japanese (ja_jp)" },
|
||||
{ "code": "nb_no", "display": "Norwegian (nb_no)" },
|
||||
{ "code": "pl_pl", "display": "Polish (pl_pl)" },
|
||||
{ "code": "pt_br", "display": "Portuguese (pt_br)" },
|
||||
{ "code": "pt_pt", "display": "Portuguese (pt_pt)" },
|
||||
{ "code": "ru_ru", "display": "Russian (ru_ru)" },
|
||||
{ "code": "sv_sv", "display": "Swedish (sv_sv)" },
|
||||
{ "code": "tr_tr", "display": "Turkish (tr_tr)" },
|
||||
{ "code": "uk_ua", "display": "Ukrainian (uk_ua)" },
|
||||
{ "code": "vi_vn", "display": "Vietnamese (vi_vn)" },
|
||||
{ "code": "zh_cn", "display": "Chinese (zh_cn)" }
|
||||
]
|
||||
}
|
||||
@@ -31,13 +31,22 @@ def merge_translations(main_file, other_files):
|
||||
f.truncate()
|
||||
|
||||
|
||||
def load_language_codes(languages_json_path):
|
||||
"""Read language codes from languages.json, guaranteeing en_us is first."""
|
||||
with open(languages_json_path, "r", encoding="utf-8") as f:
|
||||
data = json.load(f)
|
||||
codes = [entry["code"] for entry in data["languages"]]
|
||||
# Ensure en_us (the master) is always first
|
||||
if "en_us" in codes:
|
||||
codes.remove("en_us")
|
||||
codes.insert(0, "en_us")
|
||||
return codes
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
current_path = os.path.dirname(os.path.abspath(__file__))
|
||||
# language codes can be found here: http://www.lingoes.net/en/translator/langcode.htm
|
||||
# ⚠ "en_us.json" has to be first!
|
||||
json_files = ["en_us.json", "ar_ar.json", "ca_ca.json", "cs_cz.json", "de_de.json",
|
||||
"es_es.json", "fa_fa.json", "fr_fr.json", "it_it.json", "ja_jp.json",
|
||||
"nb_no.json", "pl_pl.json", "pt_br.json", "pt_pt.json", "ru_ru.json",
|
||||
"sv_sv.json", "tr_tr.json", "vi_vn.json", "uk_ua.json", "zh_cn.json"]
|
||||
file_paths = [os.path.join(current_path, file) for file in json_files]
|
||||
# language codes are loaded from languages.json — add a new language there
|
||||
languages_json = os.path.join(current_path, "languages.json")
|
||||
codes = load_language_codes(languages_json)
|
||||
file_paths = [os.path.join(current_path, f"{code}.json") for code in codes]
|
||||
merge_translations(file_paths[0], file_paths[1:])
|
||||
|
||||
Reference in New Issue
Block a user