Как сделать перевод текста с гиперссылкой в ​​WordPress?

15

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

Итак, вот некоторые из решений, которые я нашел:

// METHOD 1
sprintf( __( 'Please read %1$sthis%2$s.', 'tacoverdo-example-domain' ), '<a target="_blank" href="' . esc_url( 'https://goo.gl' ) . '">', '</a>' );

// METHOD 2
echo '<a target="_blank" href="' . esc_url( 'https://goo.gl' ) . '">';
_e( 'Please read this.', 'tacoverdo-example-domain' );
echo '</a>';

// METHOD 3
sprintf( __( 'Please read <a href="%s">this</a>.', 'tacoverdo-example-domain' ), esc_url( 'https://goo.gl' ) );

// METHOD 4
sprintf( __( 'Please read %sthis%s.', 'tacoverdo-example-domain' ), '<a target="_blank" href="' . esc_url( 'https://goo.gl' ) . '">', '</a>' );

// METHOD 5
_e( 'Please read <a target="_blank" href="' . esc_url( 'https://goo.gl' ) . '">this</a>', 'tacoverdo-example-domain' );

Моей первой мыслью было бы, что метод 1 будет лучшим. Это не требует, чтобы ваши переводчики знали HTML. Но это также не позволяет тем, кто делает, связываться с этим. Это также довольно СУХОЙ (не повторяйте себя), так как вам не нужно переводить всю HTML-часть снова и снова.

Однако, публикуя этот вопрос в твиттере, люди отвечали, что метод 3 будет лучшим, как вы можете видеть здесь .

Итак, как мне сделать текст с переводом гиперссылки в WordPress?

Тако Вердо
источник

Ответы:

17

Это очень граненый вопрос. Он сочетает в себе проблемы, связанные с содержанием HTML, с целым рядом новых проблем перевода, таких как сканирование строк, сам процесс перевода и его проверка.

Итак, мы должны объединить:

  1. Текст (в переводимой форме)
  2. HTML-разметка (трудно сломать, но желательно в гибкой форме)
  3. URL-адрес (в безопасной и предпочтительно переводимой форме, может быть специфичным для языка!)

Мы также должны учитывать знакомство и уровень техники, другими словами - что будет делать ядро. Хорошо, это не помогает, что после быстрой проверки ядро ​​делает это большинством (если не всеми) из этих способов.

Исходя из этих факторов и окружающей дискуссии, я бы сказал, что есть три подхода, в зависимости от потребностей и приоритетов.

Просто - одна строка со всем

__( 'Please read <a href="https://goo.gl">this</a>', 'example-domain' );
  • легко следовать в коде
  • позволяет переводить все части (текст, разметка, URL) в целом
  • URL жестко закодирован
  • склонен к разрывам HTML
  • популярный в ядре

Сбалансированный - URL разбит

sprintf( 
    __( 'Please read <a href="%s">this</a>', 'example-domain' ), 
    esc_url( 'https://goo.gl' ) 
);
  • легко следовать
  • можно перевести все части, но URL-адрес (ы) требует отдельного вызова перевода
  • URL может быть динамическим и экранированным
  • склонен к разрывам HTML
  • популярный в ядре
  • популярный среди разработчиков / переводчиков

Piecemeal - разметка разорвана

sprintf( 
    __( 'Please read %1$sthis%2$s.', 'example-domain' ), 
    '<a href="' . esc_url( 'https://goo.gl' ) . '">',
    '</a>' 
);

или через конкатенацию

'<a href="' . esc_url( 'https://goo.gl' ) . '">' 
. __( 'Please read this.', 'example-domain' );
. '</a>';
  • менее читаемый
  • более устойчивы к разрывам HTML
  • менее популярный в ядре
  • нужно больше контекста для перевода

Правило большого пальца (насколько я вижу это)

  1. просто держать как можно проще
  2. по частям, чтобы предотвратить разрывы HTML
  3. сбалансирован для всех остальных случаев (вероятно, наиболее распространенный)
