Source for file jLocale.class.php

Documentation is available at jLocale.class.php

  1. <?php
  2. /**
  3. @package    jelix
  4. @subpackage core
  5. @author     Laurent Jouanneau
  6. @author     Gerald Croes
  7. @contributor Julien Issler, Yannick Le Guédart, Dominique Papin
  8. @copyright  2001-2005 CopixTeam, 2005-2008 Laurent Jouanneau
  9. *  Some parts of this file are took from Copix Framework v2.3dev20050901, CopixI18N.class.php, http://www.copix.org.
  10. *  copyrighted by CopixTeam and released under GNU Lesser General Public Licence.
  11. *  initial authors : Gerald Croes, Laurent Jouanneau.
  12. *  enhancement by Laurent Jouanneau for Jelix.
  13. @copyright 2008 Julien Issler, 2008 Yannick Le Guédart, 2008 Dominique Papin
  14. @link        http://www.jelix.org
  15. @licence    GNU Lesser General Public Licence see LICENCE file or http://www.gnu.org/licenses/lgpl.html
  16. */
  17.  
  18.  
  19. /**
  20. * a bundle contains all readed properties in a given language, and for all charsets
  21. @package  jelix
  22. @subpackage core
  23. */
  24. class jBundle {
  25.     public $fic;
  26.     public $locale;
  27.  
  28.     protected $_loadedCharset = array ();
  29.     protected $_strings = array();
  30.  
  31.     /**
  32.     * constructor
  33.     * @param jSelector   $file selector of a properties file
  34.     * @param string      $locale    the code lang
  35.     */
  36.     public function __construct ($file$locale){
  37.         $this->fic  = $file;
  38.         $this->locale = $locale;
  39.     }
  40.  
  41.     /**
  42.     * get the translation
  43.     * @param string $key the locale key
  44.     * @param string $charset 
  45.     * @return string the localized string
  46.     */
  47.     public function get ($key$charset null){
  48.  
  49.         if($charset == null){
  50.             $charset $GLOBALS['gJConfig']->charset;
  51.         }
  52.         if (!in_array ($charset$this->_loadedCharset)){
  53.             $this->_loadLocales ($this->locale$charset);
  54.         }
  55.  
  56.         if (isset ($this->_strings[$charset][$key])){
  57.             return $this->_strings[$charset][$key];
  58.         }else{
  59.             return null;
  60.         }
  61.     }
  62.  
  63.     /**
  64.     * Loads the resources for a given locale/charset.
  65.     * @param string $locale     the locale
  66.     * @param string $charset    the charset
  67.     */
  68.     protected function _loadLocales ($locale$charset){
  69.         global $gJConfig;
  70.         $this->_loadedCharset[$charset;
  71.  
  72.         $source $this->fic->getPath();
  73.         $cache $this->fic->getCompiledFilePath();
  74.  
  75.         // check if we have a compiled version of the ressources
  76.  
  77.         if (is_readable ($cache)){
  78.             $okcompile true;
  79.  
  80.             if ($gJConfig->compilation['force']){
  81.                $okcompile false;
  82.             }else{
  83.                 if ($gJConfig->compilation['checkCacheFiletime']){
  84.                     if (is_readable ($source&& filemtime($sourcefilemtime($cache)){
  85.                         $okcompile false;
  86.                     }
  87.                 }
  88.             }
  89.  
  90.             if ($okcompile{
  91.                 include ($cache);
  92.                 $this->_strings[$charset$_loaded;
  93.                 return;
  94.             }
  95.         }
  96.  
  97.         $this->_loadResources ($source$charset);
  98.  
  99.         if(isset($this->_strings[$charset])){
  100.             $content '<?php $_loaded= '.var_export($this->_strings[$charset]true).' ?>';
  101.  
  102.             jFile::write($cache$content);
  103.         }
  104.     }
  105.  
  106.  
  107.     /**
  108.     * loads a given resource from its path.
  109.     */
  110.     protected function _loadResources ($fichier$charset){
  111.  
  112.         if (($f @fopen ($fichier'r')) !== false{
  113.             $utf8Mod ($charset=='UTF-8')?'u':'';
  114.             $multiline=false;
  115.             $linenumber=0;
  116.             $key='';
  117.             while (!feof($f)) {
  118.                 if($line=fgets($f)){
  119.                     $linenumber++;
  120.                     $line=rtrim($line);
  121.                     if($multiline){
  122.                         if(preg_match("/^\s*(.*)\s*(\\\\?)$/U".$utf8Mod$line$match)){
  123.                             $multiline($match[2=="\\");
  124.                             if (strlen ($match[1])) {
  125.                                 $sp preg_split('/(?<!\\\\)\#/'$match[1]-,PREG_SPLIT_NO_EMPTY);
  126.                                 $this->_strings[$charset][$key].=' '.trim(str_replace('\#','#',$sp[0]));
  127.                             else {
  128.                                 $this->_strings[$charset][$key].=' ';
  129.                             }
  130.                         }else{
  131.                             throw new Exception('Syntaxe error in file properties '.$fichier.' line '.$linenumber,210);
  132.                         }
  133.                     }elseif(preg_match("/^\s*(.+)\s*=\s*(.*)\s*(\\\\?)$/U".$utf8Mod,$line$match)){
  134.                         // on a bien un cle=valeur
  135.                         $key=$match[1];
  136.                         $multiline($match[3=="\\");
  137.                         $sp preg_split('/(?<!\\\\)\#/'$match[2]-,PREG_SPLIT_NO_EMPTY);
  138.                         if(count($sp)){
  139.                             $value=trim(str_replace('\#','#',$sp[0]));
  140.                             if($value == '\w'){
  141.                                 $value ' ';
  142.                             }
  143.                         }else{
  144.                             $value='';
  145.                         }
  146.  
  147.                         $this->_strings[$charset][$key=$value;
  148.  
  149.                     }elseif(preg_match("/^\s*(\#.*)?$/",$line$match)){
  150.                         // ok, juste un commentaire
  151.                     }else {
  152.                         throw new Exception('Syntaxe error in file properties '.$fichier.' line '.$linenumber,211);
  153.                     }
  154.                 }
  155.             }
  156.             fclose ($f);
  157.         }else{
  158.             throw new Exception('Cannot load the resource '.$fichier,212);
  159.         }
  160.     }
  161. }
  162.  
  163.  
  164. /**
  165.  * static class to get a localized string
  166.  * @package  jelix
  167.  * @subpackage core
  168.  */
  169. class jLocale {
  170.     /**
  171.      *
  172.      */
  173.     static $bundles array();
  174.  
  175.     /**
  176.      * static class...
  177.      */
  178.     private function __construct(){}
  179.  
  180.     /**
  181.      * gets the current lang
  182.      * @return string 
  183.      */
  184.     static function getCurrentLang({
  185.         $s=$GLOBALS['gJConfig']->locale;
  186.         return substr($s,0strpos($s,'_'));
  187.     }
  188.     /**
  189.      * gets the current country.
  190.      * @return string 
  191.      */
  192.     static function getCurrentCountry ({
  193.         $s=$GLOBALS['gJConfig']->locale;
  194.         return substr($s,strpos($s,'_')+1);
  195.     }
  196.  
  197.     /**
  198.     * gets the correct string, for a given language.
  199.     *   if it can't get the correct language, it will try to gets the string
  200.     *   from the default language.
  201.     *   if both fails, it will raise an exception.
  202.     * @param string $key the key of the localized string
  203.     * @param array $args arguments to apply to the localized string with sprintf
  204.     * @param string $locale  the lang code. if null, use the default language
  205.     * @param string $charset the charset code. if null, use the default charset
  206.     * @return string the localized string
  207.     */
  208.     static function get ($key$args=null$locale=null$charset=null{
  209.         global $gJConfig;
  210.         try {
  211.             $file new jSelectorLoc($key$locale$charset);
  212.         }
  213.         catch(jExceptionSelector $e{
  214.             if($e->getCode(== 12throw $e;
  215.             if ($locale === null)  $locale $gJConfig->locale;
  216.             if ($charset === null$charset $gJConfig->charset;
  217.             throw new Exception('(200)The given locale key "'.$key.'" is invalid (for charset '.$charset.', lang '.$locale.')');
  218.         }
  219.  
  220.         $locale $file->locale;
  221.         $keySelector $file->module.'~'.$file->fileKey;
  222.         if (!isset (self::$bundles[$keySelector][$locale])) {
  223.             self::$bundles[$keySelector][$locale=  new jBundle ($file$locale);
  224.         }
  225.         $bundle self::$bundles[$keySelector][$locale];
  226.  
  227.         //try to get the message from the bundle.
  228.         $string $bundle->get ($file->messageKey$file->charset);
  229.         if ($string === null{
  230.             //if the message was not found, we're gonna
  231.             //use the default language and country.
  232.             if ($locale == $gJConfig->locale{
  233.                 throw new Exception('(210)The given locale key "'.$file->toString().'" does not exists in the default lang for the '.$file->charset.' charset');
  234.             }
  235.             return jLocale::get ($key$args$gJConfig->locale);
  236.         }
  237.         else {
  238.             //here, we know the message
  239.             if ($args!==null && $args !== array()) {
  240.                 $string call_user_func_array('sprintf'array_merge (array ($string)is_array ($args$args array ($args)));
  241.             }
  242.             return $string;
  243.         }
  244.     }
  245. }

Documentation generated on Wed, 07 Sep 2011 13:47:34 +0200 by phpDocumentor 1.4.3