Quellcode durchsuchen

Merging i18n fix

Lucas de Souza vor 5 Jahren
Ursprung
Commit
c287043fa6

+ 6 - 1
i18n/pt/error.json

@@ -88,5 +88,10 @@
   "test_case_failed_exception": "Caso de teste $0 falhou: $1",
   "invalid_type_conversion": "O valor $0 não pode ser convertido para o tipo $1",
   "invalid_read_type":"A entrada \"$0\" não é do tipo $1, que é o tipo da variável <span class='ivprog-error-varname'>$2</span>.",
-  "invalid_read_type_array":"A entrada \"$0\" não é do tipo $1, que é o tipo aceito pela variável <span class='ivprog-error-varname'>$2</span> que é um $3."
+  "invalid_read_type_array":"A entrada \"$0\" não é do tipo $1, que é o tipo aceito pela variável <span class='ivprog-error-varname'>$2</span> que é um $3.",
+  "inform_valid_identifier": "Informe um nome válido! O nome não pode ser uma palavra reservadoa e deve começar com letras e conter apenas letras, números e _",
+  "inform_valid_global_duplicated": "Já existe uma variável global com o nome <span class='ivprog-error-varname'>$0</span>, você precisa de nomes distintos.",
+  "inform_valid_variable_duplicated" : "Já existe uma variável com o nome <span class='ivprog-error-varname'>$0</span> na função <span class='ivprog-error-varname'>$1</span>, você precisa de nomes distintos.",
+  "inform_valid_function_duplicated" : "Já existe uma função com o nome <span class='ivprog-error-varname'>$0</span>, você precisa de nomes distintos.",
+  "inform_valid_param_duplicated" : "Já existe um parâmetro com o nome <span class='ivprog-error-varname'>$0</span> na função <span class='ivprog-error-varname'>$1</span>, você precisa de nomes distintos."
 }

+ 21 - 57
i18n/pt/ui.json

@@ -10,18 +10,18 @@
   "btn_break":"Pare",
   "btn_case":"Caso",
   "start": "inicio",
-  "void": "vazio",
-  "integer": "inteiro",
-  "and": "E",
-  "or": "OU",
-  "not": "nao",
-  "real": "real",
+  "type_void": "vazio",
+  "type_integer": "inteiro",
+  "logic_operator_and": "E",
+  "logic_operator_or": "OU",
+  "logic_operator_not": "nao",
+  "type_real": "real",
   "program": "programa",
-  "text": "cadeia",
-  "text_start": "texto",
-  "boolean": "logico",
-  "true": "verdadeiro",
-  "false": "falso",
+  "type_text": "cadeia",
+  "textvar_default_value": "texto",
+  "type_boolean": "logico",
+  "logic_value_true": "verdadeiro",
+  "logic_value_false": "falso",
   "variable": "Variável",
   "command": "Comando",
   "new_parameter": "parametro",
@@ -39,9 +39,9 @@
   "text_return":"retorne",
   "text_btn_return":"Retorno",
   "text_comment": "Comentário",
-  "join_or": "ou",
-  "matrix_string": "matriz de $0",
-  "vector_string": "vetor de $0",
+  "string_join_or": "ou",
+  "matrix_info_string": "matriz de $0",
+  "vector_info_string": "vetor de $0",
   "text_attribution": "Atribuição",
   "text_if":"se",
   "text_break":"pare",
@@ -87,10 +87,10 @@
   "text_header_ivprog_functions": "Funções do iVProg",
   "text_menu_functions_math":"Matemática",
   "text_menu_functions_text":"Texto",
-  "text_menu_functions_arrangement":"Arranjo",
+  "text_menu_functions_array":"Arranjo",
   "text_menu_functions_conversion":"Conversão",
-  "text_none_variable":"Nenhuma variável declarada",
-  "text_none_variable_instruction":"Antes de utilizar uma variável, é necessário criá-la",
+  "text_no_variable":"Nenhuma variável declarada",
+  "text_no_variable_instruction":"Antes de utilizar uma variável, é necessário criá-la",
   "text_ivprog_description":"Programação Visual interativa na Internet",
   "tooltip_visual": "Programação visual",
   "tooltip_textual": "Programação textual",
@@ -102,51 +102,15 @@
   "tooltip_evaluate": "Avaliar o programa",
   "tooltip_help": "Ajuda",
   "tooltip_add_global": "Adicionar variável global",
-  "tooltip_minimize": "Ocultar os elementos da função",
-  "tooltip_console": "Abrir/fechar o terminal",
+  "tooltip_hide_function": "Ocultar os elementos da função",
   "var_menu_select_var": "Selecione uma variável",
   "var_menu_select_all": "Selecione",
   "var_menu_select_function": "Selecione uma função",
   "expression_menu_select": "Construir uma expressão lógica",
-  "math": "Matematica",
-  "text_t": "Texto",
-  "inform_valid_name": "Informe um nome válido!",
   "inform_valid_content": "Informe o conteúdo!",
   "inform_valid_expression": "Construa uma expressão lógica!",
-  "inform_valid_name_duplicated": "Este nome já está em uso por outra função!",
-  "inform_valid_global_duplicated": "Já existe uma variável global com o nome informado.",
-  "inform_valid_variable_duplicated" : "Já existe uma variável local com o nome informado.",
-  "arrangement": "Arranjo",
-  "conversion": "Conversao",
-  "terminal_clear":"Limpa o terminal removendo todos os textos",
-  "terminal_show":"Exibe o terminal caso esteja escondido",
-  "terminal_hide":"Esconde o terminal caso não esteja escondido",
-  "$sin": "seno",
-  "$cos": "cosseno",
-  "$tan": "tangente",
-  "$sqrt": "raiz_quadrada",
-  "$pow": "potencia",
-  "$log": "logaritmo",
-  "$abs": "modulo",
-  "$negate": "trocar_sinal",
-  "$invert": "inverter_valor",
-  "$max": "maximo",
-  "$min": "minimo",
-  "$rand": "numero_aleatorio",
-  "$substring": "subcadeia",
-  "$length": "comprimento",
-  "$uppercase": "caixa_alta",
-  "$lowercase": "caixa_baixa",
-  "$charAt": "texto_na_posicao",
-  "$numElements": "total_de_elementos",
-  "$matrixLines": "total_de_linhas",
-  "$matrixColumns": "total_de_colunas",
-  "$isReal": "e_real",
-  "$isInt": "e_inteiro",
-  "$isBool": "e_logico",
-  "$castReal": "como_real",
-  "$castInt": "como_inteiro",
-  "$castBool": "como_logico",
-  "$castString": "como_cadeia",
+  "tooltip_terminal_clear":"Limpa o terminal removendo todos os textos",
+  "tooltip_terminal_show":"Exibe o terminal caso esteja escondido",
+  "tooltip_terminal_hide":"Esconde o terminal caso não esteja escondido",
   "text_ivprog_version":"Versão"
 }

+ 15 - 8
js/io/domConsole.js

@@ -39,7 +39,8 @@ export class DOMConsole {
     return 3;
   }
 
