WPML 随附自己的语言切换器,是个语言下拉菜单。 语言切换器相当灵活,但并非总是够用。

您可以定制自己的语言切换器并将其插入主题。 我将向您演示如何添加可用语言列表至文章中以及添加语言列表至页面底部。

获得(其他)语言的列表

使用 icl_get_languages() 可获得任何页面的翻译语言列表。用法:

icl_get_languages('skip_missing=N&orderby=KEY&order=DIR&link_empty_to=str')

* N=0/1
* KEY=id/code/name (name -> translated_name), (defaut: id)
* DIR=asc/desc (defaut: asc)
* link_empty_to = str(默认:空,与 skip_missing=0 一起使用,允许对当前元素没有翻译的语言使用自定义链接。{$lang} 可以用作语言代码的占位符

注意:

  • skip_missing 参数告知函数如何处理没有翻译的语言。
  • orderbyorder 结合允许创建下拉式语言切换器,语言总是显示在相同的位置。

此函数返回带有各语言条目的数组。 例如,对于以英语、法语和意大利语运行的 WordPress 网站,它将返回此结果:

Array
(
 [0] => Array
  (
   [id] => 1
   [active] => 1
   [native_name] => English
   [missing] => 0
   [translated_name] => English
   [language_code] => en
   [country_flag_url] => http://yourdomain/wpmlpath/res/flags/en.png
   [url] => http://yourdomain/about
  )

 [1] => Array
  (
   [id] => 4
   [active] => 0
   [native_name] => Français
   [missing] => 0
   [translated_name] => French
   [language_code] => fr
   [country_flag_url] => http://yourdomain/wpmlpath/res/flags/fr.png
   [url] => http://yourdomain/fr/a-propos
  )

 [2] => Array
  (
   [id] => 27
   [active] => 0
   [native_name] => Italiano
   [missing] => 0
   [translated_name] => Italian
   [language_code] => it
   [country_flag_url] => http://yourdomain/wpmlpath/res/flags/it.png
   [url] => http://yourdomain/it/circa
  )
)

每个语言都有其自己的参数数组,您的主题函数可用它来构建任何语言选择器。

  • id: 内部参考编号
  • active:这是当前使用的语言(准确地说,就一个语言是在使用的)
  • native_name:语言的原始名称(从不翻译出来)
  • translated_name:以当前使用语言显示的语言名称
  • country_flag_url:PNG 格式的国旗图像的 URL 链接
  • url:转至该语言翻译的链接
  • missing: 如果该元素缺少翻译,则为 1,如果存在翻译,则为 0。

处理缺失的翻译

一些页面可能没有被翻译为所有语言。 您可以告知 icl_get_languages 对于没有翻译的语言应当返回什么。

如果 『skip_missing=1』,则这些语言将不会在结果中显示。 如果 『skip_missing=0』,则将显示所有语言,其中缺失翻译的语言将链接回到该语言的首页。

在主题函数中的使用方法

您可以任意方式构建自己的语言切换器。 在这里,我们将演示两个流行的用法。

我们在此演示的示例 PHP 函数将进入您的 functions.php 文件(在主题文件夹中),而不会添加到插件中。

此文章还提供以下语言版本…

假设您想在每个文章的底部(或顶部)增加一行,显示此文章还提供其他什么语言版本。 以下函数应当仅返回当前已翻译的文章,如果没有可用的翻译,则不应输出任何结果。

function icl_post_languages(){
  $languages = icl_get_languages('skip_missing=1');
  if(1 < count($languages)){
    echo __('This post is also available in: ');
    foreach($languages as $l){
      if(!$l['active']) $langs[] = '<a href="'.$l['url'].'">'.$l['translated_name'].'</a>';
    }
    echo join(', ', $langs);
  }
}

此函数的作用是:

  1. 从 WPML 获得语言列表 – $languages = icl_get_languages(『skip_missing=1』);
  2. 检查此文章是否有多个语言版本 – if(1 < count($languages))
  3. 创建输出结果,跳过当前显示的语言 – if(!$l[『active』])

注意:

  1. 此消息可顺利使用 gettext。 这点非常重要,那样您以不同语言附加到文章的这条消息将以正确的语言显示: __(『此文章还提供以下语言版本: 『);
  2. 使用的语言名称是翻译后的语言名称。 这将保证整个句子是以正确的语言显示的:$l[『translated_name』]

结果如下:

关于文章有其他语言版本的消息

关于文章有其他语言版本的消息

要在文章中包含此消息,从 single.php 添加一个 icl_post_languages() 调用。

在页面底部添加一个语言名称和国旗列表

虽然您在页面顶部有语言选择器,但在页面底部添加一个语言名称和国旗列表也是个不错的主意。 许多人立即滚动到页面底部以更好地了解后面的内容,因此放置一个显著的语言切换器有可能为您的外国访客提供帮助。

function languages_list_footer(){
    $languages = icl_get_languages('skip_missing=0&orderby=code');
    if(!empty($languages)){
        echo '<div id="footer_language_list"><ul>';
        foreach($languages as $l){
            echo '<li>';
            if($l['country_flag_url']){
                if(!$l['active']) echo '<a href="'.$l['url'].'">';
                echo '<img src="'.$l['country_flag_url'].'" height="12" alt="'.$l['language_code'].'" width="18" />';
                if(!$l['active']) echo '</a>';
            }
            if(!$l['active']) echo '<a href="'.$l['url'].'">';
            echo icl_disp_language($l['native_name'], $l['translated_name']);
            if(!$l['active']) echo '</a>';
            echo '</li>';
        }
        echo '</ul></div>';
    }
}

此函数有以下作用:

  1. 如果有任何翻译语言,则创建一个 DIV 并开始一个没有排序的列表: if(!empty($languages)){ echo 『<div id=」footer_language_list」><ul>』;
  2. 搜索每个语言并将其添加为列表项目。
  3. 如果不是当前使用的语言,则还以该语言链接至该页面: if(!$l[『active』]) echo 『<a href=」『.$l[『url』].'」>』;
  4. 添加语言国旗:<img src=」『.$l[『country_flag_url』].'」 alt=」『.$l[『language_code』].'」 width=」18″ height=」12″ />
  5. 添加原始语言名称和翻译后的语言名称(如果它们不同的话):echo icl_disp_language($l[『native_name』], $l[『translated_name』]);

icl_disp_language() 函数由 WPML 创建。其作用是检查 (native_language_name, translated_language_name) 这两个参数是否不同。 如果不同,则返回两者,否则只返回一个。

我们还应当添加一些 CSS 以使这个语言列表风格化。 以下 CSS 将使语言列表在页面底部居中显示并进行一些格式调整:

#footer_language_list{
  margin-bottom: 25px;
  text-align: center;
}

#footer_language_list ul{
  list-style: none;
  margin:0;
  padding:0;
}

