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 主题转变为多语言


我们已经在 iNoveArras 上完成了类似的工作,并计划将更多主题转换为多语言。

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

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

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

觉得有用吗?分享这篇文章: