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