WordPress翻译中 __()、_e()、_x、_ex 和 _n 的用法及区别
编译函数
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() 与 __() 的区别是一样的。
WordPress翻译中 __()、_e()、_x、_ex 和 _n 的用法及区别的更多相关文章
- 一个简单的例子让你很轻松地明白JavaScript中apply、call、bind三者的用法及区别
JavaScript中apply.call.bind三者的用法及区别 引言 正文 一.apply.call.bind的共同用法 二. apply 三. call 四. bind 五.其他应用场景 六. ...
- jQuery中bind,live,delegate与one方法的用法及区别解析
bind( )方法用于将一个处理程序附加到每个匹配元素的事件上并返回jQuery对象. .bind(eventType[, evnetData], Handler(eventObject)) 其中,参 ...
- Wordpress主题中常用代码总结
1. 在 Wordpress主题中显示最热文章的 PHP代码 <?php $result = $wpdb->get_results("SELECT comment_count,I ...
- 数据库:MySQL实战;左链接;查询WordPress数据库中的文章内容
在1年前,我用学生价租了一个阿里云服务器(是真的便宜啊),自己在CentOS系统上用命令行搭了个WordPress的环境,开始了为期一个月使用自建博客的历程. 事实证明,博客在类似博客园这样的平台上写 ...
- C++中重载、重写(覆盖)和隐藏的区别实例分析
这篇文章主要介绍了C++中重载.重写(覆盖)和隐藏的区别,是C++面向对象程序设计非常重要的概念,需要的朋友可以参考下 本文实例讲述了C++中重载.重写(覆盖)和隐藏的区别,对于C++面向对象程序设计 ...
- spring boot:thymeleaf模板中insert/include/replace三种引用fragment方式的区别(spring boot 2.3.3)
一,thymeleaf模板中insert/include/replace三种引用fragment方式的区别 insert: 把整个fragment(包括fragment的节点tag)插入到当前节点内部 ...
- [转载]jQuery中wrap、wrapAll和wrapInner用法以及区别
原文地址:jQuery中wrap.wrapAll和wrapInner用法以及区别作者:伊少君 原文: <ul> <li title='苹果'>苹果</li> ...
- SQL中inner join、outer join和cross join的区别
对于SQL中inner join.outer join和cross join的区别简介:现有两张表,Table A 是左边的表.Table B 是右边的表.其各有四条记录,其中有两条记录name是相同 ...
- php中的curl使用入门教程和常见用法实例
摘要: [目录] php中的curl使用入门教程和常见用法实例 一.curl的优势 二.curl的简单使用步骤 三.错误处理 四.获取curl请求的具体信息 五.使用curl发送post请求 六.文件 ...
随机推荐
- [No00005A]word多文档合一
2个方法:法一,一个个插入,法二,一次性插入多个. 法一: 视图->大纲视图 点击 大纲 -> 显示文档 点击插入,逐个插入文档.. 最终 将视图调回页面视图..结束. 法二: 插入 - ...
- 转:软件架构入门 (from 阮一峰)
说明:其中讲到了 5 种的架构模型,很不错. from: http://www.ruanyifeng.com/blog/2016/09/software-architecture.html
- hdu 2586 How far away
How far away ? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- Android的4种文件类型Java,class,dex,apk
Java文件-----应用程序源文件 Android本身相当一部分都是用java编写而成(基本上架构图里头蓝色的部份都是用Java开发的),android的应用必须使用java来开发 Class文件- ...
- 如何撰写PRD
PRD(Product-Requirement-Document,产品需求文档),这对于任何一个产品经理来说都不会陌生的一个文档,一个PRD是衡量一个产品经理整体思维的标准,一个PRD可以看出一个产品 ...
- Web API 接口
Web API 接口 在给网站编写 JavaScript 代码时,也有很多可用的 API.您可以使用下面的接口(也称为对象的类型)列表,开发 Web 应用程序或网站. 关于包含这些接口的 API 列表 ...
- 柯里化/偏函数/Curring用法
把接受多个参数的函数变成一个单一参数的函数,并且返回接受余下的参数而有返回结果的新函数的技术 下面我们以实例说明: var toString = {}.toString; var isString = ...
- 关于viewpager 里嵌套 listview 同时实现翻页功能的“java.lang.IllegalStateException: The specified child..."异常处理
这几天做项目用到了ViewPager,因为它可以实现左右划动多个页面的效果,然后 再每个页面里使用ListView,运行时总是出现”PagerAdapter java.lang.IllegalStat ...
- 对《重建中国.NET生态系统》评论贴的总结
Neuzilla官方微信公众号:搜 架构师联盟 或 neuzilla,也可以扫下面二维码 在看了<重建中国.NET生态系统>的各种哭爹喊娘骂街的评论之后,我觉得哦,淫才确实很多,但是么真正 ...
- Metatable让我从心认知了Lua(相知篇)
自从在公司和Lua第一次相遇之后,我的IT生涯从此也开启了另一个新篇... 起初并没有和Lua产生相遇时的那种电石火花般的怦然心动...但... 说实话虽然我的心没有因此触动但至少也不排斥...因为公 ...