Як зробити текст із гіперпосиланням перекладеним у 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 знову і знову.

Однак, публікуючи це питання на Twitter, люди відповіли, що метод 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
  • популярний в ядрі
  • анекдотично користується популярністю у розробників / перекладачів

Шматковий - розмітка розбита

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. збалансований для всіх інших випадків (швидше за все, найбільш поширених)

+1. Мені подобається варіант "Збалансований", можливо, можна покращити додавання контексту, використовуючи _xзамість__
gmazzap

Я запропонував фрагменти як основні приклади, а не вичерпні. Можливо, в кожному з них будуть різні варіанти через велику кількість сценаріїв та функцій перекладу.
Рарст

Урівноважений варіант також має проблему, що перекладачі можуть створювати неправильну розмітку. Для надійного та безпечного перекладу краще, щоб ви виключали html. Також я голосую за функції перекладу з контекстом. Це дає можливість перекладачам зрозуміти, як без знання положення, контексту в плагіні, теми.
буелге

Я чув, що "перекладачам потрібен контекст"-аргумент раніше, але це змушує мене замислитися. Для чого їм потрібен контекст у цьому прикладі ? Я думаю, що це добре використовувати контекст, коли це потрібно, але чи потрібні перекладачі в цьому випадку? Вони повинні знати , є чи %sварто за <strong>чи <a href target="#">? Чи впливає це на їх переклад?
Taco Verdo

@TacoVerdo, якщо посилання розірвано, я б припустив, що текст без нього може бути дуже неоднозначним, у цьому випадку контекст повинен визначати, для якого тексту призначений текст. Контекст слугує для розміщення інформації, поки вона не є повною та однозначною. Коли ви розбиваєте текст на менші автономні фрагменти, кожен з них потребує більше контексту для того, де він відповідає цілому.
Рарст

8

У ці дні я працюю з багатьма багатомовними веб-сайтами, і я повинен сказати:

  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 );

Що можна безпечно та легко перекладати нетехнічними людьми, але також багатослівним та ПДФА для впровадження, особливо якщо це потрібно зробити за декількома посиланнями ...

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

Це насправді те, що я приймаю навіть за код, призначений лише для внутрішнього використання, але це я.


Примітка :

Це може здатися занадто багато, щоб зробити слово "Google" окремо перекладним, і це, мабуть, справедливо для цього конкретного випадку. Але іноді навіть вважати, що торгові марки невірно. Для прикладу, в Італії у нас є бренд "Algida", який відомий з ~ 30 різними назвами по всьому світу .

У такому випадку жорстке кодування URL-адреси та / або фірмового найменування спричинить проблеми.

Надання контексту для перекладу допоможе перекладачам вирішити, чи потрібно їм перекладати фірмову назву чи ні.


2

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

Також важливо будувати текст розмовного посилання, а не цей чи тут .

2 або 3 - це єдині варіанти перекладу, але ви також повинні зробити URL-адресу, що також може бути перекладеним.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.