问题描述

到目前为止,我一直在处理 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 忍者:

第三种解决方案

我不是翻译专家,但 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 加载周期中很早就会生成一些错误消息。

Link to the Codex Page

Additional info regarding when gettext doesn’t work

希望能回答你的问题,如果不是让我们知道,也许别人可以帮助,或者我可以做更多的研究。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。