HTML внутри строки перевода языка __ () или _e ()

24

Каков правильный подход к построению строк перевода?

Например,

echo __( 'Hello ' . $first . ' you owe me money.' );
echo __( '<div><p>Top: ' . $t_margin . '</p>' . '<p>Bottom: ' . $b_margin . '</p></div>' )

Можно ли добавить строки и / или HTML, или это нужно сделать сначала, а затем выполнить перевод, например:

$html = '<div><p>Top: ' . $t_margin . '</p>' . '<p>Bottom: ' . $b_margin . '</p></div>';
echo __( $html ); 
Джейсон
источник

Ответы:

41

В функции есть второй аргумент __(). Необходимо указать домен, который вы используете для своего плагина или темы. В примерах ниже я использую 'text_domain'. Строка вашего домена должна быть уникальной. Он не должен совпадать с любой другой строкой домена. Не используется аргумент текстового домена, по умолчанию 'default'используется имя домена WordPress. Пройдите по ссылке, чтобы узнать больше.

Всегда используйте строку ( 'text_domain'). Никогда не используйте переменную, функцию или константу со строкой в ​​ней. Большинство (все?) Переводческие программы не увидят его без этой строки.

Ваш код:

echo __( 'Hello ' . $first . ' you own me money.' );

Не включайте переменные в строку.

Лучший способ:

echo sprintf( __( 'Hello %s you own me money.', 'text_domain' ), $first );

Или просто:

printf( __( 'Hello %s you own me money.', 'text_domain' ), $first );

%sЗаполнитель говорит человеческий переводчик, строка собирается там. Используйте %dдля чисел. Есть и другие заполнители .

(Эта фраза грамматически неправильно английский. Использование либо 'Hello %s, you owe me money.'или в 'Hello %s, you own my money.'зависимости от означает , что вы собирались.)


Ваш код:

$html = '<div><p>Top: ' . $t_margin . '</p>' . <p>Bottom: ' . $b_margin . '</p></div>';

Не переводите HTML. То же самое на любом языке.

Лучший способ:

$html = sprintf( '<div><p>%s</p><p>%s</p></div>', __( 'Top: ', 'text_domain' ) .  $t_margin, __( 'Bottom: ', 'text_domain' ) . $b_margin );

Или разбить его на несколько строк:

$html = sprintf(
    '<div><p>%s</p><p>%s</p></div>',
    __( 'Top: ', 'text_domain' ) .  $t_margin,
    __( 'Bottom: ', 'text_domain' ) . $b_margin
);

Если неясно, что такое Top и Bottom , вы можете использовать их _x()для объяснения контекста этих терминов.


Вы можете найти другие случаи перевода здесь: Интернационализация: Вы, вероятно, делаете это неправильно

Чарльз Кларксон
источник
Вы говорите, не переводите HTML. Могу ли я указать, что он не переводится, он просматривается в существующих таблицах предварительно переведенных строк. Наличие HTML в строке не имеет значения, если переводчик не удалил их. Фактически, в некоторых ситуациях это повышает производительность, чем поиск и замена регулярных выражений.
Twifty
Не имеет отношения, но следует отметить: это textdomainдолжна быть буквальная строка, она не может быть переменной / константой / свойством.
brasofilo
@brasofilo, этот совет написан в ответе вверху, но повторяется. Я сделал эту ошибку в нескольких пользовательских плагинах, написанных для клиентов.
Чарльз Кларксон
+1 за sprintf(). Это действительно способ иметь HTML в переводимой строке.
Helgatheviking
Я не понимаю, как использование sprintf()помогает как-то иначе, чем, может быть, более чистый внешний вид. Если у вас есть предложение с HTML внутри, например, Some text with a <strong>strong</strong> word inside.как можно перевести предложение в целом, а не переводить Some text with a, strongа word insideиндивидуально (что не имеет смысла).
phpheini
4

Я не буду рассматривать вопрос переменных в строке, так как это уже было сказано.

Вы хотите, чтобы ваша строка была статичной, что означает, что содержимое не изменится. Вы также хотите избежать ненужного HTML.

__( '<p>Hello World!</p>' );
__( '<h1>Hello World!</h1>' );

Вышеуказанное займет две строки в вашей таблице для того, что по сути является одним и тем же текстом. Они могут быть переписаны как:

'<p>' . __( 'Hello World!' ) . '</p>'
'<h1>' . __( 'Hello World!' ) . '</h1>'

Сокращение его до одного ряда.

Иногда HTML в тексте неизбежен. Взять, к примеру:

__( 'You currently owe <b>%s</b> dollars' );

Так как языки являются грамматическими, разделение текста вызовет проблемы для любого, кто переводит.

Практическое правило. HTML- теги форматирования текста в середине предложения в порядке. Предложения, начинающиеся и заканчивающиеся HTML, просто бесполезны.

Twifty
источник
В последнем примере вы можете обернуть полужирные теги вокруг вставляемого аргумента "<b>$string</b>". Тогда вы можете использовать 'You currently owe %s dollars'. Но может потребоваться остаться, если вы используете его с _n()функцией, которая требует %dзаполнителя.
Чарльз Кларксон
@CharlesClarkson Хороший звонок. Возможно, я должен был пропустить, %sчтобы сделать это немного более ясным.
Twifty