本文目录导读:

在 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 或框架内置的翻译组件。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播