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
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' )
{
//dol_syslog("Translate::setDefaultLang ".$this->defaultlang,LOG_DEBUG);
$this -> origlang = $srclang ;
if ( empty ( $srclang ) || $srclang == 'auto' )
{
$langpref = $_SERVER [ 'HTTP_ACCEPT_LANGUAGE' ];
$langpref = eregi_replace ( " ;[^,]* " , " " , $langpref );
$langpref = eregi_replace ( " - " , " _ " , $langpref );
$langlist = split ( " [;,] " , $langpref );
$langpart = split ( " _ " , $langlist [ 0 ]);
//print "Short before _ : ".$langpart[0].'/ Short after _ : '.$langpart[1];
if ( isset ( $langpart [ 1 ])) {
$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 )];
}
else {
// 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 ]);
}
}
$this -> defaultlang = $srclang ;
}
/**
* \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-06-10 21:51:00 +02:00
* \brief Deprecated function . Do nothing . Kept for backward compatibility .
* \deprecated
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 .
* \param domain File name to load ( . lang file ) . Use @ before value if domain is in a module directory .
* \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
2009-05-11 18:26:54 +02:00
* \remarks tab_loaded is completed with $domain key .
2008-03-31 17:17:39 +02:00
* Value for key is : 1 : Loaded from disk , 2 : Not found , 3 : Loaded from cache
*/
2009-05-11 18:26:54 +02:00
function Load ( $domain , $alt = 0 )
{
2009-06-10 21:51:00 +02:00
global $conf ;
2009-05-11 18:26:54 +02:00
//dol_syslog("Translate::Load domain=".$domain." alt=".$alt);
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
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
2009-01-15 23:49:06 +01:00
2008-12-07 20:19:32 +01:00
foreach ( $this -> dir as $searchdir )
{
2008-12-07 21:54:08 +01:00
$newalt = $alt ;
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
if ( eregi ( '@' , $domain )) // It's a language file of a module, we look in dir of this module.
2009-01-15 23:49:06 +01:00
{
2008-12-07 20:19:32 +01:00
$domain = eregi_replace ( '@' , '' , $domain );
$searchdir = $searchdir . " / " . $domain . " /langs " ;
}
else $searchdir = $searchdir . " /langs " ;
2009-01-02 23:02:52 +01:00
2009-05-11 18:26:54 +02:00
// Directory of translation files
$scandir = $searchdir . " / " . $this -> defaultlang ;
$file_lang = $scandir . " / " . $domain . " .lang " ;
$filelangexists = is_file ( $file_lang );
2009-01-02 23:02:52 +01:00
//print 'Load default_lang='.$this->defaultlang.' alt='.$alt.' newalt='.$newalt.' '.$file_lang."-".$filelangexists.'<br>';
2009-05-11 18:26:54 +02:00
// Check in "always available" alternate file if not found or if asked
if ( $newalt || ! $filelangexists )
{
// Dir of always available alternate file (en_US or fr_FR)
2008-12-07 20:19:32 +01:00
if ( $this -> defaultlang == " en_US " ) $scandiralt = $searchdir . " /fr_FR " ;
2009-05-11 18:26:54 +02:00
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 " ;
elseif ( eregi ( '^es' , $this -> defaultlang ) && $this -> defaultlang != 'es_ES' ) $scandiralt = $searchdir . " /es_ES " ;
else $scandiralt = $searchdir . " /en_US " ;
$file_lang = $scandiralt . " / " . $domain . " .lang " ;
$filelangexists = is_file ( $file_lang );
$newalt = 1 ;
}
2009-01-02 23:02:52 +01:00
//print 'Load alt='.$alt.' newalt='.$newalt.' '.$file_lang."-".$filelangexists.'<br>';
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
2008-12-07 20:19:32 +01:00
if ( $enablelangcacheinsession && isset ( $_SESSION [ 'lang_' . $domain ]))
2008-01-20 17:05:50 +01:00
{
2008-12-07 20:19:32 +01:00
foreach ( $_SESSION [ 'lang_' . $domain ] as $key => $value )
{
$this -> tab_translate [ $key ] = $value ;
$this -> tab_loaded [ $domain ] = 3 ; // Marque ce fichier comme charge depuis cache session
}
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 ] != " # " )
{
$tab = split ( '=' , $ligne , 2 );
$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 ]))
{
$value = trim ( ereg_replace ( '\\\n' , " \n " , $tab [ 1 ]));
2009-01-15 23:49:06 +01:00
2008-12-07 20:19:32 +01:00
if ( eregi ( '^CHARSET$' , $key ))
2008-10-20 04:18:54 +02:00
{
2008-12-07 20:19:32 +01:00
// On est tombe sur une balise qui declare le format du fichier lu
2009-01-19 00:42:26 +01:00
$this -> charset_inputfile [ $domain ] = strtoupper ( $value );
//print 'File '.$file_lang.' is declared to have format '.$this->charset_inputfile[$domain].'<br>';
2008-10-20 04:18:54 +02:00
}
2008-12-07 20:19:32 +01:00
else
{
// On stocke toujours dans le tableau Tab en UTF-8
2009-05-11 18:26:54 +02:00
//if (empty($this->charset_inputfile[$domain]) || $this->charset_inputfile[$domain] == 'UTF-8') $value=utf8_decode($value);
if ( empty ( $this -> charset_inputfile [ $domain ]) || $this -> charset_inputfile [ $domain ] == 'ISO-8859-1' ) $value = utf8_encode ( $value );
2009-01-15 23:49:06 +01:00
2008-12-07 20:19:32 +01:00
// We do not load Separator values for alternate files
2008-12-07 21:54:08 +01:00
if ( ! $newalt || ( ! eregi ( '^Separator' , $key )))
2008-12-07 20:19:32 +01:00
{
2009-01-02 23:02:52 +01:00
//print 'XX'.$key;
2008-12-07 20:19:32 +01:00
$this -> tab_translate [ $key ] = $value ;
}
if ( $enablelangcacheinsession ) $tabtranslatedomain [ $key ] = $value ; // To save lang in session
}
2009-05-11 18:26:54 +02:00
}
}
}
2008-12-07 20:19:32 +01:00
fclose ( $fp );
2009-01-15 23:49:06 +01:00
2009-05-11 18:26:54 +02:00
// Pour les langues aux fichiers parfois incomplets, on charge la langue alternative
if ( ! $newalt && $this -> defaultlang != " fr_FR " && $this -> defaultlang != " en_US " )
{
// This function MUST NOY contains call to syslog
//dol_syslog("Translate::Load loading alternate translation file (to complete ".$this->defaultlang."/".$domain.".lang file)", LOG_DEBUG);
$this -> load ( $domain , 1 );
}
2009-01-15 23:49:06 +01:00
2009-05-11 18:26:54 +02:00
$this -> tab_loaded [ $domain ] = 1 ; // Marque ce fichier comme charge
2009-01-15 23:49:06 +01:00
2008-12-07 20:19:32 +01:00
// To save lang in session
if ( $enablelangcacheinsession && sizeof ( $tabtranslatedomain )) $_SESSION [ 'lang_' . $domain ] = $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-06-10 21:51:00 +02:00
// Format for date
2009-06-14 18:25:23 +02:00
if ( $domain == 'main' )
{
2009-06-15 16:50:22 +02:00
$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
2009-06-14 19:26:56 +02:00
$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'];
2009-06-14 18:25:23 +02:00
}
2009-06-10 21:51:00 +02:00
2008-12-07 20:19:32 +01:00
if ( empty ( $this -> tab_loaded [ $domain ])) $this -> tab_loaded [ $domain ] = 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
}
/**
* \brief Retourne la liste des domaines charg<EFBFBD> es en memoire
* \return array Tableau des domaines charg<EFBFBD> es
*/
function list_domainloaded ()
{
$ret = '' ;
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
}
/**
* \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-05-23 00:18:59 +02:00
$str = eregi_replace ( '\\\"' , '"' , $this -> tab_translate [ $key ]); // To solve some translation keys containing key=abc\"def\"ghi instead of abc"def"ghi
$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
$newstr = ereg_replace ( '<' , '__lt__' , $str );
$newstr = ereg_replace ( '>' , '__gt__' , $newstr );
$newstr = ereg_replace ( '"' , '__quot__' , $newstr );
$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
$newstr = ereg_replace ( '__lt__' , '<' , $newstr );
$newstr = ereg_replace ( '__gt__' , '>' , $newstr );
$newstr = ereg_replace ( '__quot__' , '"' , $newstr );
return $newstr ;
}
2009-05-23 00:18:59 +02:00
else // Translation is not available
2009-05-11 18:26:54 +02:00
{
2008-03-16 15:52:31 +01:00
$newstr = $key ;
2009-02-03 03:39:28 +01:00
if ( eregi ( 'CurrencyShort([A-Z]+)$' , $key , $reg ))
2008-03-16 15:52:31 +01:00
{
global $db ;
//$newstr=$this->getLabelFromKey($db,$reg[1],'c_currencies','code_iso','labelshort');
$newstr = $this -> getLabelFromKey ( $db , $reg [ 1 ], 'c_currencies' , 'code_iso' , 'code' );
}
2009-02-03 03:39:28 +01:00
else if ( eregi ( 'Currency([A-Z]+)$' , $key , $reg ))
2008-03-16 15:52:31 +01:00
{
global $db ;
$newstr = $this -> getLabelFromKey ( $db , $reg [ 1 ], 'c_currencies' , 'code_iso' , 'label' );
}
2009-02-03 03:39:28 +01:00
else if ( eregi ( 'SendingMethod([0-9A-Z]+)$' , $key , $reg ))
{
global $db ;
$newstr = $this -> getLabelFromKey ( $db , $reg [ 1 ], 'expedition_methode' , 'code' , 'libelle' );
}
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 = '' )
{
$newstr = $key ;
if ( $this -> getTransFromTab ( $newstr ))
{
// Si la traduction est disponible
$newstr = sprintf ( $this -> tab_translate [ $newstr ], $param1 , $param2 , $param3 , $param4 );
}
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 = '' )
{
$newstr = $key ;
if ( $this -> getTransFromTab ( $newstr ))
{
// Si la traduction est disponible
$newstr = sprintf ( $this -> tab_translate [ $newstr ], $param1 , $param2 , $param3 , $param4 );
}
return $newstr ;
}
/**
* \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 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
* \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 );
}
/**
* \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
}
/**
* \brief Retourne la liste des langues disponibles
* \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
* \param filename nom du fichier <EFBFBD> rechercher
* \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 ;
}
/**
* \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
* \param fieldval Value to find record
* \return string Label
* \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
}
?>