.php and return a flat key=>string map. ** Whatever language Zabbix is running in is used automatically; any missing ** key (or language without a file) falls back to English, so the module ** "speaks" every Zabbix language while remaining easy to extend. */ namespace Modules\WecomCenter\Lib; use CWebUser; class I18n { private static string $locale_dir = ''; private static array $strings = []; private static string $lang = 'en_US'; public static function init(string $locale_dir): void { self::$locale_dir = rtrim($locale_dir, '/'); self::$lang = self::currentLang(); $en = self::loadFile('en'); $loc = (self::$lang === 'en' || self::$lang === 'en_US') ? [] : self::loadFile(self::$lang); // English is the base; the active language overrides individual keys. self::$strings = array_merge($en, $loc); } private static function loadFile(string $lang): array { $file = self::$locale_dir.'/'.$lang.'.php'; if (is_file($file)) { $data = include $file; if (is_array($data)) { return $data; } } return []; } /** * Current frontend language, e.g. "zh_CN", "en_US", "ru_RU". */ public static function currentLang(): string { if (class_exists('CWebUser') && is_array(CWebUser::$data) && !empty(CWebUser::$data['lang'])) { return (string) CWebUser::$data['lang']; } return 'en_US'; } public static function lang(): string { return self::$lang; } /** * Translate a key. Placeholders {1},{2}... are replaced with $args. */ public static function t(string $key, array $args = []): string { $s = self::$strings[$key] ?? $key; foreach (array_values($args) as $i => $v) { $s = str_replace('{'.($i + 1).'}', (string) $v, $s); } return $s; } }