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 >
2008-02-19 22:04:23 +01:00
* Copyright ( C ) 2004 - 2008 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
2008-03-31 17:17:39 +02:00
var $dir ; // Directory with translation files
var $dir_bis ; // Second directory with translation files (for development on two workspaces)
2006-08-07 04:20:57 +02:00
var $defaultlang ; // Langue courante en vigueur de l'utilisateur
2005-02-06 19:41:45 +01:00
2008-01-21 03:19:25 +01:00
var $tab_loaded = array (); // Tableau pour signaler les fichiers deja charges
2006-05-20 11:19:20 +02:00
var $tab_translate = array (); // Tableau des traductions
2008-03-01 02:12:55 +01:00
var $cache_labels = array (); // Cache for labels
2008-10-17 02:24:44 +02:00
var $charset_inputfile = 'ISO-8859-1' ; // Codage used by default to encode lang files (used if CHARSET not found in file)
var $charset_output = 'UTF-8' ; // Codage used by default for "trans" method output if $conf->character_set_client not defined (character_set_client in conf.php)
2007-05-21 02:41:46 +02:00
2003-05-02 12:33:06 +02:00
2004-08-15 20:09:30 +02:00
/**
2005-01-02 17:57:37 +01:00
* \brief Constructeur de la classe
2008-03-31 17:17:39 +02:00
* \param dir Force directory that contains translation files
2007-05-25 22:02:23 +02:00
* \param conf Objet qui contient la config Dolibarr
2004-10-20 23:15:17 +02:00
*/
2007-05-25 22:02:23 +02:00
function Translate ( $dir = " " , $conf )
2005-10-30 01:42:54 +02:00
{
2008-10-09 19:29:32 +02:00
// If charset output is forced
if ( ! empty ( $conf -> character_set_client ))
2007-05-25 22:02:23 +02:00
{
$this -> charset_output = $conf -> character_set_client ;
}
2008-03-31 17:17:39 +02:00
$this -> dir = ( ! $dir ? DOL_DOCUMENT_ROOT . " /langs " : $dir );
2008-09-30 01:18:52 +02:00
// For developpement purpose
2008-03-31 17:17:39 +02:00
$this -> dir_bis = ( defined ( 'DOL_DOCUMENT_ROOT_BIS' ) ? DOL_DOCUMENT_ROOT_BIS . " /langs " : " " );
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 '' ;
}
}
/**
2008-01-21 03:19:25 +01:00
* \brief Positionne la chaine traduite pour une cl<EFBFBD> donn<EFBFBD> e .
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 ;
}
2005-10-30 02:07:00 +01:00
/**
2008-07-15 20:09:22 +02:00
* \brief Set accessor for this -> defaultlang
2008-06-30 21:34:53 +02:00
* \param srclang Language to use
2005-10-30 02:07:00 +01:00
*/
2006-08-07 04:20:57 +02:00
function setDefaultLang ( $srclang = 'fr_FR' )
2005-10-30 02:07:00 +01:00
{
2008-07-15 20:09:22 +02:00
//dolibarr_syslog("Translate::setDefaultLang ".$this->defaultlang,LOG_DEBUG);
$this -> origlang = $srclang ;
2006-08-07 04:20:57 +02:00
if ( $srclang == 'auto' )
2005-10-30 01:42:54 +02:00
{
2005-10-30 02:07:00 +01:00
$langpref = $_SERVER [ 'HTTP_ACCEPT_LANGUAGE' ];
$langpref = eregi_replace ( " ;[^,]* " , " " , $langpref );
$langpref = eregi_replace ( " - " , " _ " , $langpref );
2005-10-30 02:52:48 +01:00
$langlist = split ( " [;,] " , $langpref );
$langpart = split ( " _ " , $langlist [ 0 ]);
2006-08-07 04:20:57 +02:00
if ( isset ( $langpart [ 1 ])) $srclang = strtolower ( $langpart [ 0 ]) . " _ " . strtoupper ( $langpart [ 1 ]);
else $srclang = strtolower ( $langpart [ 0 ]) . " _ " . strtoupper ( $langpart [ 0 ]);
2005-10-30 01:42:54 +02:00
}
2005-10-30 02:07:00 +01:00
2006-08-07 04:20:57 +02:00
$this -> defaultlang = $srclang ;
2004-07-13 23:25:53 +02:00
}
2003-05-02 12:33:06 +02:00
2005-10-30 02:07:00 +01:00
2005-11-01 00:49:35 +01:00
/**
2008-08-07 08:33:35 +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 , ... )
2005-11-01 00:49:35 +01:00
*/
function getDefaultLang ()
{
return $this -> defaultlang ;
}
/**
\brief Positionne environnement PHP en fonction du langage
2008-07-15 20:09:22 +02:00
\remarks Le code langue long ( fr_FR , en_US , ... ) doit avoir etre positionne par setDefaultLang
2005-11-01 00:49:35 +01:00
\return int > 0 si ok , < 0 so ko
*/
function setPhpLang ()
{
2008-07-15 20:09:22 +02:00
//dolibarr_syslog("Translate::setPhpLang ".$this->defaultlang,LOG_DEBUG);
2005-11-01 00:49:35 +01:00
$code_lang_tiret = ereg_replace ( '_' , '-' , $this -> defaultlang );
setlocale ( LC_ALL , $this -> defaultlang ); // Compenser pb de locale avec windows
setlocale ( LC_ALL , $code_lang_tiret );
if ( defined ( " MAIN_FORCE_SETLOCALE_LC_ALL " ) && MAIN_FORCE_SETLOCALE_LC_ALL ) setlocale ( LC_ALL , MAIN_FORCE_SETLOCALE_LC_ALL );
if ( defined ( " MAIN_FORCE_SETLOCALE_LC_TIME " ) && MAIN_FORCE_SETLOCALE_LC_TIME ) setlocale ( LC_TIME , MAIN_FORCE_SETLOCALE_LC_TIME );
if ( defined ( " MAIN_FORCE_SETLOCALE_LC_NUMERIC " ) && MAIN_FORCE_SETLOCALE_LC_NUMERIC ) setlocale ( LC_NUMERIC , MAIN_FORCE_SETLOCALE_LC_NUMERIC );
if ( defined ( " MAIN_FORCE_SETLOCALE_LC_MONETARY " ) && MAIN_FORCE_SETLOCALE_LC_MONETARY ) setlocale ( LC_MONETARY , MAIN_FORCE_SETLOCALE_LC_MONETARY );
return 1 ;
}
2005-01-02 17:57:37 +01:00
/**
2008-10-17 02:24:44 +02:00
* \brief Load in a memory array , translation key - value for a particular file .
* If data for file already loaded , do nothing .
* All data in translation array are stored in ISO - 8859 - 1 format .
* \\TODO Store data arrays in UTF - 8 format .
* \param domain File name to load ( . lang file )
* \param alt Use alternate file even if file in target language is found
2008-03-31 17:17:39 +02:00
* \return int < 0 if KO , > 0 if OK
* \remarks tab_loaded is completed with $domain key .
* Value for key is : 1 : Loaded from disk , 2 : Not found , 3 : Loaded from cache
*/
2005-02-06 19:41:45 +01:00
function Load ( $domain , $alt = 0 )
{
2008-02-20 01:39:33 +01:00
// dolibarr_syslog("Translate::Load domain=".$domain." alt=".$alt);
2008-02-19 22:04:23 +01:00
// Check parameters
if ( empty ( $domain ))
{
2008-02-20 01:39:33 +01:00
dolibarr_syslog ( " Translate::Load ErrorWrongParameters " , LOG_WARNING );
2008-03-31 17:17:39 +02:00
return - 1 ;
2008-02-19 22:04:23 +01:00
}
// Check cache
if ( ! empty ( $this -> tab_loaded [ $domain ])) { return ; } // Le fichier de ce domaine est deja charge
2008-09-30 01:18:52 +02:00
$searchdir = $this -> dir ;
// If $domain is @xxx instead of xxx then we look for module lang file htdocs/xxx/langs/code_CODE/xxx.lang
// instead of global lang file htdocs/langs/code_CODE/xxx.lang
if ( eregi ( '@' , $domain )) // It's a language file of a module, we look in dir of this module.
{
$domain = eregi_replace ( '@' , '' , $domain );
$searchdir = DOL_DOCUMENT_ROOT . " / " . $domain . " /langs " ;
}
// Directory of translation files
$scandir = $searchdir . " / " . $this -> defaultlang ;
2008-01-20 17:05:50 +01:00
$file_lang = $scandir . " / " . $domain . " .lang " ;
2005-10-30 01:42:54 +02:00
$filelangexists = is_file ( $file_lang );
2008-09-30 01:18:52 +02:00
// If development with 2 workspaces (for development purpose only)
2008-03-31 17:17:39 +02:00
if ( ! $filelangexists && $this -> dir_bis )
{
$scandir = $this -> dir_bis . " / " . $this -> defaultlang ;
$file_lang = $scandir . " / " . $domain . " .lang " ;
$filelangexists = is_file ( $file_lang );
}
2008-09-30 01:18:52 +02:00
// Check in "always available" alternate file if not found or if asked
2005-10-30 01:42:54 +02:00
if ( $alt || ! $filelangexists )
{
2008-09-30 01:18:52 +02:00
// Dir of always available alternate file (en_US or fr_FR)
if ( $this -> defaultlang == " en_US " ) $scandiralt = $searchdir . " /fr_FR " ;
elseif ( eregi ( '^fr' , $this -> defaultlang ) && $this -> defaultlang != 'fr_FR' ) $scandiralt = $searchdir . " /fr_FR " ;
elseif ( eregi ( '^en' , $this -> defaultlang ) && $this -> defaultlang != 'en_US' ) $scandiralt = $searchdir . " /en_US " ;
else $scandiralt = $searchdir . " /en_US " ;
2006-12-12 19:33:19 +01:00
2008-02-19 22:04:23 +01:00
$file_lang = $scandiralt . " / " . $domain . " .lang " ;
2005-10-30 01:42:54 +02:00
$filelangexists = is_file ( $file_lang );
2005-02-06 19:41:45 +01:00
$alt = 1 ;
2004-07-13 23:25:53 +02:00
}
2008-09-30 01:18:52 +02:00
2005-10-30 01:42:54 +02:00
if ( $filelangexists )
{
2008-01-20 17:05:50 +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 ;
if ( $enablelangcacheinsession && isset ( $_SESSION [ 'lang_' . $domain ]))
{
foreach ( $_SESSION [ 'lang_' . $domain ] as $key => $value )
{
$this -> tab_translate [ $key ] = $value ;
2008-02-20 01:39:33 +01:00
$this -> tab_loaded [ $domain ] = 3 ; // Marque ce fichier comme charge depuis cache session
2008-01-20 17:05:50 +01:00
}
}
else
{
if ( $fp = @ fopen ( $file_lang , " rt " ))
{
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 ] != " # " )
{
$tab = split ( '=' , $ligne , 2 );
$key = trim ( $tab [ 0 ]); $value = '' ;
//print "Domain=$domain, found a string for $tab[0] with value $tab[1]<br>";
//if (! $this->getTransFromTab($key))
2008-01-25 18:52:06 +01:00
if ( empty ( $this -> tab_translate [ $key ]) && isset ( $tab [ 1 ]))
2008-01-20 17:05:50 +01:00
{
$value = trim ( ereg_replace ( '\\\n' , " \n " , $tab [ 1 ]));
if ( eregi ( '^CHARSET$' , $key ))
{
// On est tombe sur une balise qui declare le format du fichier lu
$this -> charset_inputfile = strtoupper ( $value );
//print 'File '.$file_lang.' has format '.$this->charset_inputfile.'<br>';
}
else
{
// On stocke toujours dans le tableau Tab en ISO
if ( $this -> charset_inputfile == 'UTF-8' ) $value = utf8_decode ( $value );
//if ($this->charset_inputfile == 'ISO-8859-1') $value=$value;
//$this->setTransFromTab($key,$value);
$this -> tab_translate [ $key ] = $value ;
if ( $enablelangcacheinsession ) $tabtranslatedomain [ $key ] = $value ; // To save lang in session
}
}
}
}
fclose ( $fp );
// Pour les langues aux fichiers parfois incomplets, on charge la langue alternative
if ( ! $alt && $this -> defaultlang != " fr_FR " && $this -> defaultlang != " en_US " )
{
2008-08-07 09:25:35 +02:00
dolibarr_syslog ( " Translate::Load loading alternate translation file (to complete " . $this -> defaultlang . " / " . $domain . " .lang file) " , LOG_DEBUG );
2008-01-20 17:05:50 +01:00
$this -> load ( $domain , 1 );
}
2008-02-20 01:39:33 +01:00
$this -> tab_loaded [ $domain ] = 1 ; // Marque ce fichier comme charge
2008-01-20 17:05:50 +01:00
// To save lang in session
if ( $enablelangcacheinsession && sizeof ( $tabtranslatedomain )) $_SESSION [ 'lang_' . $domain ] = $tabtranslatedomain ;
}
}
2005-02-06 19:41:45 +01:00
}
2008-02-20 01:39:33 +01:00
else
{
2008-09-30 01:18:52 +02:00
$this -> tab_loaded [ $domain ] = 2 ; // Marque ce fichier comme non trouve
2008-02-20 01:39:33 +01:00
}
2008-03-31 17:17:39 +02:00
return 1 ;
2005-10-30 02:07:00 +01:00
}
2003-05-02 12:33:06 +02:00
2005-01-02 17:57:37 +01:00
/**
2008-01-21 03:19:25 +01:00
* \brief Retourne la liste des domaines charg<EFBFBD> es en memoire
* \return array Tableau des domaines charg<EFBFBD> es
2005-01-02 17:57:37 +01:00
*/
2005-10-30 01:42:54 +02:00
function list_domainloaded ()
{
2008-03-31 17:17:39 +02:00
$ret = '' ;
foreach ( $this -> tab_loaded as $key => $val )
{
if ( $ret ) $ret .= ',' ;
$ret .= $key . '=' . $val ;
}
return $ret ;
2004-07-25 19:43:23 +02:00
}
2004-10-20 23:15:17 +02:00
/**
2008-03-15 13:17:15 +01:00
* \brief Retourne la version traduite du texte passe en parametre en la codant en HTML
2006-12-12 20:25:30 +01:00
* Si il n ' y a pas de correspondance pour ce texte , on cherche dans fichier alternatif
2008-03-15 13:17:15 +01:00
* et si toujours pas trouve , il est retourne tel quel
* Les parametres de cette methode peuvent contenir de balises HTML .
2008-07-28 11:09:03 +02:00
* \param key cle de chaine a traduire
2006-12-12 20:25:30 +01:00
* \param param1 chaine de param1
2008-01-20 20:24:05 +01:00
* \param param2 chaine de param2
* \param param3 chaine de param3
* \param param4 chaine de param4
2006-12-12 20:25:30 +01:00
* \param maxsize taille max
2008-07-28 11:09:03 +02:00
* \return string Chaine traduite et code en HTML
2004-10-20 23:15:17 +02:00
*/
2006-12-12 20:25:30 +01:00
function trans ( $key , $param1 = '' , $param2 = '' , $param3 = '' , $param4 = '' , $maxsize = 0 )
2005-10-30 01:42:54 +02:00
{
2006-12-12 20:25:30 +01:00
if ( $this -> getTransFromTab ( $key ))
{
2008-03-15 13:17:15 +01:00
// Translation is available
2006-12-12 20:25:30 +01:00
$str = sprintf ( $this -> tab_translate [ $key ], $param1 , $param2 , $param3 , $param4 );
if ( $maxsize ) $str = dolibarr_trunc ( $str , $maxsize );
2006-12-12 20:43:41 +01:00
// On remplace les tags HTML par __xx__ pour eviter traduction par htmlentities
$newstr = ereg_replace ( '<' , '__lt__' , $str );
$newstr = ereg_replace ( '>' , '__gt__' , $newstr );
2006-12-16 14:45:59 +01:00
$newstr = ereg_replace ( '"' , '__quot__' , $newstr );
2007-05-21 02:41:46 +02:00
2007-05-26 00:23:03 +02:00
$newstr = $this -> convToOuptutCharset ( $newstr );
2007-05-25 22:43:47 +02:00
2006-12-12 20:43:41 +01:00
// Cryptage en html de la chaine
2007-05-25 22:43:47 +02:00
// $newstr est une chaine stockee en memoire au format $this->charset_output
2007-05-25 22:02:23 +02:00
$newstr = htmlentities ( $newstr , ENT_QUOTES , $this -> charset_output );
2007-05-21 02:41:46 +02:00
2006-12-12 20:43:41 +01:00
// On restaure les tags HTML
$newstr = ereg_replace ( '__lt__' , '<' , $newstr );
$newstr = ereg_replace ( '__gt__' , '>' , $newstr );
2006-12-16 14:45:59 +01:00
$newstr = ereg_replace ( '__quot__' , '"' , $newstr );
2006-12-12 20:43:41 +01:00
return $newstr ;
2006-12-12 20:25:30 +01:00
}
2007-05-26 00:23:03 +02:00
else
{
2008-03-15 13:17:15 +01:00
// Translation is not available
2008-03-16 15:52:31 +01:00
$newstr = $key ;
if ( ereg ( '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 ( ereg ( 'Currency([A-Z]+)$' , $key , $reg ))
{
global $db ;
$newstr = $this -> getLabelFromKey ( $db , $reg [ 1 ], 'c_currencies' , 'code_iso' , 'label' );
//print "xxx".$key."-".$value."\n";
}
return $this -> convToOuptutCharset ( $newstr );
2007-05-26 00:23:03 +02:00
}
2005-03-21 20:04:39 +01:00
}
2005-10-30 02:07:00 +01:00
2005-03-21 20:04:39 +01:00
/**
2008-07-15 20:09:22 +02:00
* \brief Retourne la version traduite du texte pass<EFBFBD> en param<EFBFBD> tre
2005-03-21 20:04:39 +01:00
* Si il n ' y a pas de correspondance pour ce texte , on cherche dans fichier alternatif
2008-07-15 20:09:22 +02:00
* et si toujours pas trouv<EFBFBD> , il est retourn<EFBFBD> tel quel .
* Les param<EFBFBD> tres de cette m<EFBFBD> thode ne doivent pas contenir de balises HTML .
* \param key cl<EFBFBD> de chaine a traduire
2005-03-21 20:04:39 +01:00
* \param param1 chaine de param1
* \param param2 chaine de param1
* \param param3 chaine de param1
2006-11-21 21:02:49 +01:00
* \param param4 chaine de param1
2005-03-21 20:04:39 +01:00
* \return string chaine traduite
*/
2006-11-21 21:02:49 +01:00
function transnoentities ( $key , $param1 = '' , $param2 = '' , $param3 = '' , $param4 = '' )
2005-10-30 02:07:00 +01:00
{
2008-10-08 21:55:44 +02:00
$newstr = $key ;
if ( $this -> getTransFromTab ( $newstr ))
2005-10-30 02:07:00 +01:00
{
2004-06-11 01:38:00 +02:00
// Si la traduction est disponible
2008-10-08 21:55:44 +02:00
$newstr = sprintf ( $this -> tab_translate [ $newstr ], $param1 , $param2 , $param3 , $param4 );
2004-06-11 01:38:00 +02:00
}
2008-10-08 21:55:44 +02:00
return $this -> convToOuptutCharset ( $newstr );
2004-06-11 01:38:00 +02:00
}
2004-07-13 23:25:53 +02:00
2005-10-30 02:07:00 +01:00
2005-02-10 22:32:46 +01:00
/**
2008-07-28 11:09:03 +02:00
* \brief Retourne la version traduite du texte passe en parametre complete du code pays
2005-02-10 22:32:46 +01:00
* \param str chaine a traduire
2005-03-01 22:44:32 +01:00
* \param countrycode code pays ( FR , ... )
2005-02-10 22:32:46 +01:00
* \return string chaine traduite
*/
2005-10-30 02:07:00 +01:00
function transcountry ( $str , $countrycode )
{
2005-02-10 22:32:46 +01:00
if ( $this -> tab_translate [ " $str $countrycode " ]) return $this -> trans ( " $str $countrycode " );
2008-07-28 11:09:03 +02:00
else return $this -> trans ( $str );
2005-02-10 22:32:46 +01:00
}
2007-05-26 00:23:03 +02:00
/**
2008-07-28 11:09:03 +02:00
* \brief Retourne la version traduite du texte passe en parametre complete du code pays
* \param str chaine a traduire
* \param countrycode code pays ( FR , ... )
* \return string chaine traduite
*/
function transcountrynoentities ( $str , $countrycode )
{
if ( $this -> tab_translate [ " $str $countrycode " ]) return $this -> transnoentities ( " $str $countrycode " );
else return $this -> transnoentities ( $str );
}
/**
2007-05-26 00:23:03 +02:00
* \brief Convertit une chaine dans le charset de sortie
* \param str chaine a convertir
* \return string chaine traduite
*/
function convToOuptutCharset ( $str )
{
if ( $this -> charset_output == 'UTF-8' ) $str = utf8_encode ( $str );
//if ($this->charset_output=='ISO-8859-1') $str=$str;
return $str ;
}
2004-06-11 01:38:00 +02:00
/**
2005-01-02 17:57:37 +01:00
* \brief Retourne la liste des langues disponibles
* \return array list of languages
*/
2005-02-12 22:25:39 +01:00
function get_available_languages ( $langdir = DOL_DOCUMENT_ROOT )
2004-06-11 01:38:00 +02:00
{
2008-01-21 03:19:25 +01:00
// On parcour le r<> pertoire langs pour d<> tecter les langues disponibles
2005-12-16 01:44:34 +01:00
$handle = opendir ( $langdir . " /langs " );
$langs_available = array ();
while ( $file = trim ( readdir ( $handle )))
{
if ( eregi ( '^[a-z]+_[A-Z]+' , $file ))
{
array_push ( $langs_available , $file );
}
2004-07-31 13:36:01 +02:00
}
2005-12-16 01:44:34 +01:00
return $langs_available ;
2003-05-02 12:33:06 +02:00
}
2004-06-11 01:38:00 +02:00
/**
2008-01-21 03:19:25 +01:00
* \brief Exp<EFBFBD> die le header correct et retourne le d<EFBFBD> but de la page html
2005-01-02 17:57:37 +01:00
* [ en ] Send header and return a string of html start page
* \return string html header avec charset
*/
2004-06-11 01:38:00 +02:00
function lang_header ()
2003-05-02 12:33:06 +02:00
{
2007-05-25 22:02:23 +02:00
$texte = " <meta http-equiv= \" Content-Type \" content= \" text/html; charset= " . $this -> charset_output . " \" > \n " ;
2004-06-11 01:38:00 +02:00
return $texte ;
}
2003-05-02 12:33:06 +02:00
2005-05-14 00:43:56 +02:00
/**
* \brief Renvoi si le fichier $filename existe dans la version de la langue courante ou alternative
2008-01-21 03:19:25 +01:00
* \param filename nom du fichier <EFBFBD> rechercher
2005-05-14 00:43:56 +02:00
* \param searchalt cherche aussi dans langue alternative
* \return boolean true si existe , false sinon
*/
2005-10-30 02:07:00 +01:00
function file_exists ( $filename , $searchalt = 0 )
{
2008-09-30 01:18:52 +02:00
// Test si fichier dans repertoire de la langue
2005-05-14 00:43:56 +02:00
$htmlfile = $this -> dir . " / " . $this -> defaultlang . " / " . $filename ;
if ( is_readable ( $htmlfile )) return true ;
if ( $searchalt ) {
2008-09-30 01:18:52 +02:00
// Test si fichier dans repertoire de la langue alternative
2005-05-14 00:43:56 +02:00
if ( $this -> defaultlang != " en_US " ) $htmlfilealt = $this -> dir . " /en_US/ " . $filename ;
else $htmlfilealt = $this -> dir . " /fr_FR/ " . $filename ;
if ( is_readable ( $htmlfilealt )) return true ;
}
return false ;
}
/**
* \brief Renvoi le fichier $filename dans la version de la langue courante , sinon alternative
2008-10-09 19:29:32 +02:00
* \param filename nom du fichier a rechercher
2005-05-14 00:43:56 +02:00
* \param searchalt cherche aussi dans langue alternative
2008-02-17 21:44:20 +01:00
* \return boolean
2005-05-14 00:43:56 +02:00
*/
2005-10-30 02:07:00 +01:00
function print_file ( $filename , $searchalt = 0 )
{
2008-10-09 19:29:32 +02:00
global $conf ;
2008-02-17 21:44:20 +01:00
// Test si fichier dans repertoire de la langue
2005-05-14 00:43:56 +02:00
$htmlfile = $this -> dir . " / " . $this -> defaultlang . " / " . $filename ;
2005-10-30 02:07:00 +01:00
if ( is_readable ( $htmlfile ))
{
2008-10-09 19:29:32 +02:00
$content = file_get_contents ( $htmlfile );
$isutf8 = utf8_check ( $content );
if ( ! $isutf8 && $conf -> character_set_client == 'UTF-8' ) print utf8_encode ( $content );
elseif ( $isutf8 && $conf -> character_set_client == 'ISO-8859-1' ) print utf8_decode ( $content );
else print $content ;
2005-05-14 00:43:56 +02:00
return true ;
}
if ( $searchalt ) {
2008-02-17 21:44:20 +01:00
// Test si fichier dans repertoire de la langue alternative
2005-05-14 00:43:56 +02:00
if ( $this -> defaultlang != " en_US " ) $htmlfilealt = $this -> dir . " /en_US/ " . $filename ;
else $htmlfilealt = $this -> dir . " /fr_FR/ " . $filename ;
2005-10-30 02:07:00 +01:00
if ( is_readable ( $htmlfilealt ))
{
2008-10-09 19:29:32 +02:00
$content = file_get_contents ( $htmlfile );
$isutf8 = utf8_check ( $content );
if ( ! $isutf8 && $conf -> character_set_client == 'UTF-8' ) print utf8_encode ( $content );
elseif ( $isutf8 && $conf -> character_set_client == 'ISO-8859-1' ) print utf8_decode ( $content );
else print $content ;
return true ;
2005-05-14 00:43:56 +02:00
}
}
return false ;
}
2008-03-01 02:12:55 +01:00
/**
* \brief Return a label for a key . Store key - label in a cache .
* \param db Database handler
* \param key Key to get label
* \param tablename Table name
* \param fieldkey Field for key
* \param fieldlabel Field for label
* \return string Label
*/
function getLabelFromKey ( $db , $key , $tablename , $fieldkey , $fieldlabel )
{
2008-06-30 21:34:53 +02:00
// 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
if ( $this -> transnoentities ( $key ) != $key )
{
return $this -> transnoentities ( $key ); // Found in language array
}
2008-05-03 23:44:32 +02:00
2008-06-30 21:34:53 +02:00
// Check in cache
2008-03-01 02:12:55 +01:00
if ( ! empty ( $this -> cache_labels [ $tablename ][ $key ]))
{
return $this -> cache_labels [ $tablename ][ $key ]; // Found in cache
}
$sql = " SELECT " . $fieldlabel . " as label " ;
$sql .= " FROM " . MAIN_DB_PREFIX . $tablename ;
$sql .= " WHERE " . $fieldkey . " = ' " . $key . " ' " ;
2008-03-15 13:17:15 +01:00
dolibarr_syslog ( 'Translate::getLabelFromKey sql=' . $sql , LOG_DEBUG );
2008-03-01 02:12:55 +01:00
$resql = $db -> query ( $sql );
if ( $resql )
{
$obj = $db -> fetch_object ( $resql );
$this -> cache_labels [ $tablename ][ $key ] = $obj -> label ;
2008-06-30 21:34:53 +02:00
$db -> free ( $resql );
2008-03-01 02:12:55 +01:00
return $this -> cache_labels [ $tablename ][ $key ];
}
else
{
2008-03-16 15:52:31 +01:00
$this -> error = $db -> lasterror ();
dolibarr_syslog ( " Translate::getLabelFromKey error= " . $this -> error , LOG_ERR );
2008-03-01 02:12:55 +01:00
return - 1 ;
}
}
2003-05-02 12:33:06 +02:00
}
?>