I18n.php 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. <?php declare(strict_types = 0);
  2. /*
  3. ** WeCom Center - tiny portable i18n layer.
  4. ** Translations live in locale/<lang>.php and return a flat key=>string map.
  5. ** Whatever language Zabbix is running in is used automatically; any missing
  6. ** key (or language without a file) falls back to English, so the module
  7. ** "speaks" every Zabbix language while remaining easy to extend.
  8. */
  9. namespace Modules\WecomCenter\Lib;
  10. use CWebUser;
  11. class I18n {
  12. private static string $locale_dir = '';
  13. private static array $strings = [];
  14. private static string $lang = 'en_US';
  15. public static function init(string $locale_dir): void {
  16. self::$locale_dir = rtrim($locale_dir, '/');
  17. self::$lang = self::currentLang();
  18. $en = self::loadFile('en');
  19. $loc = (self::$lang === 'en' || self::$lang === 'en_US') ? [] : self::loadFile(self::$lang);
  20. // English is the base; the active language overrides individual keys.
  21. self::$strings = array_merge($en, $loc);
  22. }
  23. private static function loadFile(string $lang): array {
  24. $file = self::$locale_dir.'/'.$lang.'.php';
  25. if (is_file($file)) {
  26. $data = include $file;
  27. if (is_array($data)) {
  28. return $data;
  29. }
  30. }
  31. return [];
  32. }
  33. /**
  34. * Current frontend language, e.g. "zh_CN", "en_US", "ru_RU".
  35. */
  36. public static function currentLang(): string {
  37. if (class_exists('CWebUser') && is_array(CWebUser::$data) && !empty(CWebUser::$data['lang'])) {
  38. return (string) CWebUser::$data['lang'];
  39. }
  40. return 'en_US';
  41. }
  42. public static function lang(): string {
  43. return self::$lang;
  44. }
  45. /**
  46. * Translate a key. Placeholders {1},{2}... are replaced with $args.
  47. */
  48. public static function t(string $key, array $args = []): string {
  49. $s = self::$strings[$key] ?? $key;
  50. foreach (array_values($args) as $i => $v) {
  51. $s = str_replace('{'.($i + 1).'}', (string) $v, $s);
  52. }
  53. return $s;
  54. }
  55. }