83 lines
2.5 KiB
PHP
83 lines
2.5 KiB
PHP
<?php
|
|
namespace App\Core;
|
|
|
|
class I18n {
|
|
private static $lang = 'en';
|
|
private static $translations = [];
|
|
private static $fallback = [];
|
|
private static $loaded = false;
|
|
|
|
// 支持的语言列表
|
|
const LANGUAGES = [
|
|
'en' => 'English',
|
|
'th' => 'ไทย',
|
|
'vi' => 'Tiếng Việt',
|
|
'zh' => '中文',
|
|
'ms' => 'Bahasa Melayu',
|
|
'fil' => 'Filipino',
|
|
'bn' => 'বাংলা',
|
|
];
|
|
|
|
public static function init($db = null) {
|
|
if (self::$loaded) return;
|
|
|
|
// 优先级: URL参数 > Session > Cookie > 浏览器 > 默认en
|
|
if (!empty($_GET['lang']) && isset(self::LANGUAGES[$_GET['lang']])) {
|
|
self::$lang = $_GET['lang'];
|
|
} elseif (!empty($_SESSION['lang'])) {
|
|
self::$lang = $_SESSION['lang'];
|
|
} elseif (!empty($_COOKIE['lang'])) {
|
|
self::$lang = $_COOKIE['lang'];
|
|
} else {
|
|
self::$lang = self::detectBrowserLang();
|
|
}
|
|
|
|
$_SESSION['lang'] = self::$lang;
|
|
setcookie('lang', self::$lang, time() + 86400 * 365, '/');
|
|
|
|
self::loadFromFile();
|
|
self::$loaded = true;
|
|
}
|
|
|
|
private static function detectBrowserLang(): string {
|
|
$accept = $_SERVER['HTTP_ACCEPT_LANGUAGE'] ?? '';
|
|
foreach (self::LANGUAGES as $code => $name) {
|
|
if (stripos($accept, $code) !== false) return $code;
|
|
}
|
|
return 'en';
|
|
}
|
|
|
|
private static function loadFromFile() {
|
|
$file = ROOT_PATH . 'Lang/' . self::$lang . '.php';
|
|
if (file_exists($file)) {
|
|
self::$translations = require $file;
|
|
}
|
|
// 始终加载英文作为fallback
|
|
$enFile = ROOT_PATH . 'Lang/en.php';
|
|
if (file_exists($enFile)) {
|
|
self::$fallback = require $enFile;
|
|
}
|
|
}
|
|
|
|
public static function t(string $key, array $params = []): string {
|
|
$text = self::$translations[$key] ?? self::$fallback[$key] ?? $key;
|
|
foreach ($params as $k => $v) {
|
|
$text = str_replace(':' . $k, $v, $text);
|
|
}
|
|
return $text;
|
|
}
|
|
|
|
public static function getLang(): string { return self::$lang; }
|
|
public static function setLang(string $lang) {
|
|
if (isset(self::LANGUAGES[$lang])) {
|
|
self::$lang = $lang;
|
|
self::$loaded = false;
|
|
self::init();
|
|
}
|
|
}
|
|
public static function getLanguages(): array { return self::LANGUAGES; }
|
|
}
|
|
|
|
// 全局快捷函数
|
|
function __($key, $params = []) { return I18n::t($key, $params); }
|