Polylang:如何翻译自定义字符串?

25
我的问题: 我正在使用Polylang翻译我的网站,但是我在自定义字符串翻译方面遇到了困难。这些字符串不会在WP仪表板的“字符串翻译”菜单中显示。

重要提示: 我不太了解PHP,所以pll_register_string函数对我来说非常令人困惑。

引用自Polylang文档:

https://polylang.wordpress.com/documentation/documentation-for-developers/functions-reference/

pll_register_string

允许插件在“字符串翻译”面板中添加自己的字符串。该函数必须在管理界面上调用(对于主题,functions.php文件是可以的)。可以注册空字符串(例如当它们来自选项时),但它们不会出现在列表中。

用法:

pll_register_string($name, $string, $group, $multiline); ‘$name’ => (必需)为方便排序提供的名称(例如:‘myplugin’) ‘$string’ => (必需)要翻译的字符串 ‘$group’ => (可选)字符串所注册的组,默认为‘polylang’ ‘$multiline’ => (可选)如果设置为true,则翻译文本字段将是多行的,默认为false

pll__

翻译以前使用pll_register_string注册的字符串。

用法:

pll__($string); 唯一参数是必需的:

‘$string’ => 要翻译的字符串,返回已翻译的字符串。

pll_e

回显以前使用pll_register_string注册的已翻译字符串。

用法:

pll_e($string); 唯一参数是必需的:

‘$string’ => 要翻译的字符串。

此致敬礼

4个回答

65

您必须首先将所有这些字符串注册以进行翻译。

例如,如果您想在某个模板文件中输出“Hello world”,可以像这样:

<?php pll_e('Hello world'); ?>

要在“字符串翻译”中显示字符串,请将以下内容添加到您的functions.php文件中:

add_action('init', function() {
  pll_register_string('mytheme-hello', 'Hello world');
});
将您想要翻译的所有自定义字符串添加到此函数中。

4
有没有办法自动检测这些字符串?我之前用过WPML,然后做了这个例子: <?php _e('Here the string text', 'my-string-group'); ?> 然后WPML就可以识别它了... - Loosie94
1
是的,Polylang无法捕获这些字符串。您需要先注册它们。 https://polylang.pro/doc/function-reference/#pll_register_string - Klaudio Milankovic
2
对于那些感兴趣的人,我使用了一个额外的插件来进行字符串翻译。请参见:https://wordpress.org/plugins/theme-translation-for-polylang/ - Loosie94
@drazewski 如果字符串来自插件而不是主题上添加的自定义字符串,这个方法是否有效?我需要翻译Patchstack插件中的Cookie通知。 - Diego M.

11

如Polylang 文档 所述,先检查Polylang函数是否存在是很好的做法,以免在插件更新时破坏网站,因为它首先删除旧文件。

因此,我提出这种方法: 在您的主题的functions.php文件中或者您的插件文件中,您可以创建所需的Polylang函数包装器,并提供回退选项,如果Polylang已被删除或更新,则不会发生未定义函数错误而导致WP崩溃。

/**
 * Outputs localized string if polylang exists or  output's not translated one as a fallback
 *
 * @param $string
 *
 * @return  void
 */
function pl_e( $string = '' ) {
    if ( function_exists( 'pll_e' ) ) {
        pll_e( $string );
    } else {
        echo $string;
    }
}

/**
 * Returns translated string if polylang exists or  output's not translated one as a fallback
 *
 * @param $string
 *
 * @return string
 */
function pl__( $string = '' ) {
    if ( function_exists( 'pll__' ) ) {
        return pll__( $string );
    }

    return $string;
}

// these function prefixes can be either you are comfortable with.

注意,我们创建了带有单个 l 的函数,名称为 pl__pl_e,而原始的 Polylang 函数名称为 pll__pll_e

这些函数将用于您的主题中输出或返回已翻译的字符串。

正如之前提到的,我们必须注册这些字符串,以便 Polylang 知道这些应该被翻译。

如果您正在使用主题,则可能需要在 after_setup_theme 钩子中初始化它们,像这样:

function your_prefix_after_setup_theme() {

   // register our translatable strings - again first check if function exists.

    if ( function_exists( 'pll_register_string' ) ) {

        pll_register_string( 'ToggleNavigation', 'Toggle navigation', 'YourThemeName', false );

        pll_register_string( 'ToggleSearch', 'Toggle Search', 'YourThemeName', false );

        pll_register_string('404Message', 'It looks like nothing was found. Try getting back to the <a href="%s">home page</a>.', 'YourThemeName', true);

    }
}
 add_action( 'after_setup_theme', 'your_prefix_after_setup_theme' );

1
或者简单地说(如果我错了请纠正):if ( !function_exists( 'pll_e' ) ) { function pll_e( $string = '' ) { echo $string; } } - Corentin
@Corentin,是的,我刚描述了pl__pl_e的方法,以简化模板中的代码,因为每次需要翻译的字符串时,使用它比输入if(!function_exists('pll_e')){}更短更清洁。 - Mikhail.root
@Mikhail.root 您不必每次都输入它。如果已启用 Polylang,则可以安全地使用 pll_epll__。但是,如果未启用 Polylang,则会调用自定义的 pll_epll__ 函数,这些函数仅输出字符串。我认为这种方法更好,因为某些开发人员可能没有注意到您的主题使用了 Polylang 调用的自定义方法名称,他们可能会使用默认方法 - 那么您的解决方案就无法正常工作。 - Kristián Filo

0

你好,有没有使用名称进行翻译的方式?

add_action('init', function() {
    pll_register_string('footer-Newsletter-form', 'Subscribe to Newsletter');
});

$translated_string =  pll_translate_string('footer-Newsletter-form', $lang);

这是一个好问题!有任何答案吗?使用值而不是名称非常奇怪...如果你有整段文字或类似的东西呢? - Kiriakos Grhgoriadhs

-1

非常感谢!我添加了这个设置,然后在其他地方找到了另一个技巧,在functions.php文件中添加我的可翻译文本:

 __(pll__('string to translate'), 'text-domain')

1
这种方法无法用于翻译您的项目。虽然对于您的系统来说没问题,但如果您希望其他人使用它,就不能使用此方法,因为gettext的工作方式需要实际字符串。 - Jeremy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接