You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
132 lines
3.4 KiB
132 lines
3.4 KiB
<?php
|
|
/**
|
|
* @copyright NetMonsters <team@netmonsters.ru>
|
|
* @link http://netmonsters.ru
|
|
* @package Majestic
|
|
* @subpackage Model
|
|
* @since 2010-02-23
|
|
*/
|
|
|
|
class I18N
|
|
{
|
|
|
|
static protected $domain = 'default';
|
|
static protected $locales = array();
|
|
static protected $bidi = array();
|
|
static protected $langs = array();
|
|
static protected $default = 'ru';
|
|
|
|
static protected $lang = '';
|
|
static protected $locale = '';
|
|
|
|
|
|
/**
|
|
* @throws InitializationException
|
|
* @internal mixed $lang default language set
|
|
*/
|
|
static public function init()
|
|
{
|
|
$config = Config::get(__CLASS__);
|
|
|
|
if (!is_array($config['locales'])) {
|
|
throw new InitializationException('key \'locales\' array\'s config is empty');
|
|
}
|
|
|
|
self::$locales = $config['locales'];
|
|
|
|
if (isset($config['bidi'])) {
|
|
self::$bidi = $config['bidi'];
|
|
}
|
|
|
|
if (isset($config['default'])) {
|
|
self::$default = $config['default'];
|
|
}
|
|
|
|
// language switching
|
|
if ($lang = Env::Post('lang')) {
|
|
self::setLang($lang);
|
|
header('Location: ' . Env::getRequestUri());
|
|
exit();
|
|
}
|
|
|
|
self::$lang = Env::Cookie('lang', self::getAcceptLanguage());
|
|
self::setLang(self::$lang);
|
|
self::$locale = self::$locales[self::$lang];
|
|
self::initForLocale(self::$locale);
|
|
}
|
|
|
|
static public function initForLocale($locale)
|
|
{
|
|
putenv('LANG=' . $locale);
|
|
setlocale(LC_ALL, $locale . '.UTF-8');
|
|
bindtextdomain(self::$domain, PATH . '/' . APP . '/src/i18n/');
|
|
textdomain(self::$domain);
|
|
bind_textdomain_codeset(self::$domain, 'UTF-8');
|
|
}
|
|
|
|
static protected function getAcceptLanguage()
|
|
{
|
|
$lang = self::$default;
|
|
|
|
if ($accept = Env::Server('HTTP_ACCEPT_LANGUAGE')) {
|
|
$accept = explode(',', $accept);
|
|
foreach ($accept as $a) {
|
|
if (($pos = strpos($a, ';q=')) !== false) {
|
|
$a = substr($a, 0, $pos);
|
|
}
|
|
if (($pos = strpos($a, '-')) !== false) {
|
|
$a = substr($a, 0, $pos) . '_' . strtoupper(substr($a, $pos + 1));
|
|
}
|
|
if (isset(self::$locales[$a])) {
|
|
$lang = $a;
|
|
break;
|
|
}
|
|
if ($key = array_search($a, self::$locales)) {
|
|
$lang = $key;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return $lang;
|
|
}
|
|
|
|
static protected function setLang($lang)
|
|
{
|
|
if (!array_key_exists($lang, self::$locales)) {
|
|
$lang = self::$default;
|
|
}
|
|
Env::setCookie('lang', $lang, time()+60*60*24*30, '/');
|
|
}
|
|
|
|
static public function getLang()
|
|
{
|
|
return self::$lang;
|
|
}
|
|
|
|
static public function getDefaultLang()
|
|
{
|
|
return self::$default;
|
|
}
|
|
|
|
static public function setLangs($langs = array())
|
|
{
|
|
self::$langs = $langs;
|
|
}
|
|
|
|
static public function getLangs()
|
|
{
|
|
return self::$langs;
|
|
}
|
|
|
|
static public function getLangName($code = false)
|
|
{
|
|
if (!$code) {
|
|
$code = self::$lang;
|
|
}
|
|
if (isset(self::$langs[$code])) {
|
|
return self::$langs[$code];
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
}
|