#footer_language_list ul li img{
  margin-right:5px;
}

#footer_language_list ul li{
  display:inline;
  margin:0 5px 0 5px;
  padding:0;
}

#footer_language_list ul li a, #footer_language_list ul li a:visited{
  color: #fff;
  text-decoration:underline;
}

#footer_language_list ul li a:hover, #footer_language_list ul li a:active{
  color: #fff;
}

以下就是语言切换器:

页面底部语言列表

页面底部语言

要将其添加至您的主题,请将 languages_list_footer 调用添加至 footer.php 文件。

* 注意:您可以方便地将这个水平的语言切换器转变为垂直的语言切换器。只需从 CSS 中删除 display: inline 语句。

仅带国旗的语言选择器

以下简单函数用于显示链接到当前页面翻译的国旗。

function language_selector_flags(){
    $languages = icl_get_languages('skip_missing=0&orderby=code');
    if(!empty($languages)){
        foreach($languages as $l){
            if(!$l['active']) echo '<a href="'.$l['url'].'">';
            echo '<img src="'.$l['country_flag_url'].'" height="12" alt="'.$l['language_code'].'" width="18" />';
            if(!$l['active']) echo '</a>';
        }
    }
}

这个函数的输出需要另外加以样式化。 例如,将此函数放到 div 块中并为 img 标签定义自定义样式。

<div id="flags_language_selector"><?php language_selector_flags(); ?></div >

CSS:

#flags_language_selector img{
      margin:1px;
      border:1px solid #333;
}

国旗语言选择器

替换国旗和更改语言名称

WPML 包含一个用于编辑语言信息的 GUI。转到 WPML->语言,点击编辑语言。您将能够改变语言名称,编辑其区域设置值,选择不同的国旗。

'skip_missing=0&orderby=name'