问题描述
到目前为止,我一直在处理 Wordpress 中的一些翻译,并尝试阅读官方的 gettext 文档,但不会得到一个简单的事情:这些启发之间有什么区别,如__(,_e(等等) 甚至是更多:哪些其他人在旁边?提前感谢!
坦率
最佳解决方案
__
(双下划线) 是基本翻译功能。它翻译一个字符串并将其作为字符串返回。
_e
与__
相同,但立即回显结果。
_x
是上下文翻译功能。它有第二个选择,为翻译的人提供上下文。
_ex
与_x
相同,但回声结果。
使用_x
的例子:
$string = _x( 'Buffalo', 'an animal', 'plugin-domain' );
$string = _x( 'Buffalo', 'a city in New York', 'plugin-domain' );
$string = _x( 'Buffalo', 'a verb meaning to confuse somebody', 'plugin-domain' );
有时在其他语言中,相同的字符串可能会有所不同。为翻译人员提供上下文可以帮助他们选择正确的词语。
快捷功能:
-
esc_attr__
:相当于__
,也可通过esc_attr
运行。 -
esc_html__
:相当于__
,也可通过esc_html
运行。 -
esc_attr_e
:相当于_e
,也可通过esc_attr
运行。 -
esc_html_e
:相当于_e
,也可通过esc_html
运行。 -
esc_attr_x
:相当于_x
,也可通过esc_attr
运行。 -
esc_html_x
:相当于_x
,也可通过esc_html
运行。
_n
是复数处理程序。例:
$string = sprintf( _n(
'You have %d taco.',
'You have %d tacos.',
$number,
'plugin-domain'),
$number );
在这个例子中,有两种方法可以说出反光度,这取决于它是否是单数。第一次使用 $号表示_n
功能使用哪个版本。 $ number 的第二个用法发生在 sprintf 中,用%d 替换字符串中的实际数字。
_n
没有回声功能,但有一个名为_nx
的功能。它是_n
和_x
的组合。多元化和语境
_n_noop
是一个特殊的。它用于翻译多个字符串,但不是实际执行翻译。如果要使字符串集中,但实际上在其他地方进行工作,这很有用。实际上在其他地方工作的功能是 translate_nooped_plural
。
例:
$holder = _n_noop('You have %d taco.', 'You have %d tacos.', 'plugin-domain');
// ... later ...
$string = sprintf( translate_nooped_plural( $holder, $count ), $count );
这不是很多,但可以方便组织。例如,如果将所有的字符串放在一个文件中,那么在_n
中就可以使用_n
,这样就可以在_n_noop
这样做。
_nx_noop
与_n_noop
相同,但也可以为_x
提供翻译器的上下文。
请注意,您可以将域放入 noop 函数调用或 translate_nooped_plural 函数调用。无论哪个更适合您的组织。如果两个都有一个域,那么传递给 noop 调用的一个获胜。
number_format_i18n
相当于 PHP 的内置 number_format,但它增加了诸如小数等的处理,这在其他语言环境中是不同的。
date_i18n
相当于 PHP 的内置 date,还有所有相关处理。月份名称,日期名称等
另外,never break the laws 。只是提醒。 🙂
次佳解决方案
__(), _e() 和 _x(), _ex()
__()
和_e()
基本上都是 translate()
的包装 (不要直接使用) 和几乎相同。
区别在于__()
返回翻译的字符串,_e()
回显它。两者都需要输入一个字符串作为必需的参数,通常虽然可选,也是一个文本域。
类似地,有_x()
和_ex()
,它允许您指定可以描述字符串出现在哪里的上下文。如果您的项目包含超过几十个可翻译的字符串,则使用上下文很有意义。
另外,请注意_n()
和_nx()
的复数形式。
常见用法示例
$output = '<label for="some_field">' .
_x( 'Some Information.', 'Some Form Field', 'your-text-domain' ) .
'</label>' .
'<input type="text" name="some_field" value="" />' .
'<p class="description">' .
_x( 'Here you can enter some info.', 'Some Form Field', 'your-text-domain' ) .
'</p>';
return $output;
Parameters
__( $text, $domain )
_e( $text, $domain )
_x( $text, $context, $domain )
_ex( $text, $context, $domain )
_n( $single, $plural, $number $domain )
_nx( $single, $plural, $number, $context, $domain )
所有参数,但 $number
是字符串。除了 $domain
之外,都是必需的。
变量与 sprintf() 有更大的灵活性
如果您的字符串将包含可变数字或单词,请使用 sprintf()
:
$stars = get_post_meta( $post->ID, 'rating', true );
$title = get_the_title( $post->ID );
$output = '<p>' .
sprintf(
_x(
'The movie titled %2$s received a %1$d star rating.',
'Movie Description',
'your-text-domain'
),
$stars,
$title
) .
'</p>';
return $output;
额外的资源
一些额外的资源为即将到来的 WordPress I18n 忍者:
-
Codestyling Localization(精彩插件!)
第三种解决方案
我不是翻译专家,但 WordPress Codex 页面有很好的文档,并解释了使用每个实例的原因。
从 codex 页面:
__()
当消息作为参数传递给另一个函数时使用; _e()
用于将消息直接写入页面。关于这两个功能的更多细节:
__('message')
搜索本地化模块来翻译’message’,并将翻译传递给 PHP 返回语句。如果没有找到’message’ 的翻译,它只是返回’message’ 。
_e('message')
搜索本地化模块来翻译’message’,并将翻译传递给 PHP echo 语句。如果没有找到’message’ 的翻译,它只是回应’message’ 。
请注意,如果您正在国际化主题或插件,则应使用"Text Domain"
。
gettext 框架负责大部分的 WordPress 。但是,WordPress 发行版中有几个地方无法使用 gettext:
-
主要的 WordPress README 文件 – 它是一个静态 HTML 文件,而不是 PHP 文件,因此无法通过 gettext 函数运行。
-
在加载 gettext 之前,WordPress 加载周期中很早就会生成一些错误消息。
Additional info regarding when gettext doesn’t work
希望能回答你的问题,如果不是让我们知道,也许别人可以帮助,或者我可以做更多的研究。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。