Nella personalizzazione di un modulo esistente di Vtiger o nella creazione di uno nuovo, capita spesso di dover cambiare il testo di un campo oppure di aggiungere una nuova voce per un nuovo campo.
Solitamente si entra nella cartella language si individua il file e si modifica/inserisce il campo interessato.
Questa soluzione però presenta lo svantaggio che a seguito di un aggiornamento della lingua le modifiche devono essere gestite manualmente.
Un modo sicuramente più efficiente e migliore è quello di creare, per i soli moduli interessati, una cartella di nome ovveride entro la quale mettere le entry nuove o quelle modificate, in modo tale che l'aggiornamento della lingua non va ad inficiare sulle entry custom.
Vtiger non dispone nativamente di questa funzionalità, ma con un semplice hack ad un file è possibile ottenerla.
Ecco di seguito i passaggi:
Modificare il file
includes/runtime/LanguageHandler.php'
modificare la funzione
public static function getModuleStringsFromFile($language, $module='Vtiger')
e dopo questo blocco esistente
if(file_exists($file)){ require $file; self::$languageContainer[$language][$module]['languageStrings'] = $languageStrings; self::$languageContainer[$language][$module]['jsLanguageStrings'] = $jsLanguageStrings; }
aggiungere le seguenti righe
$qualifiedNameOvr = 'languages.'.$language.'.overrides.'.$module; $fileOvr = Vtiger_Loader::resolveNameToPath($qualifiedNameOvr); $languageStringsOvr = $jsLanguageStringsOvr = array(); if(file_exists($fileOvr)){ require $fileOvr; self::$languageContainer[$language][$module]['languageStrings'] = array_merge($languageStrings, $languageStringsOvr); self::$languageContainer[$language][$module]['jsLanguageStrings'] = array_merge($jsLanguageStrings, $jsLanguageStringsOvr); }
In questo modo oltre che a leggere il file della lingua standard, andrà nella cartella overrides e leggerà il nuovo file custom (che dovrà avere il nome del modulo)
Esempio
crm/languages/it_it/SalesOrder.php
conterrà tutte le definizioni standard del modulo per la gestione degli ordini di vendita
$languageStrings = array( 'SINGLE_SalesOrder' => 'Ordine di vendita' , .... ); $jsLanguageStrings = array( 'JS_PLEASE_REMOVE_LINE_ITEM_THAT_IS_DELETED' => 'Please remove line item that is deleted', // TODO: Review
.....
);
Override del file
crm/languages/it_it/override/SalesOrder.php
creo un nuovo file sulla falsa riga del primo ma con gli array con nomi diversi ($languageStrings vs $languageStringsOvr) e ($jsLanguageStrings vs $jsLanguageStringsOvr) come da esempio qui sotto.
$languageStringsOvr = array(
'NEWKEY' => 'New Value',
);
$jsLanguageStringsOvr = array(
'JS_CREATED_INVOICE_TITLE' => 'Fattura generata',
'JS_CREATED_INVOICE_MESSAGE' => 'Gli ordini di vendita sono stati accorpati in una sola fattura'
);
A questo punto seguento questo schema è possibile fare l'override di tutti i moduli e avere le proprie traduzioni extra al sicuro da aggiornamenti della lingua.