当前位置: 首页 > news >正文

PHP国际化与多语言支持实现

PHP国际化与多语言支持实现

国际化(i18n)是面向多语言用户的应用必须考虑的问题。PHP提供了gettext扩展用于翻译,也可以自己实现简单的多语言系统。

先看看最基本的数组翻译方式,适合小型项目:

```php
class Translator
{
private array $translations = [];
private string $locale;

public function __construct(string $locale = 'zh_CN')
{
$this->locale = $locale;
$this->loadTranslations();
}

private function loadTranslations(): 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->loadTranslations();
}

public function getLocale(): string
{
return $this->locale;
}

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.php
return [
'welcome' => '欢迎来到我们的网站',
'greeting' => '你好,:name!',
'logout' => '退出登录',
'login' => '登录',
'register' => '注册',
'notifications' => '通知',
'new_message' => '你有:count条新消息',
'file_uploaded' => '已上传文件:file',
'email_required' => '邮箱不能为空',
'email_invalid' => '邮箱格式不正确',
'login_success' => '登录成功',
'login_failed' => '登录失败',
'order_placed' => '订单:order_id已创建',
'order_shipped' => '订单:order_id已发货',
'items_count' => [':count个项目', ':count个项目'],
];
?>

// lang/en.php
return [
'welcome' => 'Welcome to our website',
'greeting' => 'Hello, :name!',
'logout' => 'Logout',
'login' => 'Login',
'register' => 'Register',
'notifications' => 'Notifications',
'new_message' => 'You have :count new messages',
'file_uploaded' => 'File :file has been uploaded',
'email_required' => 'Email is required',
'email_invalid' => 'Invalid email format',
'login_success' => 'Login successful',
'login_failed' => 'Login failed',
'order_placed' => 'Order :order_id has been created',
'order_shipped' => 'Order :order_id has been shipped',
'items_count' => [':count item', ':count items'],
];
?>

// 使用翻译器
$translator = new Translator('zh_CN');
echo $translator->trans('welcome') . "\n";
echo $translator->trans('greeting', ['name' => '张三']) . "\n";
echo $translator->trans('new_message', ['count' => 5]) . "\n";
echo $translator->choice('items_count', 1, ['count' => 1]) . "\n";
echo $translator->choice('items_count', 5, ['count' => 5]) . "\n";

// 切换语言
$translator->setLocale('en');
echo $translator->trans('welcome') . "\n";
echo $translator->trans('new_message', ['count' => 3]) . "\n";
?>
```

国际化需要注意字符编码。PHP的mbstring扩展提供了多字节字符串处理支持:

```php
// 多字节字符串处理
$chineseText = "你好世界";
echo "长度: " . mb_strlen($chineseText, 'UTF-8') . "\n";
echo "截取: " . mb_substr($chineseText, 0, 2, 'UTF-8') . "\n";

// 设置内部编码
mb_internal_encoding('UTF-8');
mb_http_output('UTF-8');
ob_start('mb_output_handler');

// 日期时间本地化
$timestamp = time();
$formats = [
'zh_CN' => 'Y年m月d日 H:i:s',
'en_US' => 'm/d/Y h:i:s A',
'ja_JP' => 'Y年m月d日 H時i分s秒',
];

foreach ($formats as $locale => $format) {
setlocale(LC_TIME, $locale . '.UTF-8');
echo "$locale: " . strftime($format, $timestamp) . "\n";
}
?>
```

多语言项目还需要考虑文本方向、数字格式、货币符号、时区等差异。在实际项目中,建议使用成熟的国际化库或框架的多语言支持功能,避免自己从头实现。

http://www.gsyq.cn/news/1458863.html

相关文章:

  • 如何在5分钟内快速上手B站视频下载神器downkyi:完整使用指南
  • 性价比最高的仓储软件(WMS)怎么选 - 品牌排行榜
  • C#抽象类 接口(简答 + 答题话术)
  • PHP图像识别与QR码生成技术
  • Grok-1本地部署构建自动素材池实战指南
  • 从安装到调参:一份超详细的imbalanced-learn库实战指南(附Jupyter Notebook代码)
  • 仓储软件(WMS)值得推荐的实用选择参考 - 品牌排行榜
  • 从收藏吃灰到高效执行:2026年度高内聚代码灵感仓储工具深度解析
  • 量子退火在最小顶点多割问题中的应用与优化
  • 工单响应时效从47分钟压缩至92秒,这3个AI集成节点你绝对漏掉了
  • 百度网盘限速终结者:3分钟搞定高速下载的终极方案
  • 用超声波传感器与Arduino制作自由形态电子秤:从测距到称重的跨界实践
  • PHP图数据结构与算法实现
  • Gemma 4 9B:面向开发者的轻量级AI生产力引擎
  • 动态多重网络层间差异检验:谱嵌入与Bootstrap方法
  • OpenCode 教程目录
  • 量子上三角矩阵代数UTq(n)的构造与Hopf结构解析
  • 公平k中心聚类算法:原理、优化与应用
  • 大模型能力演进:从版本幻觉到多模态原生表征
  • 避坑指南:STM32F103标准库DAC配置的那些“坑”与最佳实践
  • 利用快马内置git环境,三步完成项目原型创建与版本初始化
  • Gemini 3.0实战指南:多模态理解与长上下文推理落地方法论
  • 开发2天,测试2个月:AI代码让谁偷懒了?
  • ZYNQ Linux下UIO中断配置踩坑记:从/dev下找不到uio设备到按键触发成功
  • 效率飙升:快马AI为你自动生成CentOS7运维管理效率工具包
  • 手机号定位查询系统:3秒获取号码归属地与地理位置
  • 避坑指南:STM32 HAL库下TM1640时序调试的那些事儿(基于SysTick和定时器两种延时)
  • 十年教学经验总结:新手小提琴怎么选?全价位高口碑机型实测推荐
  • 别再让EMC测试卡脖子!硬件工程师必看的电磁兼容设计实战避坑指南
  • 大语言模型越狱攻击:原理、挑战与防御策略