本文目录导读:

在 PHP 中翻译键(Translation Keys)通常是指国际化(i18n)和本地化(l10n)的实现,以下是几种常见的做法:
简单的数组映射法
<?php
// translations.php
return [
'en' => [
'welcome' => 'Welcome to our website',
'hello' => 'Hello, :name',
'logout' => 'Logout',
],
'zh' => [
'welcome' => '欢迎访问我们的网站',
'hello' => '你好,:name',
'logout' => '登出',
],
'ja' => [
'welcome' => 'ウェブサイトへようこそ',
'hello' => 'こんにちは、:name',
'logout' => 'ログアウト',
],
];
// 使用示例
function translate($key, $locale = 'en', $params = []) {
$translations = require 'translations.php';
$text = $translations[$locale][$key] ?? $key;
// 替换参数
foreach ($params as $param => $value) {
$text = str_replace(':' . $param, $value, $text);
}
return $text;
}
// 调用
echo translate('welcome', 'zh'); // 输出: 欢迎访问我们的网站
echo translate('hello', 'zh', ['name' => '张三']); // 输出: 你好,张三
使用 Gettext 扩展
<?php
// 设置语言环境
putenv('LC_ALL=zh_CN');
setlocale(LC_ALL, 'zh_CN');
bindtextdomain('messages', './locale');
textdomain('messages');
// 翻译
echo _('Welcome to our website');
// 或
echo gettext('Welcome to our website');
使用 Laravel 框架
<?php
// resources/lang/zh/messages.php
return [
'welcome' => '欢迎访问我们的网站',
'hello' => '你好,:name',
];
// 使用
echo __('messages.welcome');
echo __('messages.hello', ['name' => '张三']);
// 设置中文为默认语言
app()->setLocale('zh');
使用 Symfony Translation 组件
<?php
use Symfony\Component\Translation\Translator;
use Symfony\Component\Translation\Loader\ArrayLoader;
$translator = new Translator('zh_CN');
$translator->addLoader('array', new ArrayLoader());
$translator->addResource('array', [
'welcome' => '欢迎访问我们的网站',
'hello' => '你好,%name%',
], 'zh_CN');
echo $translator->trans('welcome');
echo $translator->trans('hello', ['%name%' => '张三']);
使用 .mo/.po 文件(Gettext 格式)
<?php
// 使用 Poedit 创建翻译文件
// locale/zh_CN/LC_MESSAGES/messages.po
msgid "Welcome"
msgstr "欢迎"
msgid "Hello, %s"
msgstr "你好,%s"
// PHP 配置文件
// config.php
define('LOCALE', 'zh_CN');
putenv("LC_ALL=" . LOCALE);
setlocale(LC_ALL, LOCALE);
bindtextdomain('messages', './locale');
textdomain('messages');
// 使用
printf(_('Hello, %s'), '张三');
实现动态语言切换
<?php
class Translator {
private $locale = 'en';
private $translations = [];
public function __construct($locale = 'en') {
$this->setLocale($locale);
}
public function setLocale($locale) {
$this->locale = $locale;
$this->loadTranslations();
}
private function loadTranslations() {
$file = __DIR__ . "/lang/{$this->locale}.php";
if (file_exists($file)) {
$this->translations = require $file;
} else {
$this->translations = [];
}
}
public function translate($key, $params = []) {
$text = $this->translations[$key] ?? $key;
foreach ($params as $param => $value) {
$text = str_replace(':' . $param, $value, $text);
}
return $text;
}
}
// 使用
$translator = new Translator('zh');
echo $translator->translate('welcome');
$translator->setLocale('en');
echo $translator->translate('welcome');
最佳实践建议
- 使用占位符:避免在翻译字符串中硬编码值
- 统一键命名:使用点号或下划线分隔的语义化键名
- 支持复数形式:部分语言有复数规则
- 缓存翻译结果:提高性能
- 提供默认回退:找不到翻译时返回原键名
选择哪种方法取决于你的项目规模、框架和部署环境,小型项目用数组映射即可,大型项目推荐使用 Gettext 或框架内置的翻译组件。