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
  8. @copyright  2001-2005 CopixTeam, 2005-2012 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
  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.  * static class to get a localized string
  20.  * @package  jelix
  21.  * @subpackage core
  22.  */
  23. class jLocale {
  24.     /**
  25.      *
  26.      */
  27.     static $bundles array();
  28.  
  29.     /**
  30.      * static class...
  31.      */
  32.     private function __construct(){}
  33.  
  34.     /**
  35.      * gets the current lang
  36.      * @return string 
  37.      */
  38.     static function getCurrentLang(){
  39.         $s=jApp::config()->locale;
  40.         return substr($s,0strpos($s,'_'));
  41.     }
  42.     /**
  43.      * gets the current country.
  44.      * @return string 
  45.      */
  46.     static function getCurrentCountry (){
  47.         $s jApp::config()->locale;
  48.         return substr($s,strpos($s,'_')+1);
  49.     }
  50.  
  51.     /**
  52.     * gets the correct string, for a given language.
  53.     *   if it can't get the correct language, it will try to gets the string
  54.     *   from the default language.
  55.     *   if both fails, it will raise an exception.
  56.     * @param string $key the key of the localized string
  57.     * @param array $args arguments to apply to the localized string with sprintf
  58.     * @param string $locale  the lang code. if null, use the default language
  59.     * @param string $charset the charset code. if null, use the default charset
  60.     * @return string the localized string
  61.     */
  62.     static function get ($key$args=null$locale=null$charset=null{
  63.  
  64.         $config jApp::config();
  65.         try {
  66.             $file new jSelectorLoc($key$locale$charset);
  67.         }
  68.         catch (jExceptionSelector $e{
  69.             // the file is not found
  70.             if ($e->getCode(== 12throw $e;
  71.             if ($locale === null)  $locale $config->locale;
  72.             if ($charset === null$charset $config->charset;
  73.             if ($locale != $config->fallbackLocale && $config->fallbackLocale{
  74.                 return jLocale::get ($key$args$config->fallbackLocale$charset);
  75.             }
  76.             else
  77.                 throw new Exception('(200)The given locale key "'.$key
  78.                                 .'" is invalid (for charset '.$charset
  79.                                 .', lang '.$locale.')');
  80.         }
  81.  
  82.         $locale $file->locale;
  83.         $keySelector $file->module.'~'.$file->fileKey;
  84.  
  85.         if (!isset (self::$bundles[$keySelector][$locale])) {
  86.             self::$bundles[$keySelector][$locale=  new jBundle ($file$locale);
  87.         }
  88.  
  89.         $bundle self::$bundles[$keySelector][$locale];
  90.  
  91.         //try to get the message from the bundle.
  92.         $string $bundle->get ($file->messageKey$file->charset);
  93.         if ($string === null{
  94.             if ($locale == $config->fallbackLocale{
  95.                 throw new Exception('(210)The given locale key "'.$file->toString().'" does not exists in the default lang and in the fallback lang for the '.$file->charset.' charset');
  96.             }
  97.             // if the message was not found, we're gonna
  98.             //use the default language and country.
  99.             else if ($locale == $config->locale{
  100.                 if ($config->fallbackLocale)
  101.                     return jLocale::get ($key$args$config->fallbackLocale$charset);
  102.                 throw new Exception('(210)The given locale key "'.$file->toString().'" does not exists in the default lang for the '.$file->charset.' charset');
  103.             }
  104.             return jLocale::get ($key$args$config->locale);
  105.         }
  106.         else {
  107.             //here, we know the message
  108.             if ($args !== null && $args !== array()) {
  109.                 $string call_user_func_array('sprintf'array_merge (array ($string)is_array ($args$args array ($args)));
  110.             }
  111.             return $string;
  112.         }
  113.     }
  114.  
  115.     /**
  116.      * says if the given locale or lang code is available in the application
  117.      * @param string $locale the locale code (xx_YY) or a lang code (xx)
  118.      * @param boolean $strictCorrespondance if true don't try to find a locale from an other country
  119.      * @return string the corresponding locale
  120.      */
  121.     static function getCorrespondingLocale($l$strictCorrespondance=false{
  122.  
  123.         if (strpos($l'_'=== false{
  124.             $l self::langToLocale($l);
  125.         }
  126.  
  127.         if ($l != ''{
  128.             $avLoc &jApp::config()->availableLocales;
  129.             if (in_array($l$avLoc)) {
  130.                 return $l;
  131.             }
  132.             if ($strictCorrespondance)
  133.                 return '';
  134.             $l2 self::langToLocale(substr($l0strpos($l'_')));
  135.             if ($l2 != $l && in_array($l2$avLoc)) {
  136.                 return $l2;
  137.             }
  138.         }
  139.         return '';
  140.     }
  141.  
  142.     /**
  143.      * returns the locale corresponding of one of the accepted language indicated
  144.      * by the browser, and which is available in the application.
  145.      * @return string the locale. empty if not found.
  146.      */
  147.     static function getPreferedLocaleFromRequest({
  148.         if (!isset($_SERVER['HTTP_ACCEPT_LANGUAGE']))
  149.             return '';
  150.  
  151.         $languages explode(','$_SERVER['HTTP_ACCEPT_LANGUAGE']);
  152.         foreach ($languages as $bl{
  153.             if (!preg_match("/^([a-zA-Z]{2,3})(?:[-_]([a-zA-Z]{2,3}))?(;q=[0-9]\\.[0-9])?$/",$bl,$match))
  154.                 continue;
  155.             $l strtolower($match[1]);
  156.             if (isset($match[2]))
  157.                 $l .= '_'.strtoupper($match[2]);
  158.             $lang self::getCorrespondingLocale($l);
  159.             if ($lang != '')
  160.                 return $lang;
  161.         }
  162.         return '';
  163.     }
  164.  
  165.     /**
  166.      * @var array content of the lang_to_locale.ini.php
  167.      */
  168.     static protected $langToLocale = null;
  169.  
  170.     /**
  171.      * returns the locale corresponding to a lang.
  172.      *
  173.      * The file lang_to_locale give corresponding locale, but you can override these
  174.      * association into the langToLocale section of the main configuration
  175.      * @param string $lang a lang code (xx)
  176.      * @return string the corresponding locale (xx_YY)
  177.      */
  178.     static function langToLocale($lang{
  179.         $conf jApp::config();
  180.         if (isset($conf->langToLocale[$lang]))
  181.             return $conf->langToLocale[$lang];
  182.         if (is_null(self::$langToLocale)) {
  183.             self::$langToLocale @parse_ini_file(JELIX_LIB_CORE_PATH.'lang_to_locale.ini.php');
  184.         }
  185.         if (isset(self::$langToLocale[$lang])) {
  186.             return self::$langToLocale[$lang];
  187.         }
  188.         return '';
  189.     }
  190. }

Documentation generated on Wed, 04 Jan 2017 22:55:45 +0100 by phpDocumentor 1.4.3