当前位置: 首页 > 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.jsqmd.com/news/947350/

相关文章:

  • SAIL系统架构:SRAM与查找表优化LLM推理性能
  • 开源报表工具JimuReport实战:手把手教你配置SQL数据源并生成动态销售报表
  • AI工具如何重塑法律服务效率?揭秘2024智能法务整合的7个关键决策点
  • 如何在5分钟内快速上手B站视频下载神器downkyi:完整使用指南
  • PHP图像处理与GD库实战
  • 道路积水数据集 路面积水识别数据集 图片数量4524,xml和txt标签都有;公路积水数据集 ✓类别:puddle;
  • CAPL数据处理避坑指南:当byte数组遇上Hex字符串,这些细节你注意了吗?
  • Spartan-6 FPGA上跑通AD9238双路12位25MHz实时采集的完整ISE工程包
  • C#抽象类 接口(简答 + 答题话术)
  • 性价比最高的仓储软件(WMS)怎么选 - 品牌排行榜
  • 第九章:Token 优化与高效省钱配置(重点)
  • 3分钟快速部署智慧树自动刷课插件:彻底解放双手的终极学习助手
  • 2026年|迎战5月查重死线!10款全网最火降AI工具亲测,零成本高效降AI率指南 - 降AI实验室
  • 气缸驱动并联机器人位姿控制策略【附仿真】
  • Vue版Cesium卫星轨道+雷达扫描三维可视化组件(含CZML数据与小程序适配)
  • 2026年6月可靠的工业皮带生产厂家推荐,输送带/工业皮带/pvc输送带/食品输送带,工业皮带源头厂家有哪些 - 品牌推荐师
  • 联想AI主机Mini: 优质AI订阅替代方案实测
  • PHP图像识别与QR码生成技术
  • 语义内核形式化模型:AI内容生成的统一数学原理与工程实践
  • Grok-1本地部署构建自动素材池实战指南
  • 仓储软件(WMS)值得推荐的实用选择参考 - 品牌排行榜
  • 从安装到调参:一份超详细的imbalanced-learn库实战指南(附Jupyter Notebook代码)
  • 深耕车载数字健康场景,守护全维度驾乘安全与体验
  • 小程序毕业设计-基于ssm电影院网上订票系统的设计与实现小程序基于Android的电影院网上订票系统(源码+LW+部署文档+全bao+远程调试+代码讲解等)
  • GBase 8s数据库高可用之—RHAC远程高可用集群详解
  • PHP图形验证码技术实现
  • 从收藏吃灰到高效执行:2026年度高内聚代码灵感仓储工具深度解析
  • 第七章:自定义命令、规则与上下文
  • 别慌!网站突然打不开显示Error 522?手把手教你排查百度云加速与源站的连接问题
  • DeepSeek V4实测:百万上下文与MoE架构如何重构AI成本模型