各位同学,大家好!今天咱们来聊聊 WordPress 里一个非常实用,但又容易被忽视的小家伙:_e() 函数。别看它名字短小精悍,作用可不小,它可是实现 WordPress 多语言支持的关键一环。
开场白:翻译官的自我修养
想象一下,你是一个翻译官,老板(WordPress)给你一句话(一段字符串),让你翻译成指定语言,然后大声地喊出来,让大家都听到。_e() 函数就扮演着这个翻译官的角色,它负责翻译字符串,并且直接把它打印到页面上。
_e() 函数:闪亮登场
_e() 函数的定义非常简单,位于 wp-includes/l10n.php 文件中。让我们先来看看它的庐山真面目:
function _e( $text, $domain = 'default' ) {
echo translate( $text, $domain );
}
是不是很简单? 它的作用就是调用 translate() 函数对 $text 进行翻译,然后使用 echo 语句直接输出翻译后的结果。
拆解 _e():一步一步看清楚
咱们来一步一步分析,看看 _e() 函数是如何完成翻译并输出的:
-
参数接收:
$text:这是要翻译的字符串。可以是任何你想展示给用户的文本,比如 "Hello World!"、"欢迎来到我的博客!" 等。$domain:这是一个可选参数,用于指定文本的翻译域(text domain)。翻译域就像是一个分类标签,告诉 WordPress 应该从哪个翻译文件(.mo 文件)中查找对应的翻译。 默认值为'default',表示使用默认的翻译域。
-
调用
translate():translate( $text, $domain ):这是核心的翻译函数。它接收要翻译的文本$text和翻译域$domain作为参数,然后返回翻译后的字符串。
-
echo输出:echo translate( $text, $domain );:echo语句将translate()函数返回的翻译后的字符串直接输出到 HTML 页面中。
translate() 函数:翻译的核心引擎
既然 _e() 函数的核心在于 translate() 函数,那我们就必须深入了解一下 translate() 函数的工作原理。translate() 函数的代码比较复杂,我们不会逐行分析,但会抓住关键点:
function translate( $text, $domain = 'default' ) {
global $l10n;
$text = (string) $text;
if ( isset( $l10n[ $domain ] ) ) {
return $l10n[ $domain ]->translate( $text );
}
return $text;
}
global $l10n;: 声明全局变量$l10n。 这个变量是一个数组,存储了所有已加载的翻译对象。 每个翻译对象对应一个翻译域。- 类型转换:
$text = (string) $text;: 确保$text是字符串类型。 - 检查翻译域是否存在:
isset( $l10n[ $domain ] ): 检查指定的翻译域$domain是否已经加载到$l10n数组中。 如果存在,说明已经加载了相应的翻译文件。 - 执行翻译:
$l10n[ $domain ]->translate( $text ): 如果翻译域存在,则调用对应翻译对象的translate()方法来执行实际的翻译操作。 这个translate()方法是gettext类的成员方法。 - 未找到翻译:
return $text;: 如果指定的翻译域不存在,或者在翻译文件中找不到对应的翻译,则translate()函数直接返回原始的$text,不做任何修改。
$l10n 全局变量:翻译数据的大本营
$l10n 是一个全局数组,它存储了所有已加载的翻译数据。 它的结构大致如下:
$l10n = array(
'default' => object(gettext), // 默认翻译域
'my-theme' => object(gettext), // 自定义主题的翻译域
'my-plugin' => object(gettext), // 自定义插件的翻译域
// ... 更多翻译域
);
每个翻译域对应一个 gettext 类的对象。 gettext 类负责加载和管理 .mo 翻译文件,并提供翻译功能。
翻译流程:从文本到输出
现在,让我们用一个表格来总结 _e() 函数的整个翻译流程:
| 步骤 | 描述 | 涉及的函数/变量 |
|---|---|---|
| 1 | 调用 _e() 函数,传入要翻译的文本 $text 和翻译域 $domain(可选)。 |
_e() |
| 2 | _e() 函数调用 translate() 函数,将 $text 和 $domain 传递给它。 |
translate() |
| 3 | translate() 函数检查 $l10n 全局数组中是否存在指定的翻译域 $domain。 |
$l10n |
| 4 | 如果存在翻译域,则调用对应 gettext 对象的 translate() 方法,查找 $text 的翻译。 |
gettext->translate() |
| 5 | gettext->translate() 方法在 .mo 翻译文件中查找 $text 的翻译。 |
.mo 文件 |
| 6 | 如果找到翻译,则返回翻译后的字符串;否则,返回原始的 $text。 |
|
| 7 | translate() 函数将翻译后的字符串返回给 _e() 函数。 |
|
| 8 | _e() 函数使用 echo 语句将翻译后的字符串直接输出到 HTML 页面中。 |
echo |
使用 _e():实例演示
光说不练假把式,让我们通过几个实例来看看 _e() 函数的具体用法:
- 基本用法:
<?php _e( 'Hello World!', 'my-theme' ); ?>
这段代码会将 "Hello World!" 翻译成当前站点的语言,并直接输出到页面上。 my-theme 是翻译域, 告诉 WordPress 从 my-theme 对应的 .mo 文件中查找翻译。
- 在 HTML 属性中使用:
<button><?php _e( 'Click Here', 'my-plugin' ); ?></button>
这段代码会将 "Click Here" 翻译后作为按钮的文本显示。
- 结合变量使用:
<?php
$username = '张三';
$message = sprintf( __( 'Welcome, %s!', 'my-theme' ), $username );
_e( $message );
?>
这里使用了 sprintf() 函数和 __() 函数(我们稍后会讲到)来创建一个包含变量的翻译字符串,然后使用 _e() 函数输出。
__() 函数:_e() 的好兄弟
你可能注意到了上面的例子中出现了 __() 函数。 __() 函数和 _e() 函数非常相似, 唯一的区别是 __() 函数只是返回翻译后的字符串,而 _e() 函数会直接输出翻译后的字符串。
function __( $text, $domain = 'default' ) {
return translate( $text, $domain );
}
你可以根据需要选择使用 _e() 或 __() 函数。 如果你需要将翻译后的字符串赋值给一个变量,或者在 HTML 属性中使用,那么应该使用 __() 函数。 如果你只需要直接输出翻译后的字符串,那么可以使用 _e() 函数。
翻译域的重要性:避免命名冲突
翻译域的作用是避免不同主题或插件之间的翻译字符串发生冲突。 想象一下,如果你的主题和插件都使用了相同的翻译字符串 "Hello",但是你希望它们显示不同的翻译, 那么就需要使用不同的翻译域来区分它们。
通常,我们建议使用主题或插件的名称作为翻译域。 例如,你的主题名为 "My Theme",那么你可以使用 "my-theme" 作为翻译域。 你的插件名为 "My Plugin",那么可以使用 "my-plugin" 作为翻译域。
创建和使用 .mo 翻译文件
要使 _e() 和 __() 函数能够正常工作, 你需要创建和使用 .mo 翻译文件。 .mo 文件包含了所有翻译字符串的对应关系。
创建 .mo 文件的步骤如下:
- 创建 .po 文件: .po 文件是纯文本文件,包含了原始字符串和对应的翻译。 你可以使用 Poedit 等工具来创建 .po 文件。
- 使用
xgettext命令提取字符串:xgettext命令可以扫描你的 PHP 代码,自动提取所有使用了_e()和__()函数的字符串,并将它们添加到 .po 文件中。 - 编辑 .po 文件,添加翻译: 打开 .po 文件, 为每个原始字符串添加对应的翻译。
- 将 .po 文件编译成 .mo 文件: 使用 Poedit 等工具将 .po 文件编译成 .mo 文件。
将 .mo 文件放置到正确的位置:
- 主题: 将 .mo 文件放置到主题的
languages目录下。 例如,你的主题名为 "My Theme",那么 .mo 文件应该放置在wp-content/themes/my-theme/languages/目录下。 - 插件: 将 .mo 文件放置到插件的
languages目录下。 例如,你的插件名为 "My Plugin",那么 .mo 文件应该放置在wp-content/plugins/my-plugin/languages/目录下。
加载翻译文件:告诉 WordPress 去哪里找翻译
仅仅将 .mo 文件放置到正确的位置是不够的, 你还需要告诉 WordPress 去哪里加载这些翻译文件。
- 主题: 在主题的
functions.php文件中添加以下代码:
function my_theme_load_textdomain() {
load_theme_textdomain( 'my-theme', get_template_directory() . '/languages' );
}
add_action( 'after_setup_theme', 'my_theme_load_textdomain' );
- 插件: 在插件的主文件中添加以下代码:
function my_plugin_load_textdomain() {
load_plugin_textdomain( 'my-plugin', false, dirname( plugin_basename( __FILE__ ) ) . '/languages' );
}
add_action( 'plugins_loaded', 'my_plugin_load_textdomain' );
这些代码会在 WordPress 初始化时加载指定的翻译文件。
总结:翻译的艺术
_e() 函数是 WordPress 多语言支持的基础。 通过它,我们可以轻松地将网站内容翻译成不同的语言,从而吸引更多的用户。 掌握 _e() 函数的用法, 你就掌握了 WordPress 翻译的艺术。
练习题:
- 创建一个新的 WordPress 插件,并在插件中使用
_e()函数输出一段文本。 - 为插件创建一个 .mo 翻译文件,并将文本翻译成中文。
- 加载翻译文件,并验证插件是否能够正确显示中文翻译。
希望今天的讲座对大家有所帮助! 祝大家学习愉快! 下课!