php 使用__()和sprintf()翻译WP

uurity8g  于 2023-05-05  发布在  PHP
关注(0)|答案(5)|浏览(120)

我试图翻译WP主题。我有这个代码:

$translation = __( get_color(), 'textdomain' );

它可以工作,我从get_color()函数动态获取颜色,并且转换得很好。但当我使用“主题检查”插件我得到这个代码的错误。
我需要用这个代替:

$translation = sprintf( __( '%s', 'textdomain' ), get_color() );

但在这种情况下,我的占位符%s不会翻译,我会得到原始颜色名称(未翻译)。
我做错了什么?谢谢大家。

qq24tv8q

qq24tv8q1#

echo sprintf(__("text %s", 'your__text_domain'), $data);
ffvjumwh

ffvjumwh2#

我很惊讶没有人提到“translators”注解,它告诉翻译器sprintf中的每个变量是什么。示例:

sprintf(
    /* translators: %s: Name of a city */
    esc_html__( 'Your city is %s.', 'my-plugin' ),
    esc_html( $city )
);

sprintf(
     /* translators: 1: Name of a city 2: ZIP code */
    esc_html__( 'Your city is %1$s, and your zip code is %2$s.', 'my-plugin' ),
    esc_html( $city ),
    esc_html( $zipcode )
);

我们使用esc_html__转义转换,以防止来自社区翻译字符串的XSS,并使用esc_html在变量$city中保护XSS来转义动态输出。
参见:https://developer.wordpress.org/plugins/internationalization/how-to-internationalize-your-plugin/#variables

ttcibm8c

ttcibm8c3#

一、
在您的代码中:

$translation = sprintf( __( '%s', 'textdomain' ), get_color() );

__()函数检查字符串'%s'的翻译-您可能没有翻译-然后用get_color()的结果替换'%s'。因此get_color()的值永远不会通过转换函数。
我不知道什么是正确的解决方案是在这里,也许只是忘记主题检查在这种情况下。

vfwfrxfs

vfwfrxfs4#

许多提取可翻译字符串的翻译工具会查找字符串字面量,如下所示:

$translation = __( 'red', 'textdomain' );

可以肯定的是,Theme Check插件会提醒你,你的动态字符串不会被这样的工具提取出来。这是因为在提取过程中不会执行代码,因此表达式get_color()不会被计算为可翻译的字符串。
如果你不关心与字符串提取工具的兼容性,那么就按照你的第一个例子留下你的代码(第二个例子已经指出是错误的)。
如果你确实希望你的代码能与翻译工具一起工作,那么我建议你创建一个包含所有可能的颜色值的 dummy PHP文件。(假设列表是有限的)。您的文件看起来像这样:

<?php
__('red', 'textdomain' );
__('blue', 'textdomain' );
// and so on..

然后,如果您想停止实际的翻译调用产生“主题检查”错误,您将不得不将其重构为不会被拾取的内容。像这样的东西会被大多数提取器错过:

$translation = call_user_func( '__', get_color(), 'textdomain' );
cbwuti44

cbwuti445#

答案已经在前两个回复中给出了。遵循这一点,但不要忘记在那里添加一个转义函数。

这是如何翻译具有一个值或函数的文本:

sprintf(
    esc_html__( 'Your translatable text goes here and value is %s.', 'textdomain' ),
    $value_or_function
);

通过以下方式,您可以为yout可翻译文本添加多个值/函数。

sprintf(
    esc_html__( 'this is how you can add multiple values. value1: %1$s, and value2: %2$s.', 'textdomain' ),
    $value_or_function1,
    $value_or_function2
);

下面是sprintf函数的简介:

arg 1、arg 2、++参数将插入到主字符串中的百分号(%)处。此功能“逐步”工作。在第一个%符号处插入arg 1,在第二个%符号处插入arg 2,以此类推。
语法:sprintf(format,arg1,arg2,arg++)
可能的格式值:

%% - Returns a percent sign
%b - Binary number
%c - The character according to the ASCII value
%d - Signed decimal number (negative, zero or positive)
%e - Scientific notation using a lowercase (e.g. 1.2e+2)
%E - Scientific notation using a uppercase (e.g. 1.2E+2)
%u - Unsigned decimal number (equal to or greater than zero)
%f - Floating-point number (local settings aware)
%F - Floating-point number (not local settings aware)
%g - shorter of %e and %f
%G - shorter of %E and %f
%o - Octal number
%s - String
%x - Hexadecimal number (lowercase letters)
%X - Hexadecimal number (uppercase letters)

但通常我们使用%s并假设参数值将是一个字符串。

相关问题