13 private static $currentLang =
null;
14 private static $messages = [];
15 private static $customMessages = [];
16 private static $userMessages = [];
17 private static $includedFiles = [];
18 private static $lazyLoadFiles = [];
19 private static $triedFiles = [];
32 if ($language ===
null)
35 if (self::$currentLang ===
null)
41 $language = self::$currentLang;
45 if (!isset(self::$messages[$language][
$code]))
47 self::loadLazy(
$code, $language);
50 $s = self::$messages[$language][
$code] ??
null;
52 if (is_array($replace) && $s !==
null)
54 $s = strtr($s, $replace);
67 if (($realPath = realpath($file)) !==
false)
71 $file = Path::normalize($file);
73 self::$lazyLoadFiles[$file] = $file;
81 if (self::$currentLang ===
null)
87 if ($language !==
null)
89 self::$currentLang = $language;
93 return (self::$currentLang !==
null ? self::$currentLang :
'en');
98 self::$currentLang = $language;
110 private static function includeLangFiles($file, $language, &$loadedLangFile)
112 static $langDirCache = [];
115 static $openBasedir = [], $openBasedirRestriction;
116 if ($openBasedirRestriction ===
null)
118 $openBasedirTmp = ini_get(
'open_basedir');
119 if (!empty($openBasedirTmp))
123 $openBasedirTmp = explode(
124 (strncasecmp(PHP_OS,
'WIN', 3) == 0 ?
';' :
':'),
127 foreach ($openBasedirTmp as $testDir)
129 if (!empty($testDir))
131 $testDir = Path::normalize($testDir);
132 if (is_dir($testDir))
134 $openBasedir[] = $testDir;
139 $openBasedirRestriction = !empty($openBasedir);
142 $path = Path::getDirectory($file);
144 if (isset($langDirCache[
$path]))
146 $langDir = $langDirCache[
$path];
147 $fileName = mb_substr($file, (mb_strlen($langDir) - 5));
154 while (($slashPos = mb_strrpos($filePath,
'/')) !==
false)
156 $filePath = mb_substr($filePath, 0, $slashPos);
157 if ($openBasedirRestriction ===
true)
159 $withinOpenBasedir =
false;
160 foreach ($openBasedir as $testDir)
162 if (stripos($filePath, $testDir) === 0)
164 $withinOpenBasedir =
true;
168 if (!$withinOpenBasedir)
173 $langPath = $filePath .
'/lang';
174 if (is_dir($langPath))
176 $langDir = $langPath;
178 $langDirCache[
$path] = $langDir;
189 if ($defaultLang <> $language)
209 $mess = array_merge($mess, self::includeFile(
$langFile));
227 if ($language ===
null)
234 $file = Path::normalize($file);
237 if (!isset(self::$messages[$language]))
239 self::$messages[$language] = [];
243 if (!isset(self::$userMessages[$language]))
245 self::$userMessages[$language] = self::loadUserMessages($language);
249 $mess = self::includeLangFiles($file, $language,
$langFile);
257 if (isset(self::$customMessages[$language][
$key]))
259 self::$messages[$language][
$key] = $mess[
$key] = self::$customMessages[$language][
$key];
263 if ($convertEncoding)
265 if ($targetEncoding !==
'utf-8' || !preg_match(
'//u',
$val))
267 $val = Encoding::convertEncoding(
$val, $sourceEncoding, $targetEncoding);
272 self::$messages[$language][
$key] =
$val;
288 if ($language ===
null)
293 if (!isset(self::$customMessages[$language]))
295 self::$customMessages[$language] = [];
299 $mess = self::includeLangFiles(Path::normalize($file), $language,
$langFile);
307 if ($convertEncoding)
309 if ($targetEncoding !==
'utf-8' || !preg_match(
'//u',
$val))
311 $val = Encoding::convertEncoding(
$val, $sourceEncoding, $targetEncoding);
316 self::$customMessages[$language][
$key] =
$val;
321 private static function loadLazy(
$code, $language)
329 if (!isset(self::$triedFiles[$language]))
331 self::$triedFiles[$language] = [];
337 for (
$i = 3;
$i >= 1;
$i--)
339 if (isset($trace[
$i]) && stripos($trace[
$i][
"function"],
"GetMessage") === 0)
341 $currentFile = Path::normalize($trace[
$i][
"file"]);
344 self::$lazyLoadFiles[$currentFile] = $currentFile;
349 if ($currentFile !==
null && isset(self::$lazyLoadFiles[$currentFile]))
352 if (!isset(self::$triedFiles[$language][$currentFile]))
355 self::$triedFiles[$language][$currentFile] =
true;
357 unset(self::$lazyLoadFiles[$currentFile]);
360 if (!isset(self::$messages[$language][
$code]))
364 if (($file = end(self::$lazyLoadFiles)) !==
false)
368 if (!isset(self::$triedFiles[$language][$file]))
371 self::$triedFiles[$language][$file] =
true;
375 if (isset(self::$messages[$language][
$code]))
377 if (defined(
"BX_MESS_LOG") && $currentFile !==
null)
379 file_put_contents(BX_MESS_LOG,
'CTranslateUtils::CopyMessage("' .
$code .
'", "' . $file .
'", "' . $currentFile .
'");' .
"\n", FILE_APPEND);
384 while (($file = prev(self::$lazyLoadFiles)) !==
false);
386 foreach ($unset as $file)
388 unset(self::$lazyLoadFiles[$file]);
392 if (!isset(self::$messages[$language][
$code]) && defined(
"BX_MESS_LOG"))
394 file_put_contents(BX_MESS_LOG,
$code .
": not found for " . $currentFile .
"\n", FILE_APPEND);
404 private static function loadUserMessages(
$lang)
410 $mess = self::includeFile($fname);
428 private static function includeFile(
$path)
437 if (!empty(self::$userMessages))
439 $path = str_replace(
"\\",
"/", realpath(
$path));
442 foreach (self::$userMessages as $messages)
444 if (isset($messages[
$path]) && is_array($messages[
$path]))
465 static $subst = [
'ua' =>
'en',
'kz' =>
'ru',
'by' =>
'ru',
'ru' =>
'ru',
'en' =>
'en',
'de' =>
'en'];
466 if (isset($subst[
$lang]))
468 return $subst[
$lang];
471 $options = Configuration::getValue(
"default_language");
486 return self::$includedFiles;
518 $value = (int)$value;
519 if ($language ===
null)
526 $value = (-1) * $value;
536 elseif ($value == 1 || $value % 100 == 0)
544 elseif (($value % 100) >= 3 && ($value % 100) <= 10)
557 $pluralForm = (($value > 1) ? 1 : 0);
565 $pluralForm = (($value !== 1) ? 1 : 0);
572 && ($value % 100 !== 11)
579 && ($value % 10 <= 4)
582 || ($value % 100 >= 20)
604 || $value % 100 >= 20
static getBackTrace($limit=0, $options=null, $skip=1)
static getLocal($path, $root=null)
static loadLanguageFile($file, $language=null, $normalize=true)
static getMessagePlural(string $code, int $value, ?array $replace=null, ?string $language=null)
static loadCustomMessages($file, $language=null)
static getIncludedFiles()
static getPluralForm($value, $language=null)
static loadMessages($file)
static setCurrentLang($language)
static getDefaultLang($lang)
static getMessage($code, $replace=null, $language=null)
static convertLangPath($langFile, $language)
static getEncodings($language, $langFile)
foreach(['Bitrix\\Main'=> '/lib', 'Psr\\Container'=> '/vendor/psr/container/src', 'Psr\\Log'=> '/vendor/psr/log/src', 'Psr\\Http\\Message'=> '/vendor/psr/http-message/src', 'Psr\\Http\\Client'=> '/vendor/psr/http-client/src', 'Http\\Promise'=> '/vendor/php-http/promise/src', 'PHPMailer\\PHPMailer'=> '/vendor/phpmailer/phpmailer/src', 'GeoIp2'=> '/vendor/geoip2/geoip2/src', 'MaxMind\\Db'=> '/vendor/maxmind-db/reader/src/MaxMind/Db', 'PhpParser'=> '/vendor/nikic/php-parser/lib/PhpParser', 'Recurr'=> '/vendor/simshaun/recurr/src/Recurr',] as $namespace=> $namespacePath) $documentRoot
if(!defined('SITE_ID')) $lang
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)