Rarst
источник
+1. Мне нравится опция «Сбалансированный», может быть, ее можно улучшить, добавив контекст _xвместо__
gmazzap
Я намеревался фрагменты как основные примеры, а не всеобъемлющие. Вероятно, будут различия в каждом из-за огромного количества сценариев и функций перевода.
Первый
У сбалансированного варианта есть и проблема, заключающаяся в том, что переводчики могут создавать неправильную разметку. Для уверенного и безопасного перевода лучше исключить HTML. Также я голосую за функции перевода с контекстом. Это дает переводчикам возможность понять, как без знания позиции, контекста в плагине, темы.
Бюлтге
Я слышал аргумент «переводчикам нужен контекст» раньше, но это заставляет меня задуматься. Для чего им нужен контекст в этом примере ? Я думаю, что хорошей практикой является предоставление контекста, когда это необходимо, но действительно ли это нужно переводчикам в этом случае? Они должны знать , является ли %sстоит за <strong>или <a href target="#">? Влияет ли это на их перевод?
Тако Вердо
@TacoVerdo, если ссылка не работает, я бы предположил, что текст без него вполне может быть неоднозначным, в этом случае контекст должен указывать, для чего предназначен текст. Контекст служит для дополнения информации, пока она не будет полной и однозначной. Когда вы разбиваете текст на более мелкие отдельные части, каждый из них нуждается в большем количестве контекста для того, где он помещается в целом.
Первое
7

Сейчас я работаю со многими мультиязычными сайтами и должен сказать:

  1. URL-адреса ссылок часто должны быть переводимыми.
  2. Доверяющая функция перевода плохая. Я почти никогда не пользуюсь, __()но всегда esc_html__()/ esc_attr__(). Это означает, что переводимая строка не может содержать HTML любого рода.
  3. Писая по-английски, мы часто не понимаем, что в других языках слово может быть написано по-разному, в зависимости от контекста. Поэтому, когда текст содержит 1 или несколько слов, всегда лучше использовать *_x()вариант перевода функций.
  4. включение более чем одного заполнителя для каждой переводимой строки может быть «опасным». Если переводчик не разработчик, он легко сломает рендеринг страницы. В примере %1$sthis%2$sнетехническое переводчик не понимает , что как sраз перед thisнеобходимо для правильного отображения, а также может думать , что разработчик хочет напечатать , thisно имел опечатку и написал sthis.

По всем этим причинам «правильно» перевести текст, содержащий ссылки, сложно. Единственное жизнеспособное решение, которое учитывает все сказанное выше:

$anchor = esc_html_x( 'Google', 'link text for google.com', 'txt-domain' );
$domain = esc_url( __( 'google.com', 'txt-domain' ) );  
$link   = sprintf( '<a href="https://%s">%s</a>', $domain, $anchor );

 /* translators: 1 is a link with text "Google" and URL google.com */
echo sprintf( esc_html__( 'Use %1$s to search.', 'example-domain' ), $link );

Который является безопасным и простым для перевода не техничными людьми, но также многословным и PITA для реализации, особенно если это нужно сделать для нескольких ссылок ...

Однако для кода, выпущенного в дикой природе с тысячами (реальных или потенциальных) пользователей, говорящих на многих языках, я бы выбрал именно этот способ.

Это на самом деле так, как я беру даже для кода, предназначенного только для внутреннего использования, но это я.


Примечание :

Может показаться слишком много, чтобы слово «Google» переводилось отдельно, и это, вероятно, верно для этого конкретного случая. Но иногда даже предполагают, что названия брендов неверны. Например, в Италии у нас есть бренд «Algida», который известен под 30 разными именами по всему миру .

В таком случае жесткое кодирование URL и / или названия бренда может вызвать проблемы.

Предоставление контекста для перевода поможет переводчикам решить, нужно ли им переводить название бренда или нет.

Gmazzap
источник
2

Вы должны держать разметку в переводимой строке, потому что переводчики должны знать, что есть ссылка. В некоторых языках результирующий текст ссылки может занимать несколько слов, даже внутри может быть запятая (или эквивалент) или другая разметка, которая должна быть правильно вложена.

Также важно создать текст говорящей ссылки, а не это или здесь .

2 или 3 - единственные переводимые варианты, но вы также должны сделать URL переводимым.

Фуксия
источник