__():如果我必须传入一个变量怎么办?

时间:2014-01-26 作者:geoff

在翻译功能的文档中__( $text, $domain ), 它指出,您必须直接将字符串替换为$text,您不能做一些聪明的事情,例如__( $my_text, \'text-domain\' );.

但是,我正在编写一个方法,该方法接收字符串并需要将其传递给__( ... ) 以某种方式有没有办法,例如通过printfsprintf 我能解决这个问题吗?

类似于。。。

function print_description( $text ) {
    echo \'<p>\' . __( printf( \'%s\', $text ), \'text-domain\' ) . \'</p>\';
}

6 个回复
SO网友:Ahmad Awais

你可以用printf().

E、 g。

printf( __( \'We deleted %d spam messages.\', \'my-text-domain\' ), $count );

SO网友:Mark Kaplun

当传递给翻译例程的字符串是完全动态的时,帮助生成翻译的工具无法解析代码并确定需要翻译的字符串。

在您的示例中,编写此函数的正确方法是

function print_description( $text ) {
    echo \'<p>\' . $text . \'</p>\';
}
并称之为

print_description(__(\'specific description\',\'text_domain));

SO网友:Otto

不,因为当你不知道文本是什么时,你就不能翻译文本。

翻译本质上是通过一个大数组进行的。您可以获取代码,找到其中的所有字符串,然后构建一个大的字符串列表。翻译人员将其翻译成另一种语言。然后,各种翻译函数执行大数组查找并返回翻译后的字符串。

如果使用变量来保存文本字符串,则无法事先知道它是什么,也无法将其放入要翻译的字符串的初始列表中。

变量不能用于转换函数,因为这实际上没有任何意义。无法转换变量。

SO网友:Juan Guerrero

要在WordPress中翻译字符串,就像在大多数使用PHP的CMS中一样,您必须将字符串包装在GetText翻译函数中(即\\\\()、\\u e()、\\u n()、\\u x()。。。等等)。

字符串还必须包含在PO文件中(GetText Portable Object files,PHP中多语言网站的行业标准-https://www.gnu.org/software/gettext/manual/html_node/PO-Files.html). 此文件包含多对字符串,其中一个是原始语言中的字符串,另一个是目标语言中的翻译。

为了为我们需要翻译插件或主题的每种语言(即西班牙语的my-text-domain-es\\u es.PO、法语的my-text-domain-fr\\u fr.PO……等)构建这些PO文件,翻译人员将使用一个POT文件(PO模板),该文件包含所有要翻译的原始语言字符串,并将为每种语言添加一个翻译字符串。PO文件被编译为二进制MO文件,处理速度更快。

在运行时,要翻译的字符串通过MO文件获取并替换为其翻译。

POT文件通常使用特殊工具生成,这些工具解析源代码文件并提取可翻译字符串。

如果我们编写这样的代码:

    $translated_text = __( $text, \'my_text_domain\');
当代码由专用工具解析时,要翻译的字符串(文本)的值尚未定义,因此代码中不存在。因此,自动搜索工具不会在POT文件中包含此字符串,因此不会包含在PO或MO文件中。

在运行时,当字符串$text的值可能已经定义时,翻译文件中的该值将没有对应关系,因此无法进行翻译。

然而,如果该变量的一组可能值是有限的,并且我们知道它们,那么我们有两种选择来克服这个问题:

Option 1: 手动编辑POT文件以添加可能值为$text的条目。此选项简单且易于实现。任何代码编辑器和POT格式的最低知识就足够了。但它有一个缺点。每次我们在修改代码后使用自动搜索工具更新翻译时,我们所做的修改都会丢失,我们必须再次手动包含它们。

Option 2: 在我们的代码中包含翻译函数包装的$text的所有可能值。让我们看一个例子。假设$text可以取值:苹果、橙色、香蕉、桃子和梨。我们需要编写以下代码:

    // this variable is used only to include as parameters in
    // translation functions all the possible values of $text 
    $locale = __(\'apple\', \'my_text_domain\') .
              __(\'orange\', \'my_text_domain\') .
              __(\'banana\', \'my_text_domain\') .
              __(\'peach\', \'my_text_domain\') .
              __(\'pear\', \'my_text_domain\');

    $translated_text = __( $text, \'my_text_domain\');
这个选项也很容易实现,并且具有这样的优势:当我们使用自动搜索工具更新翻译时,它不会丢失。

如果我们在主题或插件中有几个要翻译的变量,并且这些变量的已知可能值有限,那么我们可以将它们全部包含在一个单独的文件中,该文件必须位于主题或插件的根文件夹或子文件夹(即“includes”或“assets”文件夹)中,如下所示:

    <?php
    //values of the variables to be translated
    $locale_var1 = __(\'text-of-var1_val1\', \'my_text_domain\') .
                   __(\'text-of-var1_val2\', \'my_text_domain\') .
                   __(\'text-of-var1_val3\', \'my_text_domain\') .
                   .......
                   __(\'text-of-var1_valn\', \'my_text_domain\');

    $locale_var2 = __(\'text-of-var2_val1\', \'my_text_domain\') .
                   __(\'text-of-var2_val2\', \'my_text_domain\') .
                   .......
                   __(\'text-of-var2_valn\', \'my_text_domain\');

    .............

    $locale_varn = __(\'text-of-varn_val1\', \'my_text_domain\') .
                   __(\'text-of-varn_val2\', \'my_text_domain\') .
                   .......
                   __(\'text-of-varn_valn\', \'my_text_domain\');
这是一种干净且可维护的方法,它将这些字符串的定义保存在一个单独的文件中,可以在不影响其他代码文件的情况下进行修改。

SO网友:Luca Reghellin

出于某种原因,对我来说,将变量传递给\\u e()是可行的:

$string = \'ciao\';
_e($string, \'textdomain\'); // put your own textdomain..
// will output \'ciao\' or \'hello\', based on current language
显然,您必须在之前创建textdomain,最好是在您的主题/函数中。php:

add_action( \'after_setup_theme\', \'theme_setup\' );
function theme_setup() {
  load_theme_textdomain( \'yourtextdomain\', TEMPLATEPATH . \'/languages\' );
  // [...] other init code
}
如果我把上面的“再见”这个词翻译过来。采购订单文件,它将在前端正确翻译。使用Poedit或类似工具编译。mo.两者都有。采购订单和。mo必须放在/wp content/yourtheme/languages中(根据上面的代码)。

#. Test en_EN.po
msgid "ciao"
msgstr "hello"
不确定它工作的原因,但它会以意大利语输出“ciao”,以英语输出“hello”。

SO网友:LindaJeanne

正如我在这里提到的http://www.westofwonder.com/2013/12/whats-with-all-the-double-underscores-everywhere/ (请原谅这个主题,我已经做了一些改进,只是还没有推出),一个可能的解决方案是为文本创建一个函数:

function yourtheme_thisisthetext() {
    return __( \'This is the text.\', \'yourthemetextdomain\' );
}
虽然本身很难看,但对于一个长的或经常使用的翻译字符串,在代码可读性方面进行权衡可能是值得的。

(这允许吗?可以链接到我的博客直接回答问题吗?如果不允许,我道歉,不会再这样做了。)

结束

相关推荐

为什么我不能在函数.php文件中使用一个钩子来加载我的Java脚本?

我是WP的新手(我来自Joomla),我有以下问题:我将这个纯HTML主题(使用引导CSS框架)带入WordPress主题。这是原始的纯HTML演示主题(我有完整的源代码,因为这是一个可下载的示例):http://www.html.it/guide/img/bootstrap/demo/home.html这是我个人正在研究的WP主题:http://onofri.org/WP_BootStrap/正如你所看到的,与最初的演示网站和我的个人WP主题的唯一区别是,在第二个网站中,JavaScript没有加载(因