2003-05-02 12:33:06 +02:00
< ? php
/* ***************************************************************************
2005-01-02 17:57:37 +01:00
* Copyright ( C ) 2001 Eric Seigne < erics @ rycks . com >
2009-02-14 01:36:49 +01:00
* Copyright ( C ) 2004 - 2009 Destailleur Laurent < eldy @ users . sourceforge . net >
2003-05-02 12:33:06 +02:00
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License , or
* any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 59 Temple Place - Suite 330 , Boston , MA 02111 - 1307 , USA .
* ************************************************************************* */
2005-01-02 17:57:37 +01:00
/**
2008-08-07 08:33:35 +02:00
* \file htdocs / translate . class . php
2008-10-09 19:29:32 +02:00
* \brief File for Tanslate class
2008-08-07 08:33:35 +02:00
* \author Eric Seigne
* \author Laurent Destailleur
* \version $Id $
*/
2004-08-15 20:09:30 +02:00
2008-01-21 03:19:25 +01:00
/**
2008-08-07 08:33:35 +02:00
* \class Translate
* \brief Class to manage translations
*/
2004-08-15 20:09:30 +02:00
class Translate {
2004-07-25 19:43:23 +02:00
2009-05-11 18:26:54 +02:00
var $dir ; // Directories that contains /langs subdirectory
2008-03-31 17:17:39 +02:00
2009-05-11 18:26:54 +02:00
var $defaultlang ; // Langue courante en vigueur de l'utilisateur
2009-08-11 14:28:30 +02:00
var $direction = 'ltr' ; // Left to right or Right to left
2005-02-06 19:41:45 +01:00
2009-05-11 18:26:54 +02:00
var $tab_loaded = array (); // Tableau pour signaler les fichiers deja charges
var $tab_translate = array (); // Tableau des traductions
2009-01-15 23:49:06 +01:00
2009-05-11 18:26:54 +02:00
var $cache_labels = array (); // Cache for labels
2009-01-15 23:49:06 +01:00
2009-05-11 18:26:54 +02:00
var $charset_inputfile = array (); // To store charset encoding used for language
2009-02-14 01:36:49 +01:00
var $charset_output = 'UTF-8' ; // Codage used by "trans" method outputs
2009-01-15 23:49:06 +01:00
2003-05-02 12:33:06 +02:00
2009-05-11 18:26:54 +02:00
/**
* \brief Constructeur de la classe
* \param dir Force directory that contains / langs subdirectory
* \param conf Objet qui contient la config Dolibarr
*/
function Translate ( $dir = " " , $conf )
{
2008-10-09 19:29:32 +02:00
// If charset output is forced
2009-05-08 03:23:33 +02:00
if ( ! empty ( $conf -> file -> character_set_client ))
2007-05-25 22:02:23 +02:00
{
2009-05-08 03:23:33 +02:00
$this -> charset_output = $conf -> file -> character_set_client ;
2007-05-25 22:02:23 +02:00
}
2008-12-07 20:19:32 +01:00
if ( $dir ) $this -> dir = array ( $dir );
2009-05-08 03:23:33 +02:00
else $this -> dir = $conf -> file -> dol_document_root ;
2009-05-11 18:26:54 +02:00
}
2005-10-30 02:07:00 +01:00
2006-05-20 11:19:20 +02:00
/**
2008-06-30 21:34:53 +02:00
* \brief Return string translated for a key
* Translation array must have been loaded before .
* \param key Key to translate
* \return string Translated string
2006-05-20 11:19:20 +02:00
*/
function getTransFromTab ( $key )
{
2008-07-28 11:09:03 +02:00
if ( ! empty ( $this -> tab_translate [ $key ]))
2006-05-20 11:19:20 +02:00
{
return $this -> tab_translate [ $key ];
}
else
{
return '' ;
}
}
/**
2009-06-10 21:51:00 +02:00
* \brief Positionne la chaine traduite pour une cle donnee .
2008-06-30 21:34:53 +02:00
* \param key Key to translate
* \return string Translated string
2006-05-20 11:19:20 +02:00
*/
function setTransFromTab ( $key , $value )
{
$this -> tab_translate [ $key ] = $value ;
}
2009-05-11 18:26:54 +02:00
/**
* \brief Set accessor for this -> defaultlang
* \param srclang Language to use
*/
function setDefaultLang ( $srclang = 'fr_FR' )
{
2009-09-28 04:53:19 +02:00
//dol_syslog("Translate::setDefaultLang srclang=".$srclang,LOG_DEBUG);
2009-05-11 18:26:54 +02:00
$this -> origlang = $srclang ;
if ( empty ( $srclang ) || $srclang == 'auto' )
{
$langpref = $_SERVER [ 'HTTP_ACCEPT_LANGUAGE' ];
2009-10-21 16:02:14 +02:00
$langpref = preg_replace ( " /;([^,]*)/i " , " " , $langpref );
$langpref = str_replace ( " - " , " _ " , $langpref );
2009-10-20 15:14:44 +02:00
$langlist = preg_split ( " /[;,]/ " , $langpref );
2009-08-12 19:40:47 +02:00
$codetouse = $langlist [ 0 ];
}
else $codetouse = $srclang ;
2009-05-11 18:26:54 +02:00
2009-08-12 19:40:47 +02:00
// We redefine $srclang
2009-10-20 15:14:44 +02:00
$langpart = explode ( " _ " , $codetouse );
2009-08-12 19:40:47 +02:00
//print "Short before _ : ".$langpart[0].'/ Short after _ : '.$langpart[1];
2009-05-11 18:26:54 +02:00
2009-08-12 19:40:47 +02:00
if ( isset ( $langpart [ 1 ])) // If its a long code xx_YY
{
// Array to convert short lang code into other long code.
$longforshort = array ( 'ar' => 'ar_AR' );
if ( isset ( $longforshort [ strtolower ( $langpart [ 0 ])])) $srclang = $longforshort [ strtolower ( $langpart [ 0 ])];
else {
2009-05-11 18:26:54 +02:00
$srclang = strtolower ( $langpart [ 0 ]) . " _ " . strtoupper ( $langpart [ 1 ]);
// Array to convert long lang code into other long code.
$longforlong = array ( 'no_nb' => 'nb_NO' );
if ( isset ( $longforlong [ strtolower ( $srclang )])) $srclang = $longforlong [ strtolower ( $srclang )];
}
2009-08-12 19:40:47 +02:00
}
else { // If its a short code xx
// Array to convert short lang code into long code.
$longforshort = array ( 'ca' => 'ca_ES' , 'nb' => 'nb_NO' , 'no' => 'nb_NO' );
if ( isset ( $longforshort [ strtolower ( $langpart [ 0 ])])) $srclang = $longforshort [ strtolower ( $langpart [ 0 ])];
else $srclang = strtolower ( $langpart [ 0 ]) . " _ " . strtoupper ( $langpart [ 0 ]);
2009-05-11 18:26:54 +02:00
}
$this -> defaultlang = $srclang ;
2009-08-12 19:40:47 +02:00
//print $this->defaultlang;
2009-05-11 18:26:54 +02:00
}
/**
* \brief Return active language code for current user
* \remarks Accessor for this -> defaultlang
* \return string Language code used ( en_US , en_AU , fr_FR , ... )
*/
function getDefaultLang ()
{
return $this -> defaultlang ;
}
/**
2009-07-30 00:29:09 +02:00
* Deprecated function . Do nothing .
* @ deprecated Kept for backward compatibility with third party modules .
2009-05-11 18:26:54 +02:00
*/
function setPhpLang ()
{
2009-02-20 13:29:55 +01:00
return ;
2009-05-11 18:26:54 +02:00
}
/**
2008-10-17 02:24:44 +02:00
* \brief Load in a memory array , translation key - value for a particular file .
2009-05-11 18:26:54 +02:00
* If data for file already loaded , do nothing .
* All data in translation array are stored in UTF - 8 format .
2009-08-11 14:28:30 +02:00
* \param domain File name to load ( . lang file ) . Use @ before value if domain is in a module directory .
2009-09-28 23:59:09 +02:00
* \param alt 0 , 1 , 2
* \param soptafterdirection Stop when the DIRECTION tag is found ( optimize )
2009-09-28 04:53:19 +02:00
* \param forcelangdir To force a lang directory
2009-09-28 23:59:09 +02:00
* \return int < 0 if KO , 0 if already loaded , > 0 if OK
2009-05-11 18:26:54 +02:00
* \remarks tab_loaded is completed with $domain key .
2009-09-28 04:53:19 +02:00
* Value for hash are : 1 : Loaded from disk , 2 : Not found , 3 : Loaded from cache
2008-03-31 17:17:39 +02:00
*/
2009-09-28 04:53:19 +02:00
function Load ( $domain , $alt = 0 , $stopafterdirection = 0 , $forcelangdir = '' )
2009-05-11 18:26:54 +02:00
{
2009-06-10 21:51:00 +02:00
global $conf ;
2009-01-15 23:49:06 +01:00
2008-02-19 22:04:23 +01:00
// Check parameters
if ( empty ( $domain ))
{
2009-02-20 21:28:16 +01:00
dol_print_error ( '' , " Translate::Load ErrorWrongParameters " );
2009-02-02 19:33:44 +01:00
exit ;
2008-02-19 22:04:23 +01:00
}
2009-01-15 23:49:06 +01:00
2009-09-28 23:59:09 +02:00
//dol_syslog("Translate::Load Start domain=".$domain." alt=".$alt." forcelangdir=".$forcelangdir." this->defaultlang=".$this->defaultlang);
2009-10-21 16:02:14 +02:00
$newdomain = str_replace ( '@' , '' , $domain ); // Remove the @ if present
2009-09-28 04:53:19 +02:00
2008-02-19 22:04:23 +01:00
// Check cache
2009-09-28 23:59:09 +02:00
if ( ! empty ( $this -> tab_loaded [ $newdomain ])) // File already loaded for this domain
{
//dol_syslog("Translate::Load already loaded for ".$domain);
return 0 ;
}
$langofdir = ( empty ( $forcelangdir ) ? $this -> defaultlang : $forcelangdir );
$fileread = 0 ;
//dol_syslog("Translate::Load langofdir=".$langofdir);
// Redefine alt
2009-10-20 15:14:44 +02:00
$langarray = explode ( '_' , $langofdir );
2009-09-28 23:59:09 +02:00
if ( $alt < 1 && strtolower ( $langarray [ 0 ]) == strtolower ( $langarray [ 1 ])) $alt = 1 ;
if ( $alt < 2 && ( strtolower ( $langofdir ) == 'en_us' || strtolower ( $langofdir ) == 'fr_fr' || strtolower ( $langofdir ) == 'es_es' )) $alt = 2 ;
2009-01-15 23:49:06 +01:00
2008-12-07 20:19:32 +01:00
foreach ( $this -> dir as $searchdir )
{
2009-01-15 23:49:06 +01:00
// If $domain is @xxx instead of xxx then we look for module lang file htdocs/xxx/langs/code_CODE/xxx.lang
2008-12-07 20:19:32 +01:00
// instead of global lang file htdocs/langs/code_CODE/xxx.lang
2009-09-28 23:59:09 +02:00
if ( eregi ( '@' , $domain )) $searchdir = $searchdir . " / " . $newdomain . " /langs " ;
2008-12-07 20:19:32 +01:00
else $searchdir = $searchdir . " /langs " ;
2009-01-02 23:02:52 +01:00
2009-05-11 18:26:54 +02:00
// Directory of translation files
2009-09-28 23:59:09 +02:00
$scandir = $searchdir . " / " . $langofdir ;
$file_lang = $scandir . " / " . $newdomain . " .lang " ;
2009-05-11 18:26:54 +02:00
$filelangexists = is_file ( $file_lang );
2009-01-02 23:02:52 +01:00
2009-09-28 23:59:09 +02:00
//dol_syslog('Translate::Load Try to read for alt='.$alt.' langofdir='.$langofdir.' file_lang='.$file_lang." => ".$filelangexists);
2009-01-02 23:02:52 +01:00
2009-05-11 18:26:54 +02:00
if ( $filelangexists )
{
2008-12-07 20:19:32 +01:00
// Enable cache of lang file in session (faster but need more memory)
// Speed gain: 40ms - Memory overusage: 200ko (Size of session cache file)
$enablelangcacheinsession = false ;
2009-01-15 23:49:06 +01:00
2009-09-28 23:59:09 +02:00
if ( $enablelangcacheinsession && isset ( $_SESSION [ 'lang_' . $newdomain ]))
2008-01-20 17:05:50 +01:00
{
2009-09-28 23:59:09 +02:00
foreach ( $_SESSION [ 'lang_' . $newdomain ] as $key => $value )
2008-12-07 20:19:32 +01:00
{
$this -> tab_translate [ $key ] = $value ;
2009-09-28 23:59:09 +02:00
$this -> tab_loaded [ $newdomain ] = 3 ; // Set this file as loaded from cache in session
2008-12-07 20:19:32 +01:00
}
2008-01-20 17:05:50 +01:00
}
2008-12-07 20:19:32 +01:00
else
{
2008-12-07 21:54:08 +01:00
if ( $fp = @ fopen ( $file_lang , " rt " ))
2009-05-11 18:26:54 +02:00
{
if ( $enablelangcacheinsession ) $tabtranslatedomain = array (); // To save lang in session
$finded = 0 ;
while (( $ligne = fgets ( $fp , 4096 )) && ( $finded == 0 ))
{
if ( $ligne [ 0 ] != " \n " && $ligne [ 0 ] != " " && $ligne [ 0 ] != " # " )
{
2009-10-20 15:14:44 +02:00
$tab = explode ( '=' , $ligne , 2 );
2009-05-11 18:26:54 +02:00
$key = trim ( $tab [ 0 ]);
//print "Domain=$domain, found a string for $tab[0] with value $tab[1]<br>";
if ( empty ( $this -> tab_translate [ $key ]) && isset ( $tab [ 1 ]))
{
2009-10-21 20:14:00 +02:00
$value = trim ( preg_replace ( '/\\n/' , " \n " , $tab [ 1 ]));
2009-01-15 23:49:06 +01:00
2009-10-21 20:14:00 +02:00
if ( preg_match ( '/^CHARSET$/' , $key )) // This is to declare in which charset files are encoded
2008-10-20 04:18:54 +02:00
{
2009-09-28 23:59:09 +02:00
$this -> charset_inputfile [ $newdomain ] = strtoupper ( $value );
//print 'File '.$file_lang.' is declared to have format '.$this->charset_inputfile[$newdomain].'<br>';
2008-10-20 04:18:54 +02:00
}
2009-10-21 20:14:00 +02:00
elseif ( preg_match ( '/^DIRECTION$/' , $key )) // This is to declare direction of language
2009-08-11 14:28:30 +02:00
{
2009-09-28 23:59:09 +02:00
if ( $alt < 2 ) // We do not load direction for alternate files 2
2009-08-11 14:28:30 +02:00
{
$this -> direction = $value ;
if ( $stopafterdirection ) break ;
}
}
2008-12-07 20:19:32 +01:00
else
{
// On stocke toujours dans le tableau Tab en UTF-8
2009-09-28 23:59:09 +02:00
//if (empty($this->charset_inputfile[$newdomain]) || $this->charset_inputfile[$newdomain] == 'UTF-8') $value=utf8_decode($value);
if ( empty ( $this -> charset_inputfile [ $newdomain ]) || $this -> charset_inputfile [ $newdomain ] == 'ISO-8859-1' ) $value = utf8_encode ( $value );
//print 'XX'.$key;
$this -> tab_translate [ $key ] = $value ;
2009-01-15 23:49:06 +01:00
2008-12-07 20:19:32 +01:00
if ( $enablelangcacheinsession ) $tabtranslatedomain [ $key ] = $value ; // To save lang in session
}
2009-05-11 18:26:54 +02:00
}
}
}
2009-09-28 23:59:09 +02:00
$fileread = 1 ;
2008-12-07 20:19:32 +01:00
fclose ( $fp );
2009-01-15 23:49:06 +01:00
2008-12-07 20:19:32 +01:00
// To save lang in session
2009-09-28 23:59:09 +02:00
if ( $enablelangcacheinsession && sizeof ( $tabtranslatedomain )) $_SESSION [ 'lang_' . $newdomain ] = $tabtranslatedomain ;
2009-01-15 23:49:06 +01:00
2008-12-07 20:19:32 +01:00
break ; // Break loop on each root dir
2009-05-11 18:26:54 +02:00
}
2008-12-07 20:19:32 +01:00
}
2009-05-11 18:26:54 +02:00
}
2008-12-07 20:19:32 +01:00
}
2009-01-15 23:49:06 +01:00
2009-09-28 23:59:09 +02:00
// Now we load alternate file
if ( $alt == 0 )
{
// This function MUST NOT contains call to syslog
//dol_syslog("Translate::Load loading alternate translation file (to complete ".$this->defaultlang."/".$newdomain.".lang file)", LOG_DEBUG);
$langofdir = strtolower ( $langarray [ 0 ]) . '_' . strtoupper ( $langarray [ 0 ]);
$this -> load ( $domain , $alt + 1 , $stopafterdirection , $langofdir );
}
if ( $alt == 1 )
2009-06-14 18:25:23 +02:00
{
2009-09-28 23:59:09 +02:00
// This function MUST NOT contains call to syslog
//dol_syslog("Translate::Load loading alternate translation file (to complete ".$this->defaultlang."/".$newdomain.".lang file)", LOG_DEBUG);
$langofdir = 'en_US' ;
if ( eregi ( '^fr' , $langarray [ 0 ])) $langofdir = 'fr_FR' ;
if ( eregi ( '^es' , $langarray [ 0 ])) $langofdir = 'es_ES' ;
$this -> load ( $domain , $alt + 1 , $stopafterdirection , $langofdir );
2009-06-14 18:25:23 +02:00
}
2009-06-10 21:51:00 +02:00
2009-09-28 23:59:09 +02:00
if ( $alt == 2 )
{
if ( $fileread ) $this -> tab_loaded [ $newdomain ] = 1 ; // Set domain file as loaded
// Format for date
if ( $newdomain == 'main' )
{
$conf -> format_date_short = empty ( $this -> tab_translate [ 'FormatDateShort' ]) ? " %d/%m/%Y " : $this -> tab_translate [ 'FormatDateShort' ]; # Format of day with PHP/C tags (strftime functions)
$conf -> format_date_short_java = empty ( $this -> tab_translate [ 'FormatDateShortJava' ]) ? " dd/MM/yyyy " : $this -> tab_translate [ 'FormatDateShortJava' ]; # Format of day with Java tags
$conf -> format_hour_short = empty ( $this -> tab_translate [ 'FormatHourShort' ]) ? " %H:%M " : $this -> tab_translate [ 'FormatHourShort' ];
$conf -> format_date_text_short = empty ( $this -> tab_translate [ 'FormatDateTextShort' ]) ? " %d %b %Y " : $this -> tab_translate [ 'FormatDateTextShort' ];
$conf -> format_date_text = empty ( $this -> tab_translate [ 'FormatDateText' ]) ? " %d %B %Y " : $this -> tab_translate [ 'FormatDateText' ];
$conf -> format_date_hour_short = empty ( $this -> tab_translate [ 'FormatDateHourShort' ]) ? " %d/%m/%Y %H:%M " : $this -> tab_translate [ 'FormatDateHourShort' ];
$conf -> format_date_hour_text_short = empty ( $this -> tab_translate [ 'FormatDateHourTextShort' ]) ? " %d %b %Y %H:%M " : $this -> tab_translate [ 'FormatDateHourTextShort' ];
$conf -> format_date_hour_text = empty ( $this -> tab_translate [ 'FormatDateHourText' ]) ? " %d %B %Y %H:%M " : $this -> tab_translate [ 'FormatDateHourText' ];
//print $domain." => ".$this->defaultlang." ".$conf->format_date_hour_short." ".$this->tab_translate['FormatDateHourShort'];
}
if ( empty ( $this -> tab_loaded [ $newdomain ])) $this -> tab_loaded [ $newdomain ] = 2 ; // Marque ce fichier comme non trouve
}
2009-01-15 23:49:06 +01:00
2008-03-31 17:17:39 +02:00
return 1 ;
2009-05-11 18:26:54 +02:00
}
2005-10-30 02:07:00 +01:00
2003-05-02 12:33:06 +02:00
2009-05-11 18:26:54 +02:00
/**
2009-01-30 23:18:07 +01:00
* \brief Mark domain as not loaded to be able to load it again .
2009-05-11 18:26:54 +02:00
* \param domain File name to load ( . lang file ) . Use @ before value if domain is in a module directory .
2009-01-30 23:18:07 +01:00
*/
2009-05-11 18:26:54 +02:00
function UnLoad ( $domain )
{
dol_syslog ( " Translate::UnLoad domain= " . $domain . " marked as not loaded " , LOG_DEBUG );
2009-01-30 23:18:07 +01:00
$this -> tab_loaded [ $domain ] = 0 ;
2009-05-11 18:26:54 +02:00
}
/**
2009-08-25 16:36:03 +02:00
* \brief Retourn list of files already loaded into memory
* \return string List of files loaded into memory " main=1,errors=1,... "
2009-05-11 18:26:54 +02:00
*/
function list_domainloaded ()
{
2009-09-28 01:22:00 +02:00
$ret = 'Loaded from ' . join ( ',' , $this -> dir ) . ': ' ;
2008-03-31 17:17:39 +02:00
foreach ( $this -> tab_loaded as $key => $val )
{
if ( $ret ) $ret .= ',' ;
$ret .= $key . '=' . $val ;
}
return $ret ;
2009-05-11 18:26:54 +02:00
}
2009-08-25 16:36:03 +02:00
/**
* Enter description here ...
*
* @ param unknown_type $key
* @ return unknown
*/
2009-08-07 02:49:43 +02:00
function getTradFromKey ( $key )
{
global $db ;
$newstr = $key ;
if ( eregi ( 'CurrencyShort([A-Z]+)$' , $key , $reg ))
{
global $db ;
//$newstr=$this->getLabelFromKey($db,$reg[1],'c_currencies','code_iso','labelshort');
$newstr = $this -> getLabelFromKey ( $db , $reg [ 1 ], 'c_currencies' , 'code_iso' , 'code' );
}
else if ( eregi ( 'Currency([A-Z]+)$' , $key , $reg ))
{
global $db ;
$newstr = $this -> getLabelFromKey ( $db , $reg [ 1 ], 'c_currencies' , 'code_iso' , 'label' );
}
else if ( eregi ( 'SendingMethod([0-9A-Z]+)$' , $key , $reg ))
{
global $db ;
$newstr = $this -> getLabelFromKey ( $db , $reg [ 1 ], 'expedition_methode' , 'code' , 'libelle' );
}
return $newstr ;
}
2009-05-11 18:26:54 +02:00
/**
* \brief Retourne la version traduite du texte passe en parametre en la codant en HTML
* Si il n ' y a pas de correspondance pour ce texte , on cherche dans fichier alternatif
* et si toujours pas trouve , il est retourne tel quel
* Les parametres de cette methode peuvent contenir de balises HTML .
* \param key cle de chaine a traduire
* \param param1 chaine de param1
* \param param2 chaine de param2
* \param param3 chaine de param3
* \param param4 chaine de param4
* \param maxsize taille max
* \return string Chaine traduite et code en HTML
*/
function trans ( $key , $param1 = '' , $param2 = '' , $param3 = '' , $param4 = '' , $maxsize = 0 )
{
2009-05-23 00:18:59 +02:00
if ( $this -> getTransFromTab ( $key )) // Translation is available
2009-05-11 18:26:54 +02:00
{
2009-10-21 16:02:14 +02:00
$str = preg_replace ( '/\\\"/' , '"' , $this -> tab_translate [ $key ]); // To solve some translation keys containing key=abc\"def\"ghi instead of abc"def"ghi
2009-05-23 00:18:59 +02:00
$str = sprintf ( $str , $param1 , $param2 , $param3 , $param4 );
2009-05-11 18:26:54 +02:00
if ( $maxsize ) $str = dol_trunc ( $str , $maxsize );
// On remplace les tags HTML par __xx__ pour eviter traduction par htmlentities
2009-10-21 16:02:14 +02:00
$newstr = str_replace ( '<' , '__lt__' , $str );
$newstr = str_replace ( '>' , '__gt__' , $newstr );
$newstr = str_replace ( '"' , '__quot__' , $newstr );
2009-05-11 18:26:54 +02:00
$newstr = $this -> convToOutputCharset ( $newstr ); // Convert string to $this->charset_output
// Cryptage en html de la chaine
// $newstr est une chaine stockee en memoire au format $this->charset_output
$newstr = htmlentities ( $newstr , ENT_QUOTES , $this -> charset_output );
// On restaure les tags HTML
2009-10-21 16:02:14 +02:00
$newstr = str_replace ( '__lt__' , '<' , $newstr );
$newstr = str_replace ( '__gt__' , '>' , $newstr );
$newstr = str_replace ( '__quot__' , '"' , $newstr );
2009-05-11 18:26:54 +02:00
return $newstr ;
}
2009-05-23 00:18:59 +02:00
else // Translation is not available
2009-05-11 18:26:54 +02:00
{
2009-08-07 02:49:43 +02:00
$newstr = $this -> getTradFromKey ( $key );
2008-10-29 22:26:59 +01:00
return $this -> convToOutputCharset ( $newstr );
2007-05-26 00:23:03 +02:00
}
2009-05-11 18:26:54 +02:00
}
2008-07-28 11:09:03 +02:00
2009-01-15 23:49:06 +01:00
2008-10-20 03:05:41 +02:00
/**
2009-05-11 18:26:54 +02:00
* \brief Return translated value of a text string
* Si il n ' y a pas de correspondance pour ce texte , on cherche dans fichier alternatif
* et si toujours pas trouve , il est retourne tel quel .
* Parameters of this method must not contains any HTML tags .
* \param key key of string to translate
* \param param1 chaine de param1
* \param param2 chaine de param1
* \param param3 chaine de param1
* \param param4 chaine de param1
* \return string chaine traduite
*/
function transnoentities ( $key , $param1 = '' , $param2 = '' , $param3 = '' , $param4 = '' )
{
2009-08-07 02:49:43 +02:00
if ( $this -> getTransFromTab ( $key ))
2009-05-11 18:26:54 +02:00
{
// Si la traduction est disponible
2009-08-07 02:49:43 +02:00
$newstr = sprintf ( $this -> tab_translate [ $key ], $param1 , $param2 , $param3 , $param4 );
}
else
{
$newstr = $this -> getTradFromKey ( $key );
2009-05-11 18:26:54 +02:00
}
return $this -> convToOutputCharset ( $newstr );
}
/**
* \brief Return translated value of a text string
* Si il n ' y a pas de correspondance pour ce texte , on cherche dans fichier alternatif
* et si toujours pas trouve , il est retourne tel quel .
* No convert to encoding charset of lang object is done .
* Parameters of this method must not contains any HTML tags .
* \param key key of string to translate
* \param param1 chaine de param1
* \param param2 chaine de param1
* \param param3 chaine de param1
* \param param4 chaine de param1
* \return string chaine traduite
*/
function transnoentitiesnoconv ( $key , $param1 = '' , $param2 = '' , $param3 = '' , $param4 = '' )
{
2009-08-07 02:49:43 +02:00
if ( $this -> getTransFromTab ( $key ))
2009-05-11 18:26:54 +02:00
{
// Si la traduction est disponible
2009-08-07 02:49:43 +02:00
$newstr = sprintf ( $this -> tab_translate [ $key ], $param1 , $param2 , $param3 , $param4 );
}
else
{
$newstr = $this -> getTradFromKey ( $key );
2009-05-11 18:26:54 +02:00
}
return $newstr ;
}
/**
2009-08-04 14:47:09 +02:00
* \brief Return translation of a key depending on country
* \param str string root to translate
* \param countrycode country code ( FR , ... )
* \return string translated string
2009-05-11 18:26:54 +02:00
*/
function transcountry ( $str , $countrycode )
{
if ( $this -> tab_translate [ " $str $countrycode " ]) return $this -> trans ( " $str $countrycode " );
else return $this -> trans ( $str );
}
/**
* \brief Retourne la version traduite du texte passe en parametre complete du code pays
2009-08-04 14:47:09 +02:00
* \param str string root to translate
* \param countrycode country code ( FR , ... )
* \return string translated string
2009-05-11 18:26:54 +02:00
*/
function transcountrynoentities ( $str , $countrycode )
{
if ( $this -> tab_translate [ " $str $countrycode " ]) return $this -> transnoentities ( " $str $countrycode " );
else return $this -> transnoentities ( $str );
}
/**
* \brief Convert a string into output charset ( this -> charset_output that should be defined to conf -> file -> character_set_client )
* \param str String to convert
* \param pagecodefrom Page code of src string
* \return string Converted string
*/
function convToOutputCharset ( $str , $pagecodefrom = 'UTF-8' )
{
if ( $pagecodefrom == 'ISO-8859-1' && $this -> charset_output == 'UTF-8' ) $str = utf8_encode ( $str );
2008-10-21 00:12:21 +02:00
if ( $pagecodefrom == 'UTF-8' && $this -> charset_output == 'ISO-8859-1' ) $str = utf8_decode ( $str );
2007-05-26 00:23:03 +02:00
return $str ;
2009-05-11 18:26:54 +02:00
}
/**
2009-08-25 16:36:03 +02:00
* \brief Return list of all available languages
2009-05-11 18:26:54 +02:00
* \return array list of languages
*/
function get_available_languages ( $langdir = DOL_DOCUMENT_ROOT )
{
// We scan directory langs to detect available languages
$handle = opendir ( $langdir . " /langs " );
$langs_available = array ();
while ( $file = trim ( readdir ( $handle )))
{
if ( eregi ( '^[a-z]+_[A-Z]+' , $file ))
{
array_push ( $langs_available , $file );
}
}
return $langs_available ;
}
/**
* \brief Renvoi si le fichier $filename existe dans la version de la langue courante ou alternative
2009-07-06 14:47:54 +02:00
* \param filename nom du fichier a rechercher
2009-05-11 18:26:54 +02:00
* \param searchalt cherche aussi dans langue alternative
* \return boolean true si existe , false sinon
*/
function file_exists ( $filename , $searchalt = 0 )
{
// Test si fichier dans repertoire de la langue
2008-12-12 03:16:14 +01:00
foreach ( $this -> dir as $searchdir )
{
2009-05-11 18:26:54 +02:00
$htmlfile = $searchdir . " /langs/ " . $this -> defaultlang . " / " . $filename ;
if ( is_readable ( $htmlfile )) return true ;
if ( $searchalt ) {
// Test si fichier dans repertoire de la langue alternative
if ( $this -> defaultlang != " en_US " ) $htmlfilealt = $searchdir . " /langs/en_US/ " . $filename ;
else $htmlfilealt = $searchdir . " /langs/fr_FR/ " . $filename ;
if ( is_readable ( $htmlfilealt )) return true ;
}
2008-12-12 03:16:14 +01:00
}
2009-01-15 23:49:06 +01:00
2009-05-11 18:26:54 +02:00
return false ;
}
2009-08-25 16:36:03 +02:00
/**
2009-10-20 17:23:32 +02:00
* \brief Return full text translated to language label for a key . Store key - label in a cache .
2009-08-25 16:36:03 +02:00
* \number number Number to encode in full text
* \param isamount 1 = It 's an amount, 0=it' s just a number
* \return string Label translated in UTF8 ( but without entities )
* 10 if setDefaultLang was en_US => ten
* 123 if setDefaultLang was fr_FR => cent vingt trois
2009-08-25 22:57:54 +02:00
* \remarks This function need module " numberwords " to be installed . If not it will return
* same number ( this module is not provided by default as it use non GPL source code ) .
2009-08-25 16:36:03 +02:00
*/
function getLabelFromNumber ( $number , $isamount = 0 )
{
2009-08-25 22:57:54 +02:00
global $conf ;
2009-08-25 16:36:03 +02:00
$outlang = $this -> defaultlang ; // Output language we want
2009-10-20 15:14:44 +02:00
$outlangarray = explode ( '_' , $outlang , 2 );
2009-08-25 16:36:03 +02:00
// If lang is xx_XX, then we use xx
if ( strtolower ( $outlangarray [ 0 ]) == strtolower ( $outlangarray [ 1 ])) $outlang = $outlangarray [ 0 ];
2009-08-25 22:57:54 +02:00
$newnumber = $number ;
foreach ( $conf -> file -> dol_document_root as $dirroot )
{
$dir = $dirroot . " /includes/modules/substitutions " ;
$fonc = 'numberwords' ;
if ( file_exists ( $dir . '/functions_' . $fonc . '.lib.php' ))
{
include_once ( $dir . '/functions_' . $fonc . '.lib.php' );
$newnumber = numberwords_getLabelFromNumber ( $this , $number , $isamount );
break ;
}
}
2009-08-25 16:36:03 +02:00
2009-08-25 22:57:54 +02:00
return $newnumber ;
2009-08-25 16:36:03 +02:00
}
2009-05-11 18:26:54 +02:00
/**
* \brief Return a label for a key . Store key - label in a cache .
* \param db Database handler
* \param key Key to get label ( key in language file )
* \param tablename Table name without prefix
* \param fieldkey Field for key
* \param fieldlabel Field for label
2009-08-25 16:36:03 +02:00
* \return string Label in UTF8 ( but without entities )
2009-05-11 18:26:54 +02:00
* \remarks This function can be used to get label in database but more often to get code from key id .
*/
function getLabelFromKey ( $db , $key , $tablename , $fieldkey , $fieldlabel )
{
// If key empty
2008-05-03 23:44:32 +02:00
if ( $key == '' ) return '' ;
2008-06-30 21:34:53 +02:00
// Check in language array
2009-05-11 18:26:54 +02:00
if ( $this -> transnoentities ( $key ) != $key )
{
return $this -> transnoentities ( $key ); // Found in language array
}
2009-01-15 23:49:06 +01:00
2008-06-30 21:34:53 +02:00
// Check in cache
2009-05-11 18:26:54 +02:00
if ( isset ( $this -> cache_labels [ $tablename ][ $key ])) // Can be defined to 0 or ''
{
return $this -> cache_labels [ $tablename ][ $key ]; // Found in cache
}
$sql = " SELECT " . $fieldlabel . " as label " ;
$sql .= " FROM " . MAIN_DB_PREFIX . $tablename ;
$sql .= " WHERE " . $fieldkey . " = ' " . $key . " ' " ;
dol_syslog ( 'Translate::getLabelFromKey sql=' . $sql , LOG_DEBUG );
$resql = $db -> query ( $sql );
if ( $resql )
{
$obj = $db -> fetch_object ( $resql );
if ( $obj ) $this -> cache_labels [ $tablename ][ $key ] = $obj -> label ;
else $this -> cache_labels [ $tablename ][ $key ] = '' ;
$db -> free ( $resql );
return $this -> cache_labels [ $tablename ][ $key ];
}
else
{
2008-03-16 15:52:31 +01:00
$this -> error = $db -> lasterror ();
2009-02-20 21:28:16 +01:00
dol_syslog ( " Translate::getLabelFromKey error= " . $this -> error , LOG_ERR );
2009-05-11 18:26:54 +02:00
return - 1 ;
}
}
2008-10-20 03:05:41 +02:00
2003-05-02 12:33:06 +02:00
}
?>