gettext语法有什么意义?


9

到目前为止,我已经在Wordpress中处理了一些翻译,并试图阅读官方的gettext文档,但并没有获得可能是一件简单的事情的意思:__(,_ e(等)这样的开头之间有什么区别?甚至更多:旁边还有其他人吗?

坦率


谢谢大家的精心解答!我真的很感谢这里!
Circus Circus'7

...也许对此还有一个问题:是否可以省略文本域的条目?我直立地开始将它带到我想翻译的每个字符串中,但随后发现了Wordpress Codex中的一些示例,这些示例根本不包含它...
Circuit Circus 2012年

...好吧,现在我在本抄本页面上看到了它-对这个多余的问题很抱歉:-)
Circuit Circus'July

Answers:


13

__(双下划线)是基本翻译功能。它翻译一个字符串并将其作为字符串返回。

_e的作用与相同__,但立即回显结果。

_x是上下文翻译功能。它还有第二种选择,可以为进行翻译的人员提供上下文。

_ex与相同_x,但是echo是结果。

使用示例_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 );

在该示例中,有两种方法可以说出炸玉米饼的数量,具体取决于是否为单数。$ 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 );

这用不了多少,但是对组织来说很方便。例如,如果将所有字符串都放在一个文件中,然后在其他地方引用它们,那么just不可能做到这_n一点,您需_n_noop要这样做。

_nx_noop与相同_n_noop,但也可以为翻译人员提供上下文,与相同_x

请注意,您可以将域放入noop函数调用中,也可以放入translate_nooped_plural函数调用中。对于您的组织而言,哪种更有意义。如果两者都具有域,则传递给noop调用的域将获胜。

number_format_i18n与PHP的内置number_format等效,但是它增加了对小数等内容的处理,这在其他语言环境中是不同的。

date_i18n与PHP的内置date等效,所有相关处理也在那里。月名,日名等

另外,切勿触犯法律。只是提醒。:)


哇,这真的是一个很好的解释!非常感谢您的帮助!现在我明白了。
Circus Circus'7

6

__(),_ 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;

参量

__( $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 Ninja的一些其他资源:


另外,请查看法典中“其他”下的“本地化”,以获取功能的完整细分和详细说明。
TheDeadMedic

这是wp-polyglots相遇的地方。
brasofilo 2012年

@Johannes Pille:在我发布我的帖子之前,我没有注意到您的回答,我应该删除我的帖子吗?
杰里米·贾里德

@JeremyJared不,为什么?进一步的信息不是一件坏事,不是吗?我认为您的答案经过深思熟虑。向我+1。
约翰内斯·皮尔

@TheDeadMedic编辑为“其他资源”。
约翰内斯·皮尔

3

我不是翻译专家,但是WordPress Codex页面上有很好的文档,并说明了使用每个实例的原因。

从法典页面:

__()

当消息作为参数传递给另一个函数时使用;_e()用于将消息直接写到页面。关于这两个功能的更多详细信息:

__('message')

在本地化模块中搜索“ message”的翻译,并将翻译传递给PHP return语句。如果找不到“ message”的翻译,则仅返回“ message”。

_e('message')

在本地化模块中搜索“ message”的翻译,并将翻译传递给PHP echo语句。如果未找到“消息”的翻译,则仅回显“消息”。

请注意,如果要国际化主题或插件,则应使用 "Text Domain"

gettext框架可处理大多数WordPress。但是,WordPress发行版中有一些地方无法使用gettext:

  • WordPress主README文件-它是静态HTML文件,而不是PHP文件,因此无法通过gettext函数运行。
  • 在gettext加载之前的WordPress加载周期的早期,会生成一些错误消息。

链接到法典页面

有关gettext何时不起作用的其他信息

希望能回答您的问题,如果不告诉我们,也许有人可以提供帮助,或者我可以做更多研究。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.