WPML

Atahualpa 屏幕截图我将向您展示如何使用由 Bytes For All (在新标签页中打开) 开发的 Atahualpa (在新标签页中打开),借助 WPML 构建多语言 WordPress 网站。

多语言 WordPress 网站的主题需要将所有字符串包装在 gettext 调用中,但这还不够。在主题中使用 gettext 可以让其以不同于最初构建时使用的(单一)语言进行显示。

要运行多语言,主题需要允许访问者选择其显示语言,并根据每种语言提供正确的内容。

Atahualpa 的多语言版本


让我们从最终结果开始。这是一个由修改版 Atahualpa 驱动的演示网站,这里是您可以下载并使用的修改版主题 (在新标签页中打开)。

为了让 Atahualpa 支持多语言,我们做了哪些更改

1. 将 wpml-integration.php 添加到主题目录


wpml-integration.php 位于 WPML 目录下的 docs/theme-integration 中。它包含了一系列帮助将主题转变为多语言的函数。

所有这些函数的设计目的在于,如果 WPML 处于活动状态,则让主题使用它;如果缺失,则忽略它。这意味着如果 WPML 可用,主题将运行多语言;否则,主题将正常运行(单一语言)。

添加到 functions.php 中:

include dirname(__FILE__) . '/wpml-integration.php';

该语句加载 wpml-integration.php 并使其可用于主题中的所有文件。

2. 添加语言选择器


语言选择器使访问者能够选择网站显示的语言。通常,添加几种类型的语言选择器是个好主意。访问者会快速浏览网站,寻找其所需语言内容的视觉提示。不同的人会关注不同的位置,因此在页面的不同部分添加不同类型的语言选择器,将有助于引导访问者找到他们所需的语言。

我们通过将 WPML 的下拉语言选择器添加到 header.php 中,将其放置在侧边栏:

<?php wpml_languages_selector() ?>
Atahualpa 下拉语言选择器
下拉语言选择器

我们还在网站的页脚添加了水平的语言列表。许多用户会首先滚动到底部查看有什么内容(以及页面有多长),因此这是一个告知页面提供其他语言版本的好地方。我们将以下代码添加到了 footer.php 中:

<?php wpml_languages_list() ?>
页脚中的水平语言选择器
页脚中的水平语言选择器

最后,我们在每篇文章的末尾添加了一个语言选择器。这会在每篇文章中添加一句话,说明它还提供哪些其他语言版本。将以下内容添加到了 index.php(其中包括 WordPress 显示循环的自定义版本)中:

<?php if(is_singular()) wpml_content_languages(); ?>
翻译语言列表
翻译语言列表

当访问者单击“Home”时,他们希望在不切换语言的情况下返回主页。由于每种语言都有一个 URL 不同的“主页”,因此所有语言使用单一值是行不通的。

通常,WordPress 主题会根据管理页面中设置的“Blog URL”值来计算“Home”页面的地址。WPML 创建了一个函数,可以根据显示语言计算正确的主页地址。

我们将 get_option('home’) 替换为 wpml_get_home_url()。此外,get_option('home’) 函数返回的网站位置不带尾部斜杠(/),因此主题需要手动添加。WPML 的函数则包含此斜杠(这背后有一个很长的故事)。

为了进行此更改,我们必须编辑两个文件。修改了 functions/bfa_get_options.php 并将:

$bfa_ata['get_option_home'] = get_option('home');

更改为
$bfa_ata['get_option_home'] = wpml_get_home_url();

此外,编辑了 functions/bfa_header_config.php 并从主页链接中删除了尾部斜杠:
'<a href="' . $bfa_ata['get_option_home'] . '">' . $bfa_ata['bloginfo_name'] . '</a>'

4. 真正的高级功能 – 翻译用户在主题管理后台屏幕中输入的文本


Atahualpa 允许通过管理后台屏幕控制某些文本。这是一项很棒的功能,允许在不编辑 PHP 文件的情况下管理网站。WPML 也可以使用其字符串翻译机制来翻译这些字符串。

为此,主题需要告诉 WPML 哪些字符串需要翻译,如果存在翻译,则显示翻译。

当用户进入主题的管理后台屏幕,更新文本并单击“保存”时,将执行 functions/bfa_ata_add_admin.php 中的 bfa_ata_add_admin 函数。我们向其中添加了以下部分(从第 11 行开始):

global $wpml_translatable_strings;

 foreach($wpml_translatable_strings as $wpml_str ){

   if(isset($_REQUEST['bfa_ata_'.$wpml_str]) && trim($_REQUEST['bfa_ata_'.$wpml_str])){

    wpml_register_string('atahualpa theme', $wpml_str, stripslashes($_REQUEST['bfa_ata_'.$wpml_str]));

  }

 }

它的作用是遍历全局变量 $wpml_translatable_strings 中定义的字符串列表。它会在 WPML 的字符串翻译列表中注册每个字符串。

第一个参数是字符串的上下文。任何名称都可以,但您应该选择一个能描述这些字符串的名称。第二个参数是字符串的名称(不会被翻译)。最后一个参数是字符串的值 – 会被翻译。

为了显示翻译(如果存在),我们将 wpml_t 函数添加到了 functions/bfa_get_options.php 中(从第 204 行开始):

global $wpml_translatable_strings;

foreach($bfa_ata as $k=>$v){

   if(in_array($k, $wpml_translatable_strings) || $__first){

    $bfa_ata[$k] = wpml_t('atahualpa theme', $k, $v);     

  }

}

此代码在向访问者显示网站时运行。它将循环遍历字符串列表,检查其是否已注册翻译(in_array),如果是,则获取翻译。如果存在翻译,wpml_t 函数将返回当前语言的翻译字符串;如果没有翻译,则仅返回原始字符串。

将其他 WordPress 主题转变为多语言


我们已经在 iNove (在新标签页中打开) 和 Arras (在新标签页中打开) 上完成了类似的工作,并计划将更多主题转换为多语言。

我们的目的是提供即用型的多语言主题,并帮助您构建自己的 Multilingual Ready(支持多语言)主题。使用我们在此处描述的技术,您可以构建在 WPML 可用时运行多语言,而在没有 WPML 时运行单一语言的主题。

如果您正在构建主题并需要帮助将其转变为多语言,请随时在论坛中发布新帖子。

您还可以通过为主题添加多语言支持来赚钱(真正的被动收入)。我们将在下一篇文章中讨论在主题中包含联盟 ID 的相关内容。

觉得有用?分享此文章: