php实现语言切换
实现 PHP 语言切换的方法
使用数组存储多语言文本
在 PHP 中可以通过数组存储不同语言的文本内容,根据用户选择切换显示语言。
$languages = [
'en' => [
'welcome' => 'Welcome',
'login' => 'Login'
],
'zh' => [
'welcome' => '欢迎',
'login' => '登录'
]
];
$currentLang = $_GET['lang'] ?? 'en'; // 从URL参数获取语言
echo $languages[$currentLang]['welcome'];
使用 gettext 扩展
PHP 的 gettext 扩展是更专业的国际化解决方案,需要服务器支持。
-
创建语言文件目录结构:
locale/ en_US/LC_MESSAGES/ messages.po messages.mo zh_CN/LC_MESSAGES/ messages.po messages.mo -
生成 .po 和 .mo 文件:
xgettext -d messages your_script.php msgfmt messages.po -o messages.mo -
PHP 代码实现:
putenv('LC_ALL='.$_GET['lang']); setlocale(LC_ALL, $_GET['lang']); bindtextdomain('messages', './locale'); textdomain('messages');
echo _("Welcome");
#### 使用 Cookie 或 Session 存储语言偏好
可以通过 Cookie 或 Session 记住用户的语言选择。
```php
// 设置语言
if(isset($_GET['lang'])) {
setcookie('lang', $_GET['lang'], time()+3600*24*30, '/');
$_SESSION['lang'] = $_GET['lang'];
}
// 获取语言
$lang = $_COOKIE['lang'] ?? $_SESSION['lang'] ?? 'en';
结合数据库存储多语言内容
对于大型应用,可以将多语言内容存储在数据库中。
// 数据库表结构示例
CREATE TABLE translations (
id INT,
lang_code VARCHAR(5),
text_key VARCHAR(50),
text_value TEXT,
PRIMARY KEY (id, lang_code)
);
// 查询当前语言文本
$stmt = $pdo->prepare("SELECT text_value FROM translations WHERE text_key = ? AND lang_code = ?");
$stmt->execute(['welcome', $currentLang]);
$text = $stmt->fetchColumn();
使用第三方库
可以考虑使用成熟的国际化库如 Symfony Translation 组件:
use Symfony\Component\Translation\Translator;
use Symfony\Component\Translation\Loader\ArrayLoader;
$translator = new Translator('fr');
$translator->addLoader('array', new ArrayLoader());
$translator->addResource('array', [
'Hello World!' => 'Bonjour !',
], 'fr');
echo $translator->trans('Hello World!');
前端与后端结合
可以通过 AJAX 请求实现无刷新语言切换:
// JavaScript
function changeLanguage(lang) {
fetch('/change_language.php?lang='+lang)
.then(response => location.reload());
}
// change_language.php
session_start();
$_SESSION['lang'] = $_GET['lang'];
每种方法适用于不同场景,简单项目可以使用数组存储,专业项目推荐使用 gettext 或专业库,数据库方案适合内容频繁变化的场景。