-  constructor (elementID) {
+  constructor (elementID, disableMarginTop = false) {
+    this.disableMarginTop = disableMarginTop;
     this.input = null;
     this.cursorInterval = null;
     this.idleInterval = null;
@@ -119,9 +120,9 @@ export class DOMConsole {
     this.showBtn = bashNode.querySelector('#ivprog-console-showbtn');
     this._setupCursor();
     //Jquery tooltips....
-    $(this.clearBtn).popup({content:LocalizedStrings.getUI("terminal_clear")});
-    $(this.showBtn).popup({content:LocalizedStrings.getUI("terminal_show")});
-    $(this.hideBtn).popup({content:LocalizedStrings.getUI("terminal_hide")});
+    $(this.clearBtn).popup({content:LocalizedStrings.getUI("tooltip_terminal_clear")});
+    $(this.showBtn).popup({content:LocalizedStrings.getUI("tooltip_terminal_show")});
+    $(this.hideBtn).popup({content:LocalizedStrings.getUI("tooltip_terminal_hide")});
   }
 
   _setupCursor () {
@@ -198,10 +199,16 @@ export class DOMConsole {
   }
 
   getOutputText (text) {
+    if(text.trim().length == 0) {
+      text = "&nbsp;";
+    }
     return `<span>${text}</span>`;
   }
 
   getUserInputText (text) {
+    if(text.trim().length == 0) {
+      text = "&nbsp;";
+    }
     return `<i class="icon keyboard outline" style="float:left"></i><span>${text}</span>`;
   }
 
@@ -213,8 +220,7 @@ export class DOMConsole {
   focus () {
     this.termDiv.style.display = 'block';
     // Is in draggable mode?
-    console.log(this.parent.style.top.length);
-    if(this.parent.style.top.length == 0) {
+    if(!this.disableMarginTop && this.parent.style.top.length == 0) {
       this.parent.style.marginTop = "-160px";
     }
     if(!isElementInViewport(this.termDiv))
@@ -224,7 +230,7 @@ export class DOMConsole {
 
   hide () {
     // Is in draggable mode?
-    if(this.parent.style.top.length == 0) {
+    if(!this.disableMarginTop && this.parent.style.top.length == 0) {
       this.parent.style.marginTop = "0";
     }
     this.termDiv.style.display = 'none';
@@ -297,7 +303,8 @@ export class DOMConsole {
   sendOutput (text) {
     const output = ""+text;
     output.split("\n").forEach(t => {
-      t = t.replace(/\t/g,'&#9;');
+      t = t.replace(/\t/g,'&nbsp;&nbsp;');
+      t = t.replace(/\s/g,"&nbsp;");
       this.write(t)
     });
   }

+ 2 - 1
js/runner.js

@@ -20,7 +20,8 @@ const ivprogLexer = LanguageService.getCurrentLexer();
 // }
 // const anaSin = new IVProgParser(input, ivprogLexer);
 const editor = new JsonEditor('#json-renderer', {});
-const domConsole = new DOMConsole("#console");
+const domConsole = new DOMConsole("#console", true);
+domConsole.hide();
 // proc.interpretAST().then( sto => {
 //   console.log(sto.applyStore('a'));
 // }).catch(e => console.log(e));

+ 15 - 6
js/services/localizedStringsService.js

@@ -1,5 +1,6 @@
-import { LanguageService } from "./languageService";
 import line_i18n from 'line-i18n';
+import { LanguageService } from "./languageService";
+import { LanguageDefinedFunction } from "./../processor/definedFunctions";
 import Langs from './../../i18n';
 import { Operators } from "./../ast/operators";
 
@@ -12,13 +13,13 @@ class IVProgLocalizedStrings extends line_i18n.LocalizedStrings {
   translateType (type, dim) {
     switch (dim) {
       case 0:
-        return this.getUI(type);
+        return this.getUI(`type_${type}`);
       default:
-        const transType = this.getUI(type);
+        const transType = this.getUI(`type_${type}`);
         if(dim === 1)
-          return this.getUI("vector_string", [transType])
+          return this.getUI("matrix_info_string", [transType])
         else
-          return this.getUI("matrix_string", [transType])
+          return this.getUI("vector_info_string", [transType])
     }
   }
   
@@ -27,11 +28,19 @@ class IVProgLocalizedStrings extends line_i18n.LocalizedStrings {
       case Operators.AND.ord:
       case Operators.OR.ord:
       case Operators.NOT.ord:
-        return this.getUI(op.value);
+        return this.getUI(`logic_operator_${op.value}`);
       default:
         return op.value;
     }
   }
+
+  translateInternalFunction (name, category = null) {
+    if (category == null) {
+      return LanguageDefinedFunction.getLocalName(name);
+    } else {
+      return LanguageDefinedFunction.getLocalName(`${category}.${name}`);
+    }
+  }
 }
 
 export const LocalizedStrings = Object.freeze(new IVProgLocalizedStrings(LanguageService, Langs, true));

+ 4 - 1
js/util/iassignHelpers.js

@@ -63,7 +63,10 @@ export function autoEval (originalData, callback) {
       return callback(-2);
     }
     const autoAssessment = new IVProgAssessment(code, getTestCases(), new TestConsole([]));
-    autoAssessment.runTest().then( grade => callback(grade)).catch(err => console.log(err))
+    autoAssessment.runTest().then( grade => callback(grade)).catch(err => {
+      console.log(err);
+      callback(0);
+    });
   }
 }
 

+ 55 - 0
js/util/utils.js

@@ -1,3 +1,6 @@
+import { LanguageService } from "./../services/languageService";
+import { LocalizedStrings } from "./../services/localizedStringsService";
+import { Operators } from "./../ast/operators";
 
 /** 
  * source: https://pawelgrzybek.com/page-scroll-in-vanilla-javascript/ 
@@ -94,3 +97,55 @@ export function isElementInViewport (el) {
     rect.left < (window.innerWidth || document.documentElement.clientWidth) &&
     rect.top < (window.innerHeight || document.documentElement.clientHeight);
 }
+let cacheMainList = null;
+let cacheOp = null;
+export function isKeyword (text) {
+  fillCache();
+  for (let key = 0; key < cacheMainList.length; ++key) {
+    const keyword = cacheMainList[key];
+    if(keyword == text) {
+      return true;
+    }
+  }
+  // not in main list, check op
+  for (let op = 0; op < cacheOp.length; op++) {
+    const lOp = cacheOp[op];
+    if(lOp == text) {
+      return true;
+    }
+  }
+  return false;
+}
+
+export function isValidIdentifier (identifier_str) {
+  const validRegex = /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(identifier_str);
+  if(!validRegex) {
+    return false;
+  }
+	return !isKeyword(identifier_str);
+}
+
+function fillCache () {
+  if(cacheMainList == null) {
+    cacheMainList = [];
+    const mainList = ["RK_PROGRAM","RK_REAL","RK_VOID","RK_BOOLEAN","RK_STRING",
+      "RK_INTEGER","RK_CHARACTER","RK_SWITCH","RK_CASE","RK_DEFAULT","RK_CONST",
+      "RK_FUNCTION","RK_RETURN","RK_FOR","RK_BREAK","RK_DO","RK_WHILE","RK_IF",
+      "RK_ELSE","RK_FALSE","RK_TRUE"];
+    const lexerClass = LanguageService.getCurrentLexer();
+    const nullLexer = new lexerClass();
+    for (let key = 0; key < mainList.length; ++key) {
+      const word = mainList[key];
+      const keyword = nullLexer.literalNames[lexerClass[word]];
+      cacheMainList.push(keyword.substring(1, keyword.length-1));
+    }
+  }
+  if(cacheOp == null) {
+    cacheOp = []
+    const logicOpList = [Operators.AND.value, Operators.OR.value, Operators.NOT.value];
+    for (let op = 0; op < logicOpList.length; ++op) {
+      const lOp = `logic_operator_${logicOpList[op]}`;
+      cacheOp.push(LocalizedStrings.getUI(lOp))
+    }
+  }
+}

+ 33 - 33
js/visualUI/code_generator.js

@@ -41,19 +41,19 @@ function functionsCode (function_obj) {
 
 	switch (function_obj.return_type) {
 		case Types.INTEGER:
-			ret += LocalizedStrings.getUI('integer');
+			ret += LocalizedStrings.getUI('type_integer');
 			break;
 		case Types.REAL:
-			ret += LocalizedStrings.getUI('real');
+			ret += LocalizedStrings.getUI('type_real');
 			break;
 		case Types.TEXT:
-			ret += LocalizedStrings.getUI('text');
+			ret += LocalizedStrings.getUI('type_text');
 			break;
 		case Types.BOOLEAN:
-			ret += LocalizedStrings.getUI('boolean');
+			ret += LocalizedStrings.getUI('type_boolean');
 			break;
 		case Types.VOID:
-			ret += LocalizedStrings.getUI('void');
+			ret += LocalizedStrings.getUI('type_void');
 			break;
 	}
 	ret += ' ';
@@ -597,15 +597,15 @@ function elementExpressionCode (expression_obj) {
 					break;
 
 				case Models.LOGIC_COMPARISON.and:
-					ret += ' ' + LocalizedStrings.getUI('and') + ' ';
+					ret += ' ' + LocalizedStrings.getUI('logic_operator_and') + ' ';
 					break;
 
 				case Models.LOGIC_COMPARISON.or:
-					ret += ' ' + LocalizedStrings.getUI('or') + ' ';
+					ret += ' ' + LocalizedStrings.getUI('logic_operator_or') + ' ';
 					break;
 
 				case Models.LOGIC_COMPARISON.not:
-					ret += ' ' + LocalizedStrings.getUI('not') + ' ';
+					ret += ' ' + LocalizedStrings.getUI('logic_operator_not') + ' ';
 					break;
 
 				case Models.ARITHMETIC_COMPARISON.greater_than:
@@ -673,7 +673,7 @@ function variableValueMenuCode (variable_obj, is_return = false) {
 			if (variable_obj.function_called.name) {
 				ret += variable_obj.function_called.name + ' ( ';
 			} else {
-				ret += LocalizedStrings.getUI(variable_obj.function_called.category)+'.'+LocalizedStrings.getUI(variable_obj.function_called.identifier) + ' ( ';
+				ret += LocalizedStrings.translateInternalFunction(variable_obj.function_called.identifier,variable_obj.function_called.category) + ' ( ';
 			}
 
 			if (variable_obj.parameters_list) {
@@ -759,16 +759,16 @@ function parametersCode (parameter_obj) {
 	var ret = '';
 	switch (parameter_obj.type) {
 		case Types.INTEGER:
-			ret += ' '+LocalizedStrings.getUI('integer')+' ';
+			ret += ' '+LocalizedStrings.getUI('type_integer')+' ';
 			break;
 		case Types.REAL:
-			ret += ' '+LocalizedStrings.getUI('real')+' ';
+			ret += ' '+LocalizedStrings.getUI('type_real')+' ';
 			break;
 		case Types.TEXT:
-			ret += ' '+LocalizedStrings.getUI('text')+' ';
+			ret += ' '+LocalizedStrings.getUI('type_text')+' ';
 			break;
 		case Types.BOOLEAN:
-			ret += ' '+LocalizedStrings.getUI('boolean')+' ';
+			ret += ' '+LocalizedStrings.getUI('type_boolean')+' ';
 			break;
 	}
 	ret += parameter_obj.name + '';
@@ -793,16 +793,16 @@ function variablesCode (variable_obj) {
 	}
 	switch (temp.type) {
 		case Types.INTEGER:
-			ret += LocalizedStrings.getUI('integer')+' ';
+			ret += LocalizedStrings.getUI('type_integer')+' ';
 			break;
 		case Types.REAL:
-			ret += LocalizedStrings.getUI('real')+' ';
+			ret += LocalizedStrings.getUI('type_real')+' ';
 			break;
 		case Types.TEXT:
-			ret += LocalizedStrings.getUI('text')+' ';
+			ret += LocalizedStrings.getUI('type_text')+' ';
 			break;
 		case Types.BOOLEAN:
-			ret += LocalizedStrings.getUI('boolean')+' ';
+			ret += LocalizedStrings.getUI('type_boolean')+' ';
 			break;
 	}
 	ret += temp.name + ' ';
@@ -845,9 +845,9 @@ function variablesCode (variable_obj) {
 				ret += '<- {';
 				for (var j = 0; j < temp.value.length; j++) {
 					if (temp.value[j]) {
-						ret += LocalizedStrings.getUI("true");
+						ret += LocalizedStrings.getUI('logic_value_true');
 					} else {
-						ret += LocalizedStrings.getUI("false");
+						ret += LocalizedStrings.getUI('logic_value_false');
 					}
 					if ((j + 1) < temp.value.length) {
 						ret += ', ';
@@ -934,9 +934,9 @@ function variablesCode (variable_obj) {
 					for (var k = 0; k < temp.columns; k++) {
 						
 						if (temp.value[j][k]) {
-							ret += LocalizedStrings.getUI("true");
+							ret += LocalizedStrings.getUI('logic_value_true');
 						} else {
-							ret += LocalizedStrings.getUI("false");
+							ret += LocalizedStrings.getUI('logic_value_false');
 						}
 
 						if ((k + 1) < temp.columns) {
@@ -967,9 +967,9 @@ function variablesCode (variable_obj) {
 			case Types.BOOLEAN:
 				ret += '<- ';
 				if (temp.value) {
-					ret += LocalizedStrings.getUI("true");
+					ret += LocalizedStrings.getUI('logic_value_true');
 				} else {
-					ret += LocalizedStrings.getUI("false");
+					ret += LocalizedStrings.getUI('logic_value_false');
 				}
 				break;
 		}
@@ -994,16 +994,16 @@ function globalsCode () {
 			}
 			switch (temp.type) {
 				case Types.INTEGER:
-					ret += LocalizedStrings.getUI('integer');
+					ret += LocalizedStrings.getUI('type_integer');
 					break;
 				case Types.REAL:
-					ret += LocalizedStrings.getUI('real');
+					ret += LocalizedStrings.getUI('type_real');
 					break;
 				case Types.TEXT:
-					ret += LocalizedStrings.getUI('text');
+					ret += LocalizedStrings.getUI('type_text');
 					break;
 				case Types.BOOLEAN:
-					ret += LocalizedStrings.getUI('boolean');
+					ret += LocalizedStrings.getUI('type_boolean');
 					break;
 			}
 			ret += ' ' + temp.name + ' ';
@@ -1046,9 +1046,9 @@ function globalsCode () {
 						ret += '<- {';
 						for (var j = 0; j < temp.value.length; j++) {
 							if (temp.value[j]) {
-								ret += LocalizedStrings.getUI("true");
+								ret += LocalizedStrings.getUI('logic_value_true');
 							} else {
-								ret += LocalizedStrings.getUI("false");
+								ret += LocalizedStrings.getUI('logic_value_false');
 							}
 							if ((j + 1) < temp.value.length) {
 								ret += ', ';
@@ -1135,9 +1135,9 @@ function globalsCode () {
 							for (var k = 0; k < temp.columns; k++) {
 								
 								if (temp.value[j][k]) {
-									ret += LocalizedStrings.getUI("true");
+									ret += LocalizedStrings.getUI('logic_value_true');
 								} else {
-									ret += LocalizedStrings.getUI("false");
+									ret += LocalizedStrings.getUI('logic_value_false');
 								}
 
 								if ((k + 1) < temp.columns) {
@@ -1168,9 +1168,9 @@ function globalsCode () {
 					case Types.BOOLEAN:
 						ret += '<- ';
 						if (temp.value) {
-							ret += LocalizedStrings.getUI("true");;
+							ret += LocalizedStrings.getUI('logic_value_true');;
 						} else {
-							ret += LocalizedStrings.getUI("false");;
+							ret += LocalizedStrings.getUI('logic_value_false');;
 						}
 						break;
 				}

+ 3 - 3
js/visualUI/commands/generic_expression.js

@@ -832,9 +832,9 @@ function getLogicOperators () {
 	var logic_operators;
 	logic_operators = '<div class="item" data-type="'+Models.EXPRESSION_TYPES.exp_logic+'" data-value="'+Models.LOGIC_COMPARISON.equals_to+'">==</div>';
 	logic_operators += '<div class="item" data-type="'+Models.EXPRESSION_TYPES.exp_logic+'" data-value="'+Models.LOGIC_COMPARISON.not_equals_to+'">!=</div>';
-	logic_operators += '<div class="item" data-type="'+Models.EXPRESSION_TYPES.exp_logic+'" data-value="'+Models.LOGIC_COMPARISON.and+'">'+LocalizedStrings.getUI('and')+'</div>';
-	logic_operators += '<div class="item" data-type="'+Models.EXPRESSION_TYPES.exp_logic+'" data-value="'+Models.LOGIC_COMPARISON.or+'">'+LocalizedStrings.getUI('or')+'</div>';
-	logic_operators += '<div class="item" data-type="'+Models.EXPRESSION_TYPES.exp_logic+'" data-value="'+Models.LOGIC_COMPARISON.not+'">'+LocalizedStrings.getUI('not')+'</div>';
+	logic_operators += '<div class="item" data-type="'+Models.EXPRESSION_TYPES.exp_logic+'" data-value="'+Models.LOGIC_COMPARISON.and+'">'+LocalizedStrings.getUI('logic_operator_and')+'</div>';
+	logic_operators += '<div class="item" data-type="'+Models.EXPRESSION_TYPES.exp_logic+'" data-value="'+Models.LOGIC_COMPARISON.or+'">'+LocalizedStrings.getUI('logic_operator_or')+'</div>';
+	logic_operators += '<div class="item" data-type="'+Models.EXPRESSION_TYPES.exp_logic+'" data-value="'+Models.LOGIC_COMPARISON.not+'">'+LocalizedStrings.getUI('logic_operator_not')+'</div>';
 	return logic_operators;
 }
 

+ 8 - 8
js/visualUI/commands/variable_value_menu.js

@@ -277,7 +277,7 @@ function variableValueMenuCode (command, variable_obj, dom_object, function_obj,
 			if (variable_obj.function_called.name) {
 				parameters_menu = '<div class="parameters_function_called"> '+variable_obj.function_called.name+' <span> ( </span>';
 			} else {
-				parameters_menu = '<div class="parameters_function_called"> <i>'+LocalizedStrings.getUI(variable_obj.function_called.category)+'.'+LocalizedStrings.getUI(variable_obj.function_called.identifier)+'</i> <span> ( </span>';
+				parameters_menu = '<div class="parameters_function_called"> <i>'+ LocalizedStrings.translateInternalFunction(variable_obj.function_called.identifier, variable_obj.function_called.category)+'</i> <span> ( </span>';
 			}
 
 			parameters_menu += '<span> ) </span></div>';
@@ -336,7 +336,7 @@ function variableValueMenuCode (command, variable_obj, dom_object, function_obj,
 			if (variable_obj.function_called.name) {
 				parameters_menu = '<div class="parameters_function_called"> '+variable_obj.function_called.name+' <span> ( </span>';
 			} else {
-				parameters_menu = '<div class="parameters_function_called"> <i>'+LocalizedStrings.getUI(variable_obj.function_called.category)+'.'+LocalizedStrings.getUI(variable_obj.function_called.identifier)+'</i> <span> ( </span>';
+				parameters_menu = '<div class="parameters_function_called"> <i>'+LocalizedStrings.translateInternalFunction(variable_obj.function_called.identifier, variable_obj.function_called.category)+'</i> <span> ( </span>';
 			}
 
 			for (var j = 0; j < variable_obj.function_called.parameters_list.length; j++) {
@@ -659,7 +659,7 @@ function addIVProgFunctionsToMenu (function_obj, menu_var_or_value, ref_object,
 	sub_menu.append('<div class="divider"></div><div class="header">'+LocalizedStrings.getUI('text_header_ivprog_functions')+'</div>');
 	sub_menu.append('<div class="item"><i class="dropdown icon"></i>'+LocalizedStrings.getUI('text_menu_functions_math')+'<div class="menu menu_math_functions"></div></div>');
 	sub_menu.append('<div class="item"><i class="dropdown icon"></i>'+LocalizedStrings.getUI('text_menu_functions_text')+'<div class="menu menu_text_functions"></div></div>');
-	sub_menu.append('<div class="item"><i class="dropdown icon"></i>'+LocalizedStrings.getUI('text_menu_functions_arrangement')+'<div class="menu menu_arrangement_functions"></div></div>');
+	sub_menu.append('<div class="item"><i class="dropdown icon"></i>'+LocalizedStrings.getUI('text_menu_functions_array')+'<div class="menu menu_arrangement_functions"></div></div>');
 	sub_menu.append('<div class="item"><i class="dropdown icon"></i>'+LocalizedStrings.getUI('text_menu_functions_conversion')+'<div class="menu menu_conversion_functions"></div></div>');
 
 	// Insert Math functions:
@@ -667,7 +667,7 @@ function addIVProgFunctionsToMenu (function_obj, menu_var_or_value, ref_object,
 		var t = $('<div class="item"></div>');
 		t.data('function_reference', window.system_functions[i]);
 		t.data('option', VAR_OR_VALUE_TYPES.only_function);
-		t.text(LocalizedStrings.getUI(window.system_functions[i].identifier));
+		t.text(LocalizedStrings.translateInternalFunction(window.system_functions[i].identifier));
 		
 		switch(window.system_functions[i].category) {
 			case Models.SYSTEM_FUNCTIONS_CATEGORIES.math:
@@ -742,8 +742,8 @@ function addVariablesToMenu (function_obj, menu_var_or_value, ref_object, expres
 		}
 	}
 	if (!is_there) {
-		sub_menu.append($('<div class="header">'+LocalizedStrings.getUI('text_none_variable')+'</div>'));
-		sub_menu.append($('<div class="item disabled">'+LocalizedStrings.getUI('text_none_variable_instruction')+'</div>'));
+		sub_menu.append($('<div class="header">'+LocalizedStrings.getUI('text_no_variable')+'</div>'));
+		sub_menu.append($('<div class="item disabled">'+LocalizedStrings.getUI('text_no_variable_instruction')+'</div>'));
 	}
 
 }
@@ -824,7 +824,7 @@ function openInputToFunction (command, ref_object, dom_object, menu_var_or_value
 		if (function_selected.name) {
 			parameters_menu = '<div class="parameters_function_called"> '+function_selected.name+' <span> ( </span>';
 		} else {
-			parameters_menu = '<div class="parameters_function_called"> <i>'+LocalizedStrings.getUI(function_selected.category)+'.'+LocalizedStrings.getUI(function_selected.identifier)+'</i> <span> ( </span>';
+			parameters_menu = '<div class="parameters_function_called"> <i>'+LocalizedStrings.translateInternalFunction(function_selected.identifier, function_selected.category)+'</i> <span> ( </span>';
 		}
 		for (var j = 0; j < function_selected.parameters_list.length; j++) {
 			parameters_menu += '<div class="render_style_param parameter_'+j+'"></div>';
@@ -900,7 +900,7 @@ function openInputToFunction (command, ref_object, dom_object, menu_var_or_value
 		if (function_selected.name) {
 			parameters_menu = '<div class="parameters_function_called"> '+function_selected.name+' <span> ( </span>';
 		} else {
-			parameters_menu = '<div class="parameters_function_called"> <i>'+LocalizedStrings.getUI(function_selected.category)+'.'+LocalizedStrings.getUI(function_selected.identifier)+'</i> <span> ( </span>';
+			parameters_menu = '<div class="parameters_function_called"> <i>'+LocalizedStrings.translateInternalFunction(function_selected.identifier, function_selected.category)+'</i> <span> ( </span>';
 		}
 		
 		parameters_menu += '<span> ) </span></div>';

+ 17 - 20
js/visualUI/functions.js

@@ -16,6 +16,7 @@ import * as Utils from './utils';
 import { registerUserEvent, ActionTypes } from "./../services/userLog";
 import VersionInfo from './../../.ima_version.json';
 import * as TextEditor from "./text_editor";
+import { isValidIdentifier } from "./../util/utils";
 
 var counter_new_functions = 0;
 var counter_new_parameters = 0;
@@ -253,13 +254,13 @@ function renderFunctionReturn (function_obj, function_element) {
   var ret = '<div class="ui dropdown function_return">';
     
     if (function_obj.return_dimensions == 1) {
-      ret += '<div class="text">'+ LocalizedStrings.getUI("vector") +': '+ LocalizedStrings.getUI(function_obj.return_type);
+      ret += '<div class="text">'+ LocalizedStrings.getUI("vector") +': '+ LocalizedStrings.getUI(`type_${function_obj.return_type}`);
       ret += ' [ ] </div>';
     } else if (function_obj.return_dimensions == 2) {
-      ret += '<div class="text">'+ LocalizedStrings.getUI("matrix") +': '+ LocalizedStrings.getUI(function_obj.return_type);
+      ret += '<div class="text">'+ LocalizedStrings.getUI("matrix") +': '+ LocalizedStrings.getUI(`type_${function_obj.return_type}`);
       ret += ' [ ] [ ] </div>';
     } else {
-      ret += '<div class="text">'+LocalizedStrings.getUI(function_obj.return_type)+'</div>';
+      ret += '<div class="text">'+LocalizedStrings.getUI(`type_${function_obj.return_type}`)+'</div>';
     }
 
     ret += '<div class="menu">';
@@ -277,7 +278,7 @@ function renderFunctionReturn (function_obj, function_element) {
         continue;
       }
 
-      ret += '<div class="item ' + (function_obj.return_type == tm.toLowerCase() &&  function_obj.return_dimensions == 1 ? ' selected ' : '') + '" data-text="'+ LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI(tm.toLowerCase())+' [ ] " data-type="'+tm+'" data-dimensions="1"> '+LocalizedStrings.getUI(tm.toLowerCase())+'</div>';
+      ret += '<div class="item ' + (function_obj.return_type == tm.toLowerCase() &&  function_obj.return_dimensions == 1 ? ' selected ' : '') + '" data-text="'+ LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI(`type_${tm.toLowerCase()}`)+' [ ] " data-type="'+tm+'" data-dimensions="1"> '+LocalizedStrings.getUI(`type_${tm.toLowerCase()}`)+'</div>';
     }
     ret += '</div></div>';
 
@@ -291,7 +292,7 @@ function renderFunctionReturn (function_obj, function_element) {
         continue;
       }
 
-      ret += '<div class="item ' + (function_obj.return_type == tm.toLowerCase() &&  function_obj.return_dimensions == 2 ? ' selected ' : '') + '" data-text="'+ LocalizedStrings.getUI('matrix')+':'+LocalizedStrings.getUI(tm.toLowerCase())+' [ ] " data-type="'+tm+'" data-dimensions="2"> '+LocalizedStrings.getUI(tm.toLowerCase())+'</div>';
+      ret += '<div class="item ' + (function_obj.return_type == tm.toLowerCase() &&  function_obj.return_dimensions == 2 ? ' selected ' : '') + '" data-text="'+ LocalizedStrings.getUI('matrix')+':'+LocalizedStrings.getUI(`type_${tm.toLowerCase()}`)+' [ ] " data-type="'+tm+'" data-dimensions="2"> '+LocalizedStrings.getUI(`type_${tm.toLowerCase()}`)+'</div>';
     }
     ret += '</div></div>';
 
@@ -320,7 +321,7 @@ export function renderFunction (function_obj) {
   appender += '<div class="function_signature_div">'+LocalizedStrings.getUI("function")+' ';
 
   if (function_obj.is_main) {
-      appender += '<div class="function_name_div">  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' + LocalizedStrings.getUI('void') + ' &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="span_name_function" >'+function_obj.name+'</span> </div> '
+      appender += '<div class="function_name_div">  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' + LocalizedStrings.getUI('type_void') + ' &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class="span_name_function" >'+function_obj.name+'</span> </div> '
         + ' <span class="parethesis_function">( </span> <div class="ui large labels parameters_list">';
   } else {
       appender += '<div class="ui function_return"></div>';
@@ -391,7 +392,7 @@ export function renderFunction (function_obj) {
     CommandsManagement.renderCommand(function_obj.commands[j], $(appender.find('.commands_list_div')[0]), 3, function_obj);
   }
   $('.minimize_function_button').popup({
-    content : LocalizedStrings.getUI("tooltip_minimize"),
+    content : LocalizedStrings.getUI("tooltip_hide_function"),
     delay: {
       show: 750,
       hide: 0
@@ -1081,7 +1082,7 @@ function renderParameter (function_obj, parameter_obj, function_container) {
   ret += '<div class="ui dropdown parameter_type">';
 
   if (parameter_obj.dimensions > 0) {
-    ret += '<div class="text">'+ LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI(parameter_obj.type);
+    ret += '<div class="text">'+ LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI(`type_${parameter_obj.type}`);
     if (parameter_obj.dimensions == 1) {
       ret += ' [ ] ';
     } else {
@@ -1089,7 +1090,7 @@ function renderParameter (function_obj, parameter_obj, function_container) {
     }
     ret += '</div>';
   } else {
-    ret += '<div class="text">'+LocalizedStrings.getUI(parameter_obj.type)+'</div>';
+    ret += '<div class="text">'+LocalizedStrings.getUI(`type_${parameter_obj.type}`)+'</div>';
   }
 
   ret += '<div class="menu">';
@@ -1099,7 +1100,7 @@ function renderParameter (function_obj, parameter_obj, function_container) {
       if (tm == Types.VOID.toUpperCase()) {
         continue;
       }
-      ret += '<div class="item ' + (parameter_obj.type == tm.toLowerCase() && parameter_obj.dimensions == 0 ? ' selected ' : '') + '" data-type="'+tm+'" >'+LocalizedStrings.getUI(tm.toLowerCase())+'</div>';
+      ret += '<div class="item ' + (parameter_obj.type == tm.toLowerCase() && parameter_obj.dimensions == 0 ? ' selected ' : '') + '" data-type="'+tm+'" >'+LocalizedStrings.getUI(`type_${tm.toLowerCase()}`)+'</div>';
   }
 
 
@@ -1126,7 +1127,7 @@ function renderParameter (function_obj, parameter_obj, function_container) {
         continue;
       }
 
-      ret += '<div class="item ' + (parameter_obj.type == tm.toLowerCase() &&  parameter_obj.dimensions == 2 ? ' selected ' : '') + '" data-text="'+ LocalizedStrings.getUI('matrix')+':'+LocalizedStrings.getUI(tm.toLowerCase())+' [ ] " data-type="'+tm+'" data-dimensions="2"> '+LocalizedStrings.getUI(tm.toLowerCase())+'</div>';
+      ret += '<div class="item ' + (parameter_obj.type == tm.toLowerCase() &&  parameter_obj.dimensions == 2 ? ' selected ' : '') + '" data-text="'+ LocalizedStrings.getUI('matrix')+':'+LocalizedStrings.getUI(`type_${tm.toLowerCase()}`)+' [ ] " data-type="'+tm+'" data-dimensions="2"> '+LocalizedStrings.getUI(`type_${tm.toLowerCase()}`)+'</div>';
   }
   ret += '</div></div>';
 
@@ -1171,13 +1172,13 @@ function updateParameterName (parameter_var, new_name, parameter_obj_dom, functi
 
   if (isValidIdentifier(new_name)) {
     if (variableNameAlreadyExists(new_name, function_obj)) {
-      Utils.renderErrorMessage(parameter_obj_dom.find('.parameter_div_edit'), LocalizedStrings.getUI('inform_valid_variable_duplicated'));
+      Utils.renderErrorMessage(parameter_obj_dom.find('.parameter_div_edit'), LocalizedStrings.getError('inform_valid_param_duplicated', [new_name, function_obj.name]));
     } else {
-      registerUserEvent(parameter_var.name, ActionTypes.RENAME_FUNCTION_PARAM, function_obj.name, new_name);
+      registerUserEvent(function_obj.name, ActionTypes.RENAME_FUNCTION_PARAM, parameter_var.name, new_name);
       parameter_var.name = new_name;
     }
   } else {
-    Utils.renderErrorMessage(parameter_obj_dom.find('.parameter_div_edit'), LocalizedStrings.getUI('inform_valid_name'));
+    Utils.renderErrorMessage(parameter_obj_dom.find('.parameter_div_edit'), LocalizedStrings.getError('inform_valid_identifier'));
   }
 }
 
@@ -1210,13 +1211,13 @@ function updateFunctionName (function_var, new_name, function_obj_dom) {
   
   if (isValidIdentifier(new_name)) {
     if (functionNameAlreadyExists(new_name)) {
-      Utils.renderErrorMessage(function_obj_dom.find('.function_name_div'), LocalizedStrings.getUI('inform_valid_name_duplicated'));
+      Utils.renderErrorMessage(function_obj_dom.find('.function_name_div'), LocalizedStrings.getError('inform_valid_function_duplicated', [new_name]));
     } else {
       registerUserEvent(function_var.name, ActionTypes.RENAME_FUNCTION, new_name);
       function_var.name = new_name;
     }
   } else {
-    Utils.renderErrorMessage(function_obj_dom.find('.function_name_div'), LocalizedStrings.getUI('inform_valid_name'));
+    Utils.renderErrorMessage(function_obj_dom.find('.function_name_div'), LocalizedStrings.getError('inform_valid_identifier'));
   }
 }
 
@@ -1229,10 +1230,6 @@ function functionNameAlreadyExists (function_name) {
   return false;
 }
 
-function isValidIdentifier (identifier_str) {
-  return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(identifier_str);
-}
-
 var opened_name_parameter = false;
 var opened_input_parameter = null;
 function enableNameParameterUpdate (parameter_obj, parent_node, function_obj) {

+ 22 - 25
js/visualUI/globals.js

@@ -3,6 +3,7 @@ import * as Models from './ivprog_elements';
 import { LocalizedStrings } from './../services/localizedStringsService';
 import * as Utils from './utils';
 import { registerUserEvent, registerSystemEvent, ActionTypes } from "./../services/userLog";
+import { isValidIdentifier } from "./../util/utils";
 
 var counter_new_globals = 0;
 
@@ -36,13 +37,13 @@ function updateName (global_var, new_name, global_obj_dom) {
 
 	if (isValidIdentifier(new_name)) {
 		if (globalNameAlreadyExists(new_name)) {
-			Utils.renderErrorMessage(global_obj_dom.find('.editing_name_var'), LocalizedStrings.getUI('inform_valid_global_duplicated'));
+			Utils.renderErrorMessage(global_obj_dom.find('.editing_name_var'), LocalizedStrings.getError('inform_valid_global_duplicated', [new_name]));
 		} else {
 			registerUserEvent(global_var.name, ActionTypes.RENAME_GLOBAL_VAR, new_name);
 			global_var.name = new_name;
 		}
 	} else {
-		Utils.renderErrorMessage(global_obj_dom.find('.editing_name_var'), LocalizedStrings.getUI('inform_valid_name'));
+		Utils.renderErrorMessage(global_obj_dom.find('.editing_name_var'), LocalizedStrings.getError('inform_valid_identifier'));
 	}
 }
 
@@ -55,10 +56,6 @@ function globalNameAlreadyExists (global_name) {
   return false;
 }
 
-function isValidIdentifier (identifier_str) {
-	return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(identifier_str);
-}
-
 function updateType (global_var, new_type, new_dimensions = 0) {
 	global_var.type = new_type;
 	global_var.dimensions = new_dimensions;
@@ -111,14 +108,14 @@ function updateInitialValues (global_var) {
 
 	if (global_var.type == Types.TEXT) {
 		if (global_var.dimensions == 0) {
-			global_var.value = LocalizedStrings.getUI('text_start');
+			global_var.value = LocalizedStrings.getUI('textvar_default_value');
 		}
 		if (global_var.dimensions == 1) {
-			global_var.value = [LocalizedStrings.getUI('text_start'), LocalizedStrings.getUI('text_start')];
+			global_var.value = [LocalizedStrings.getUI('textvar_default_value'), LocalizedStrings.getUI('textvar_default_value')];
 		}
 		if (global_var.dimensions == 2) {
-			global_var.value = [[LocalizedStrings.getUI('text_start'), LocalizedStrings.getUI('text_start')], 
-									[LocalizedStrings.getUI('text_start'), LocalizedStrings.getUI('text_start')]];
+			global_var.value = [[LocalizedStrings.getUI('textvar_default_value'), LocalizedStrings.getUI('textvar_default_value')], 
+									[LocalizedStrings.getUI('textvar_default_value'), LocalizedStrings.getUI('textvar_default_value')]];
 		}
 	}
 
@@ -139,12 +136,12 @@ function updateInitialValues (global_var) {
 
 function alternateBooleanGlobalValue (global_var, value_container) {
 	global_var.value = !global_var.value;
-	$(value_container).find('.span_value_variable').text(LocalizedStrings.getUI(global_var.value));
+	$(value_container).find('.span_value_variable').text(LocalizedStrings.getUI(`logic_value_${global_var.value}`));
 }
 
 function alternateBooleanGlobalVectorValue (global_var, index, value_container) {
 	global_var.value[index] = !global_var.value[index];
-	$(value_container).find('.span_value_variable').text(LocalizedStrings.getUI(global_var.value[index]));
+	$(value_container).find('.span_value_variable').text(LocalizedStrings.getUI(`logic_value_${global_var.value[index]}`));
 }
 
 function removeGlobalColumnVector (global_var) {
@@ -166,7 +163,7 @@ function addGlobalColumnVector (global_var) {
 		global_var.value.push(0.0);
 	}
 	if (global_var.type == Types.TEXT) {
-		global_var.value.push(LocalizedStrings.getUI('text_start'));
+		global_var.value.push(LocalizedStrings.getUI('textvar_default_value'));
 	}
 	if (global_var.type == Types.BOOLEAN) {
 		global_var.value.push(true);
@@ -200,7 +197,7 @@ function addColumnGlobalMatrix (global_var) {
 	}
 	if (global_var.type == Types.TEXT) {
 		for (var i = 0; i < global_var.rows; i++) {
-			global_var.value[i].push(LocalizedStrings.getUI('text_start'));
+			global_var.value[i].push(LocalizedStrings.getUI('textvar_default_value'));
 		}
 	}
 	if (global_var.type == Types.BOOLEAN) {
@@ -240,7 +237,7 @@ function addLineGlobalMatrix (global_var) {
 	if (global_var.type == Types.TEXT) {
 		var n_l = [];
 		for (i = 0; i < global_var.columns; i++) {
-			n_l.push(LocalizedStrings.getUI('text_start'));
+			n_l.push(LocalizedStrings.getUI('textvar_default_value'));
 		}
 		global_var.value.push(n_l);
 	}
@@ -256,7 +253,7 @@ function addLineGlobalMatrix (global_var) {
 
 function alternateBooleanGlobalMatrixValue (global_var, row, index, value_container) {
 	global_var.value[row][index] = !global_var.value[row][index];
-	$(value_container).find('.span_value_variable').text(LocalizedStrings.getUI(global_var.value[row][index]));
+	$(value_container).find('.span_value_variable').text(LocalizedStrings.getUI(`logic_value_${global_var.value[row][index]}`));
 }
 
 function renderValues (global_var, global_container) {
@@ -269,7 +266,7 @@ function renderValues (global_var, global_container) {
 			ret += '<div class="created_div_valor_var"><span class="span_value_variable simple_var">'+global_var.value.toFixed(1)+'</span>  </div> ';
 		} else {
 			if (global_var.type == Types.BOOLEAN) {
-				ret += '<div class="created_div_valor_var"><span class="span_value_variable boolean_simple_type">'+LocalizedStrings.getUI(global_var.value)+'</span>  </div> ';
+				ret += '<div class="created_div_valor_var"><span class="span_value_variable boolean_simple_type">'+LocalizedStrings.getUI(`logic_value_${global_var.value}`)+'</span>  </div> ';
 			} else {
 				ret += '<div class="created_div_valor_var"><span class="span_value_variable simple_var">'+global_var.value+'</span>  </div> ';
 			}
@@ -286,7 +283,7 @@ function renderValues (global_var, global_container) {
 			} else {
 				for (var k = 0; k < global_var.columns; k++) {
 					if (global_var.type == Types.BOOLEAN) {
-						ret += '<td><span class="span_value_variable boolean_vector_var" data-index="'+k+'">'+LocalizedStrings.getUI(global_var.value[k])+'</span></td>';
+						ret += '<td><span class="span_value_variable boolean_vector_var" data-index="'+k+'">'+LocalizedStrings.getUI(`logic_value_${global_var.value[k]}`)+'</span></td>';
 					} else {
 						ret += '<td><span class="span_value_variable vector_var" data-index="'+k+'">'+global_var.value[k]+'</span>'+'</td>';
 					}
@@ -314,7 +311,7 @@ function renderValues (global_var, global_container) {
     				ret += '<tr>';
     				for (var k = 0; k < global_var.columns; k++) {
     					if (global_var.type == Types.BOOLEAN) { 
-    						ret += '<td><span class="span_value_variable boolean_matrix_var" data-index="'+k+'" data-row="'+l+'">'+LocalizedStrings.getUI(global_var.value[l][k])+'</span></td>';
+    						ret += '<td><span class="span_value_variable boolean_matrix_var" data-index="'+k+'" data-row="'+l+'">'+LocalizedStrings.getUI(`logic_value_${global_var.value[l][k]}`)+'</span></td>';
     					} else {
     						ret += '<td><span class="span_value_variable matrix_var" data-index="'+k+'" data-row="'+l+'">'+global_var.value[l][k]+'</span></td>';
     					}
@@ -486,15 +483,15 @@ export function renderGlobal (global_var) {
  	element += '<div class="ui dropdown global_type">';
 
   	if (global_var.dimensions == 1) {
-  		element += '<div class="text">'+ LocalizedStrings.getUI('vector')+ ': ' + LocalizedStrings.getUI(global_var.type);
+  		element += '<div class="text">'+ LocalizedStrings.getUI('vector')+ ': ' + LocalizedStrings.getUI(`type_${global_var.type}`);
   		element += ' [ <span class="dimensions_0"></span> ] ';
   		element += '</div>';
   	} else if (global_var.dimensions == 2) {
-  		element += '<div class="text">'+ LocalizedStrings.getUI('matrix')+ ': ' + LocalizedStrings.getUI(global_var.type);
+  		element += '<div class="text">'+ LocalizedStrings.getUI('matrix')+ ': ' + LocalizedStrings.getUI(`type_${global_var.type}`);
   		element += ' [ <span class="dimensions_0"></span> ] [ <span class="dimensions_1"></span> ] ';
   		element += '</div>';
   	} else {
-  		element += '<div class="text">' + LocalizedStrings.getUI(global_var.type.toLowerCase()) + '</div>';
+  		element += '<div class="text">' + LocalizedStrings.getUI(`type_${global_var.type.toLowerCase()}`) + '</div>';
   	}
 	element += '<div class="menu">';
 
@@ -502,7 +499,7 @@ export function renderGlobal (global_var) {
   		if (tm == Types.VOID.toUpperCase()) {
   			continue;
   		}
-  		element += '<div class="item ' + (global_var.type == tm.toLowerCase() && global_var.dimensions == 0 ? ' selected ' : '') + '" data-type="'+tm+'" >'+LocalizedStrings.getUI(tm.toLowerCase())+'</div>';
+  		element += '<div class="item ' + (global_var.type == tm.toLowerCase() && global_var.dimensions == 0 ? ' selected ' : '') + '" data-type="'+tm+'" >'+LocalizedStrings.getUI(`type_${global_var.type}`)+'</div>';
 	}
 
 
@@ -515,7 +512,7 @@ export function renderGlobal (global_var) {
   			continue;
   		}
 
-  		element += '<div class="item ' + (global_var.type == tm.toLowerCase() &&  global_var.dimensions == 1 ? ' selected ' : '') + '" data-text="'+ LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI(tm.toLowerCase())+' [ ] " data-type="'+tm+'" data-dimensions="1"> '+LocalizedStrings.getUI(tm.toLowerCase())+'</div>';
+  		element += '<div class="item ' + (global_var.type == tm.toLowerCase() &&  global_var.dimensions == 1 ? ' selected ' : '') + '" data-text="'+ LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI(`type_${global_var.type}`)+' [ ] " data-type="'+tm+'" data-dimensions="1"> '+LocalizedStrings.getUI(`type_${global_var.type}`)+'</div>';
   	}
 	element += '</div></div>';
 
@@ -529,7 +526,7 @@ export function renderGlobal (global_var) {
   			continue;
   		}
 
-  		element += '<div class="item ' + (global_var.type == tm.toLowerCase() &&  global_var.dimensions == 2 ? ' selected ' : '') + '" data-text="'+ LocalizedStrings.getUI('matrix')+':'+LocalizedStrings.getUI(tm.toLowerCase())+' [ ] " data-type="'+tm+'" data-dimensions="2"> '+LocalizedStrings.getUI(tm.toLowerCase())+'</div>';
+  		element += '<div class="item ' + (global_var.type == tm.toLowerCase() &&  global_var.dimensions == 2 ? ' selected ' : '') + '" data-text="'+ LocalizedStrings.getUI('matrix')+':'+LocalizedStrings.getUI(`type_${global_var.type}`)+' [ ] " data-type="'+tm+'" data-dimensions="2"> '+LocalizedStrings.getUI(`type_${global_var.type}`)+'</div>';
   	}
 	element += '</div></div>';
 

+ 1 - 2
js/visualUI/ivprog_elements.js

@@ -1,4 +1,3 @@
-import * as VariableValueMenuManagement from './commands/variable_value_menu';
 import { Types } from './types';
 import WatchJS from 'melanke-watchjs';
 import * as AlgorithmManagement from './algorithm';
@@ -17,7 +16,7 @@ export const ARITHMETIC_COMPARISON = Object.freeze({greater_than:"greater_than",
 
 export const LOGIC_COMPARISON = Object.freeze({equals_to:"equals_to", not_equals_to:"not_equals_to", and:"and", or:"or", not:"not"});
 
-export const SYSTEM_FUNCTIONS_CATEGORIES = Object.freeze({math:"math", text:"text_t", arrangement:"arrangement", conversion:"conversion"});
+export const SYSTEM_FUNCTIONS_CATEGORIES = Object.freeze({math:'$mathLib', text:'$strLib', arrangement:'$arrayLib', conversion:'$langLib'});
 
 export class Variable {
 

+ 23 - 26
js/visualUI/variables.js

@@ -3,6 +3,7 @@ import * as Models from './ivprog_elements';
 import { LocalizedStrings } from './../services/localizedStringsService';
 import * as Utils from './utils';
 import { registerUserEvent, registerSystemEvent, ActionTypes } from "./../services/userLog";
+import { isValidIdentifier } from "./../util/utils";
 
 var counter_new_variables = 0;
 
@@ -32,13 +33,13 @@ function updateName (variable_obj, new_name, variable_obj_dom, function_obj) {
 
 	if (isValidIdentifier(new_name)) {
 		if (variableNameAlreadyExists(new_name, function_obj)) {
-			Utils.renderErrorMessage(variable_obj_dom.find('.editing_name_var'), LocalizedStrings.getUI('inform_valid_variable_duplicated'));
+			Utils.renderErrorMessage(variable_obj_dom.find('.editing_name_var'), LocalizedStrings.getError('inform_valid_variable_duplicated', [new_name, function_obj.name]));
 		} else {
-			registerUserEvent(function_obj.name, ActionTypes.REMOVE_FUNCTION_VAR, variable_obj.name, new_name);
+			registerUserEvent(function_obj.name, ActionTypes.RENAME_FUNCTION_VAR, variable_obj.name, new_name);
 			variable_obj.name = new_name;
 		}
 	} else {
-		Utils.renderErrorMessage(variable_obj_dom.find('.editing_name_var'), LocalizedStrings.getUI('inform_valid_name'));
+		Utils.renderErrorMessage(variable_obj_dom.find('.editing_name_var'), LocalizedStrings.getError('inform_valid_identifier'));
 	}
 }
 
@@ -63,10 +64,6 @@ function variableNameAlreadyExists (name_var, function_obj) {
 	return false;
 }
 
-function isValidIdentifier (identifier_str) {
-	return /^[a-zA-Z_][a-zA-Z0-9_]*$/.test(identifier_str);
-}
-
 function removeVariable (variable_obj, variable_container, function_name) {
 	var function_associated = variable_container.data('associatedFunction');
 	registerUserEvent(function_name, ActionTypes.REMOVE_FUNCTION_VAR, variable_obj.name);
@@ -132,13 +129,13 @@ export function renderVariable (function_container, new_var, function_obj) {
 	element += '<div class="ui dropdown variable_type">';
 
   	if (new_var.dimensions == 1) {
-  		element += '<div class="text">'+ LocalizedStrings.getUI('vector') + ': ' + LocalizedStrings.getUI(new_var.type.toLowerCase());
+  		element += '<div class="text">'+ LocalizedStrings.getUI('vector') + ': ' + LocalizedStrings.getUI(`type_${new_var.type.toLowerCase()}`);
   		element += ' [ ] </div>';
   	} else if (new_var.dimensions == 2) {
-  		element += '<div class="text">'+ LocalizedStrings.getUI('matrix') + ': ' + LocalizedStrings.getUI(new_var.type.toLowerCase());
+  		element += '<div class="text">'+ LocalizedStrings.getUI('matrix') + ': ' + LocalizedStrings.getUI(`type_${new_var.type.toLowerCase()}`);
   		element += ' [ ] [ ] </div>';
   	} else {
-  		element += '<div class="text">' + LocalizedStrings.getUI(new_var.type.toLowerCase()) + '</div>';
+  		element += '<div class="text">' + LocalizedStrings.getUI(`type_${new_var.type.toLowerCase()}`) + '</div>';
   	}
 	element += '<div class="menu">';
 
@@ -146,7 +143,7 @@ export function renderVariable (function_container, new_var, function_obj) {
   		if (tm == Types.VOID.toUpperCase()) {
   			continue;
   		}
-  		element += '<div class="item ' + (new_var.type == tm.toLowerCase() &&  new_var.dimensions == 0 ? ' selected ' : '') + '" data-type="'+tm+'" >'+LocalizedStrings.getUI(tm.toLowerCase())+'</div>';
+  		element += '<div class="item ' + (new_var.type == tm.toLowerCase() &&  new_var.dimensions == 0 ? ' selected ' : '') + '" data-type="'+tm+'" >'+LocalizedStrings.getUI(`type_${tm.toLowerCase()}`)+'</div>';
 	}
 
 
@@ -159,7 +156,7 @@ export function renderVariable (function_container, new_var, function_obj) {
   			continue;
   		}
 
-  		element += '<div class="item ' + (new_var.type == tm.toLowerCase() &&  new_var.dimensions == 1 ? ' selected ' : '') + '" data-text="'+ LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI(tm.toLowerCase())+' [ ] " data-type="'+tm+'" data-dimensions="1"> '+LocalizedStrings.getUI(tm.toLowerCase())+'</div>';
+  		element += '<div class="item ' + (new_var.type == tm.toLowerCase() &&  new_var.dimensions == 1 ? ' selected ' : '') + '" data-text="'+ LocalizedStrings.getUI('vector')+':'+LocalizedStrings.getUI(`type_${tm.toLowerCase()}`)+' [ ] " data-type="'+tm+'" data-dimensions="1"> '+LocalizedStrings.getUI(`type_${tm.toLowerCase()}`)+'</div>';
   	}
 	element += '</div></div>';
 
@@ -173,7 +170,7 @@ export function renderVariable (function_container, new_var, function_obj) {
   			continue;
   		}
 
-  		element += '<div class="item ' + (new_var.type == tm.toLowerCase() &&  new_var.dimensions == 2 ? ' selected ' : '') + '" data-text="'+ LocalizedStrings.getUI('matrix')+':'+LocalizedStrings.getUI(tm.toLowerCase())+' [ ] " data-type="'+tm+'" data-dimensions="2"> '+LocalizedStrings.getUI(tm.toLowerCase())+'</div>';
+  		element += '<div class="item ' + (new_var.type == tm.toLowerCase() &&  new_var.dimensions == 2 ? ' selected ' : '') + '" data-text="'+ LocalizedStrings.getUI('matrix')+':'+LocalizedStrings.getUI(`type_${tm.toLowerCase()}`)+' [ ] " data-type="'+tm+'" data-dimensions="2"> '+LocalizedStrings.getUI(`type_${tm.toLowerCase()}`)+'</div>';
   	}
 	element += '</div></div>';
 
@@ -222,7 +219,7 @@ function renderValues (new_var, variable_container, function_name) {
 			ret += '<div class="created_div_valor_var"><span class="span_value_variable simple_var">'+new_var.value.toFixed(1)+'</span> </div> ';
 		} else {
 			if (new_var.type == Types.BOOLEAN) {
-				ret += '<div class="created_div_valor_var"><span class="span_value_variable boolean_simple_type">'+LocalizedStrings.getUI(new_var.value)+'</span> </div> ';
+				ret += '<div class="created_div_valor_var"><span class="span_value_variable boolean_simple_type">'+LocalizedStrings.getUI(`logic_value_${new_var.value}`)+'</span> </div> ';
 			} else {
 				ret += '<div class="created_div_valor_var"><span class="span_value_variable simple_var">'+new_var.value+'</span> </div> ';
 			}
@@ -239,7 +236,7 @@ function renderValues (new_var, variable_container, function_name) {
 			} else {
 				for (var k = 0; k < new_var.columns; k++) {
 					if (new_var.type == Types.BOOLEAN) {
-						ret += '<td><span class="span_value_variable boolean_vector_var" data-index="'+k+'">'+LocalizedStrings.getUI(new_var.value[k])+'</span></td>';
+						ret += '<td><span class="span_value_variable boolean_vector_var" data-index="'+k+'">'+LocalizedStrings.getUI(`logic_value_${new_var.value[k]}`)+'</span></td>';
 					} else {
 						ret += '<td><span class="span_value_variable vector_var" data-index="'+k+'">'+new_var.value[k]+'</span>'+'</td>';
 					}
@@ -267,7 +264,7 @@ function renderValues (new_var, variable_container, function_name) {
     				ret += '<tr>';
     				for (var k = 0; k < new_var.columns; k++) {
     					if (new_var.type == Types.BOOLEAN) { 
-    						ret += '<td><span class="span_value_variable boolean_matrix_var" data-index="'+k+'" data-row="'+l+'">'+LocalizedStrings.getUI(new_var.value[l][k])+'</span></td>';
+    						ret += '<td><span class="span_value_variable boolean_matrix_var" data-index="'+k+'" data-row="'+l+'">'+LocalizedStrings.getUI(`logic_value_${new_var.value[l][k]}`)+'</span></td>';
     					} else {
     						ret += '<td><span class="span_value_variable matrix_var" data-index="'+k+'" data-row="'+l+'">'+new_var.value[l][k]+'</span></td>';
     					}
@@ -382,7 +379,7 @@ function renderValues (new_var, variable_container, function_name) {
 
 function alternateBooleanMatrixValue (var_obj, row, index, value_container) {
 	var_obj.value[row][index] = !var_obj.value[row][index];
-	$(value_container).find('.span_value_variable').text(LocalizedStrings.getUI(var_obj.value[row][index]));
+	$(value_container).find('.span_value_variable').text(LocalizedStrings.getUI(`logic_value_${var_obj.value[row][index]}`));
 }
 
 function addLineMatrix (var_obj) {
@@ -406,7 +403,7 @@ function addLineMatrix (var_obj) {
 	if (var_obj.type == Types.TEXT) {
 		var n_l = [];
 		for (i = 0; i < var_obj.columns; i++) {
-			n_l.push(LocalizedStrings.getUI('text_start'));
+			n_l.push(LocalizedStrings.getUI('textvar_default_value'));
 		}
 		var_obj.value.push(n_l);
 	}
@@ -444,7 +441,7 @@ function addColumnMatrix (var_obj) {
 	}
 	if (var_obj.type == Types.TEXT) {
 		for (var i = 0; i < var_obj.rows; i++) {
-			var_obj.value[i].push(LocalizedStrings.getUI('text_start'));
+			var_obj.value[i].push(LocalizedStrings.getUI('textvar_default_value'));
 		}
 	}
 	if (var_obj.type == Types.BOOLEAN) {
@@ -476,7 +473,7 @@ function addColumnVector (var_obj) {
 		var_obj.value.push(0.0);
 	}
 	if (var_obj.type == Types.TEXT) {
-		var_obj.value.push(LocalizedStrings.getUI('text_start'));
+		var_obj.value.push(LocalizedStrings.getUI('textvar_default_value'));
 	}
 	if (var_obj.type == Types.BOOLEAN) {
 		var_obj.value.push(true);
@@ -494,12 +491,12 @@ function removeColumnVector (var_obj) {
 
 function alternateBooleanValue (var_obj, value_container) {
 	var_obj.value = !var_obj.value;
-	$(value_container).find('.span_value_variable').text(LocalizedStrings.getUI(var_obj.value));
+	$(value_container).find('.span_value_variable').text(LocalizedStrings.getUI(`logic_value_${var_obj.value}`));
 }
 
 function alternateBooleanVectorValue (var_obj, index, value_container) {
 	var_obj.value[index] = !var_obj.value[index];
-	$(value_container).find('.span_value_variable').text(LocalizedStrings.getUI(var_obj.value[index]));
+	$(value_container).find('.span_value_variable').text(LocalizedStrings.getUI(`logic_value_${var_obj.value[index]}`));
 }
 
 function updateInitialValues (variable_obj, function_name) {
@@ -529,14 +526,14 @@ function updateInitialValues (variable_obj, function_name) {
 
 	if (variable_obj.type == Types.TEXT) {
 		if (variable_obj.dimensions == 0) {
-			variable_obj.value = LocalizedStrings.getUI('text_start');
+			variable_obj.value = LocalizedStrings.getUI('textvar_default_value');
 		}
 		if (variable_obj.dimensions == 1) {
-			variable_obj.value = [LocalizedStrings.getUI('text_start'), LocalizedStrings.getUI('text_start')];
+			variable_obj.value = [LocalizedStrings.getUI('textvar_default_value'), LocalizedStrings.getUI('textvar_default_value')];
 		}
 		if (variable_obj.dimensions == 2) {
-			variable_obj.value = [[LocalizedStrings.getUI('text_start'), LocalizedStrings.getUI('text_start')], 
-									[LocalizedStrings.getUI('text_start'), LocalizedStrings.getUI('text_start')]];
+			variable_obj.value = [[LocalizedStrings.getUI('textvar_default_value'), LocalizedStrings.getUI('textvar_default_value')], 
+									[LocalizedStrings.getUI('textvar_default_value'), LocalizedStrings.getUI('textvar_default_value')]];
 		}
 	}
 

+ 2 - 2
package-lock.json

@@ -4928,8 +4928,8 @@
       }
     },
     "line-i18n": {
-      "version": "git+https://git.lcalion.com/LInE/line-i18n.git#26eef66020a63cfc2431dd8260ceff28243e4936",
-      "from": "git+https://git.lcalion.com/LInE/line-i18n.git",
+      "version": "git+http://200.144.254.107/git/LInE/line-i18n.git#5cb79a76f43abef6b3b70035f735e47599e90251",
+      "from": "git+http://200.144.254.107/git/LInE/line-i18n.git",
       "requires": {
         "ts-loader": "^5.*",
         "typescript": "^3.*",

+ 1 - 1
package.json

@@ -49,7 +49,7 @@
     "antlr4": "^4.7.2",
     "codemirror": "^5.48.0",
     "decimal.js": "^10.1.1",
-    "line-i18n": "git+https://git.lcalion.com/LInE/line-i18n.git",
+    "line-i18n": "git+http://200.144.254.107/git/LInE/line-i18n.git",
     "melanke-watchjs": "^1.5.0",
     "server": "^1.0.18"
   }

+ 7 - 23
templates/runner.html

@@ -1,31 +1,15 @@
 <!DOCTYPE html>
 <html>
 <head>
-
-  <link rel="stylesheet" type="text/css" href="css/ivprog-term.css">
-
+  <link href="https://fonts.googleapis.com/css?family=Roboto" rel="stylesheet">
   <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.4.0/semantic.min.css" integrity="sha256-9mbkOfVho3ZPXfM7W8sV2SndrGDuh7wuyLjtsWeTI1Q=" crossorigin="anonymous" />
-  <style>
-    .ivprog-io-output {
-      border: 1px solid gainsboro;
-      width: 80%;
-      height: 360px;
-      overflow-y: scroll;
-      background-color: black;
-      color: white;
-    }
-
-    .ivprog-io-input {
-      width: 80%;
-      margin-top: 10px;
-      border: 1.5px solid green;
-      height: 3rem;
-      color: black;
-      font-size: 12pt;
-    }
-  </style>
-  <title></title>
+  <link rel="stylesheet" type="text/css" href="css/ivprog-visual-1.0.css">
+  <link rel="stylesheet" type="text/css" href="css/ivprog-term.css">
   <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=" crossorigin="anonymous"></script>
+  <script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"
+    integrity="sha256-KM512VNnjElC30ehFwehXjx1YCHPiQkOPmqnrWtpccM="
+    crossorigin="anonymous"></script>
+  <script src="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.4.0/semantic.min.js" integrity="sha256-x1fC6BXl6BwnUhfQqqqC0Fd/n12wH+u8u9va6+E7xaA=" crossorigin="anonymous"></script>
   <script type="text/javascript" src="js/jquery.json-editor.min.js"></script>
   <script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"
       integrity="sha256-KM512VNnjElC30ehFwehXjx1YCHPiQkOPmqnrWtpccM="