PHP多语言国际化与本地化
PHP多语言国际化与本地化国际化是面向多语言用户的必备功能。PHP可以通过数组翻译、gettext扩展等方式实现多语言支持。今天说说PHP中国际化的实现。最简单的翻译方式是用PHP数组。phpclass Translator{private array $translations [];private string $locale;public function __construct(string $locale zh_CN){$this-locale $locale;$this-load();}private function load(): void{$file __DIR__ . /lang/{$this-locale}.php;if (file_exists($file)) {$this-translations require $file;}}public function trans(string $key, array $params []): string{$message $this-translations[$key] ?? $key;foreach ($params as $name $value) {$message str_replace(:{$name}, (string)$value, $message);}return $message;}public function setLocale(string $locale): void{$this-locale $locale;$this-load();}public function choice(string $key, int $number, array $params []): string{$messages $this-translations[$key] ?? [$key];$index $number 1 ? 0 : 1;$message $messages[$index] ?? $messages[0];$params[count] $number;foreach ($params as $name $value) {$message str_replace(:{$name}, (string)$value, $message);}return $message;}}?// lang/zh_CN.phpreturn [welcome 欢迎来到我们的网站,greeting 你好:name,new_messages [:count 条新消息, :count 条新消息],login 登录,logout 退出,];?// lang/en.phpreturn [welcome Welcome to our website,greeting Hello, :name!,new_messages [:count new message, :count new messages],login Login,logout Logout,];?$translator new Translator(zh_CN);echo $translator-trans(welcome) . \n;echo $translator-trans(greeting, [name 张三]) . \n;echo $translator-trans(new_messages, [count 5]) . \n;$translator-setLocale(en);echo $translator-trans(welcome) . \n;echo $translator-choice(new_messages, 3, [count 3]) . \n;?日期和数字的本地化也很重要。phpclass Localization{public static function formatDate(DateTime $date, string $locale zh_CN): string{$formats [zh_CN Y年m月d日, en_US F j, Y];return $date-format($formats[$locale] ?? Y-m-d);}public static function formatCurrency(float $amount, string $locale zh_CN): string{$symbols [zh_CN ¥, en_US $, ja_JP ¥];return ($symbols[$locale] ?? ¥) . number_format($amount, 2);}public static function formatNumber(float $number, string $locale zh_CN): string{$separators [zh_CN [., ,], en_US [., ,], de_DE [,, .]];[$decimal, $thousand] $separators[$locale] ?? [., ,];$parts explode(., (string)$number);return number_format((int)$parts[0], 0, ., $thousand) . (isset($parts[1]) ? $decimal . substr($parts[1], 0, 2) : );}}echo Localization::formatDate(new DateTime()) . \n;echo Localization::formatCurrency(1234567.89, zh_CN) . \n;echo Localization::formatCurrency(1234567.89, en_US) . \n;?多语言项目中翻译资源建议按模块划分。日期、数字、货币的格式因地区而异需要统一处理。好的国际化设计让产品可以轻松扩展到新的语言市场。