作为WordPress主题或插件开发者,倡萌建议大家要掌握主题或插件国际化(I18n)/本地化的实现方法。
编译函数
WordPress使用了下面几个函数来方便语言本地化。
__()
_e()
_x()
_ex()
_n()
以上所列的函数是用来包含所需翻译的字符串的,根据字符串的不同参数和输出类型,需要使用不同的函数。相信有不少朋友还是不太明白这几个函数的区别和用法,下面倡萌就来详细说说。
__() 和 _e()
__() 和 _e() 都是用来返回对应当前语言的字符串内容。请看下面的例子:
使用 __()
<?php
if( is_single() ) { //如果这是一篇“文章”
echo __( 'This is a post.' );
}
?>
使用 _e()
<?php
if( is_single() ) { //如果这是一篇“文章”
_e( 'This is a post.' );
}
?>
上面两组代码的最终输出内容都是一样的。请自己对比一下这两组代码的第 3 行,使用了 echo 函数的,就用 __(),直接返回内容的就用 _e() 。由此,我们可以简单理解为:
如果字符串是返回给其他函数调用,不打印出来,就用 __() ;直接打印输出到 html 中的字符串,就用 _e() 。
再看下面的例子:
<?php
the_content( __( 'Click here to read more' ) );
?>
‘Click here to read more’ 是被函数 the_content() 直接包裹的,所以这里使用 __();如果你换成 _e() ,它就会直接输出“Click here to read more”,函数 the_content() 就不起作用了。
_x() 和 _ex()
如果要翻译的字符串是根据上下文来决定的,就需要用到 _x()。比如“Post”根据上下文的不同既可以指 “a post(名词)” 也可以指 “to post (动词)”。你需要明确表达同一个词的不同含义,方便翻译者识别。 _x() 主要是用在单个具有多重用法的词语,而且它比其他的编译函数多了一个额外的参数,这个参数就是用来根据不同上下文显示的不同内容。
比如,你在主题的两个地方用到了”post“这个词,但是这两个地方的要表达的意思是不一样的。这时候,你可以这样操作:
在第一处的post使用下面的代码:
<?php echo _x('post','A post.') ?>
在第二处的post使用下面的代码:
<?php echo _x('post','To post.') ?>
那么,翻译者就可以理解两处post的不同,将第一处翻译为“一篇文章”,第二处翻译为“发布”。
注:导出的 .pot 语言包文件,使用 POEdit 软件打开后,你会发现有两条翻译条目分别为:post[A post] 和 post[To post],这样就可以分别翻译这两个意思。
_ex() 区别于 _x() 的地方,和 _e() 区别于__() 是一样的。前者是用于直接打印输出到html的字符串,后者用于返回字符串以供其他函数调用,不打印输出。
_n()
_n() 是用来进行单复数编译的。比较常见于 WordPress 的评论功能模块。例如下面的两组代码输出的内容都是一样的:
<?php
if(get_comments_number() == 1) {
_e( 'There is a comment' );
} else {
_e( 'There are comments' );
}
?>
<?php
echo _n( 'There is a comment' , 'There are comments' , get_comments_number() );
?>
第一组代码是通过 if 来判断,如果评论数量是 1 ,就输出“There is a comment ”,否则输出“There are comments”,由于是直接输出的,所以使用 _e() ;第二组是使用echo 函数输出,然后使用 _n() 来区分1条评论和多条评论的显示内容。
_n() 有 3 个参数。第一个是单数形式的字符串,第二个是复数形式的字符串,第三个是引用的数字。在这个例子中,get_comments_number() 是用来获取 评论 的条数,提供给 _n() 使用。
含有变量的翻译
如果在翻译的字符串中包含一个额外的函数或变量,我们应该如何处理呢?比如下面的例子:
<?php
$color = the_color();
_e( "You have chosen the $color theme" );
?>
如果你通过 POEdit 制作 .pot 文件,这时会报错。因为在翻译的字符串中包含了 $color 这个变量。那么,如何规避这个问题呢?下面有2种方法:
拆分内容
<?php
$color = the_color();
echo __( 'You have chosen the ' ) . $color . __( ' theme.' );
?>
仔细看第 3 行代码,使用了 echo 函数,这样就能保证 $color 变量的输出,同时将变量两端的内容分别进行编译,中间使用点号“.”相连。这样一来,只需翻译两端的内容即可。
使用 printf()
或 sprintf()
上面说的“拆分内容”法虽然可以实现我们要的效果,但是它将内容分成几段,需要我们分别翻译,多少有些繁琐。其实我们可以使用 printf()
或 sprintf()
来解决这个问题。看下面的代码:
<?php
//使用 sprintf() 的写法
echo sprintf( __( 'You have chosen the %s theme.' ) , the_color() );
//使用 printf() 的写法
printf( __( 'You have chosen the %s theme.' ) , the_color() );
?>
你可以看到,翻译的内容中使用了 %s ,而且 翻译的内容 和 变量函数 都被包裹在 printf()
或 sprintf()
函数中。这个例子中,只使用了一个变量,如果有更多的函数改怎么办?这就需要你自己去了解 printf()
或 sprintf()
这两个函数的了。
printf()
与 sprintf()
用法的区别,和 _e() 与 __() 的区别是一样的。
好了,关于这几个编译函数,就讲到这里,在这方面,倡萌也是新手,如果有什么地方说错了,或者表达不清楚,望大家指正。
_e() __() 等这几个函数在使用的时候没有翻译出结果,是什么原因
倡萌高人,请教个问题,我有一个主题,翻译中文他部分能翻译,为何呀,添加页面的设置选项翻译正常,后台主题管理的字段部分翻译,其他翻译不了,我检查了下貌似没发现错误,高人指点
例如 // BBPress & BuddyPress
$this->sections[] = array(
‘icon’ => ‘el-icon-book’,
‘icon_class’ => ‘icon’,
‘title’ => __(‘BBPress & BuddyPress’),这里没有错误
‘fields’ => array(
array(
‘id’=>’bb-layout’,
‘type’ => ‘image_select’,
‘title’ => __(‘Page Layout’),
‘options’ => $page_layouts,
‘default’ => ‘fullwidth’
),
语言文件#: inc/admin/per/settings.php:3620 指向也没错,
msgid “BBPress & BuddyPress” 这里调用也没错
msgstr “BBPress和BuddyPress”
请问这是什么原因
__(‘BBPress & BuddyPress’), 看代码缺失了第二个参数,应该类似于 __(‘BBPress & BuddyPress’,’xxx’),具体你可以仔细看下文章
http://www.wpdaxue.com/localize-wordpress-themes.html
找到其他翻译字段,是否后面包含了类似于 xxx 的第二个参数
如果还解决不了,建议你联系主题作者吧
非常感谢,经常见到 %s 始终迷惑不解,还以为是wordpress专用的;后来才知道是php的printf函数
以前看主题时大概知道了意思,现在更加明了了
function _e( $text, $domain = ‘default’ ) {
echo translate( $text, $domain );
}
有时候也是两个参数。第二个参数什么意思?看这个定义也看不明白。默认主题有时候这样用,_e( ‘Featured post’, ‘twentytwelve’ );
第二个参数 $domain 就和默认主题的 twentytwelve 一样,如果你指定了自己的值,比如这里的 twentytwelve,就用 twentytwelve,如果没有,就用默认的值 default
printf 如果有两个变量呢
那就使用2个变量,比如
printf( __( ‘You have chosen the %s theme and %d theme.’ ) , the_color(), the_color2() );
嗯,谢谢
printf( __( ‘<em>发表于:%s </em>|<em>分类:%d </em>’ ) , the_time(‘F jS, Y’), the_category(‘,’));
八月 29th, 2013视频发表于: |分类: 0
如果这样他就先把 时间和分类 显示出来了, 怎么解决哇?
你应该使用 get_ 类函数,这样就不会直接输出,而是返回值给其他函数调用。比如 get_the_time 、get_the_category
对了,纠正一下,%s 和 %d 返回的内容类型不一样,有专门的用法的:
参数 format 是转换的格式,以百分比符号 ("%") 开始到转换字符结束。下面的可能的 format 值:
%% – 返回百分比符号
%b – 二进制数
%c – 依照 ASCII 值的字符
%d – 带符号十进制数
%e – 可续计数法(比如 1.5e+3)
%u – 无符号十进制数
%f – 浮点数(local settings aware)
%F – 浮点数(not local settings aware)
%o – 八进制数
%s – 字符串
%x – 十六进制数(小写字母)
%X – 十六进制数(大写字母)
arg1, arg2, ++ 等参数将插入到主字符串中的百分号 (%) 符号处。该函数是逐步执行的。在第一个 % 符号中,插入 arg1,在第二个 % 符号处,插入 arg2,依此类推。
我说分类咋一直显示的是 0 呢,原来如此,谢谢楼主
发现和C语言好像
十分感谢,学到新知识了
非常感谢^_^
基本不会English的飘过