PHP 怎么PHP翻译键

wen PHP项目 2

本文目录导读:

PHP 怎么PHP翻译键

  1. 简单的数组映射法
  2. 使用 Gettext 扩展
  3. 使用 Laravel 框架
  4. 使用 Symfony Translation 组件
  5. 使用 .mo/.po 文件(Gettext 格式)
  6. 实现动态语言切换
  7. 最佳实践建议

在 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');

最佳实践建议

  1. 使用占位符:避免在翻译字符串中硬编码值
  2. 统一键命名:使用点号或下划线分隔的语义化键名
  3. 支持复数形式:部分语言有复数规则
  4. 缓存翻译结果:提高性能
  5. 提供默认回退:找不到翻译时返回原键名

选择哪种方法取决于你的项目规模、框架和部署环境,小型项目用数组映射即可,大型项目推荐使用 Gettext 或框架内置的翻译组件。

抱歉,评论功能暂时关闭!