2

我正在编写一个 wordpress 插件并计划它的 drupal 实现我正在将 wordpress 函数包装到适配器中。所以我写了一个适配器,__()这很简单

class Ai1ec_Wordpress_Template_Adapter implements Ai1ec_Template_Adapter {

    ...

    public function translate( $text ) {
        return __( $text, AI1EC_PLUGIN_NAME );
    }

我不是 gettext 的大专家,一位同事给我写信:

当 xgettext 解析代码以生成 .pot 文件时将失败。像 __() 这样的 WP i18n 函数要求将字符串文字作为第一个参数传递,而不是变量。和 IIRC,同样适用于 Drupal 的 t() 函数。

我已经阅读了法典条目
http://codex.wordpress.org/I18n_for_WordPress_Developers#Placeholders

http://api.drupal.org/api/drupal/includes%21bootstrap.inc/function/t/7

并且找不到与此完全相关的东西。soemone 可以确切地解释为什么这不起作用,我怎么能写出可以与 Wordpress 和 Drupal 兼容的东西?

4

2 回答 2

1

一般来说,您的同事是正确的,如果您将变量传递给翻译函数,除非相同的字符串在其他地方作为文字传入,否则它们将不会被翻译。这是因为生成翻译模板不会运行代码,它会搜索特定的函数名称。翻译方法有两个目的,一是翻译参数,二是向翻译模板生成程序标识翻译模板文件中应该包含哪些字符串。

您需要告诉翻译模板生成代码(通常是 xgettext)程序,您的函数的参数是可翻译的字符串。使用 xgettext 可以使用 -k 参数来完成。WordPress 可能已经有自己的 xgettext 包装器供您使用。

The drupal document you linked explicitly says you should not pass variables to t() unless you are sure that the text is passed as a literal elsewhere.

于 2012-10-04T12:13:54.490 回答
0

Wordpress 和 Drupal 版本都应该将字符串保存在变量中。Drupal 版本的措辞有些混乱。Drupal 文档所说的是,如果原始文本的来源是用户生成的,您应该小心。

$foo = 'bar';
($foo == 'bar') == true;
于 2012-10-03T09:55:01.440 回答