Bagaimana cara membuat teks dengan hyperlink yang dapat diterjemahkan di WordPress?

15

Saya telah melihat berbagai cara melakukan pembuatan teks dengan hyperlink yang dapat diterjemahkan. Namun, saya tidak dapat menemukan satu pun praktik terbaik.

Jadi, berikut adalah beberapa solusi yang saya temukan:

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

Pikiran pertama saya adalah bahwa metode 1 akan menjadi yang terbaik. Itu tidak mengharuskan penerjemah Anda untuk mengetahui HTML. Tapi itu juga tidak memungkinkan orang-orang yang melakukannya mengacaukannya. Ini juga cukup KERING (Jangan Ulangi Diri Sendiri) karena Anda tidak perlu menerjemahkan seluruh bagian HTML berulang-ulang.

Namun, ketika memposting pertanyaan ini di twitter, orang-orang menjawab bahwa metode 3 akan menjadi yang terbaik seperti yang Anda lihat di sini .

Jadi, bagaimana cara membuat teks dengan hyperlink yang dapat diterjemahkan di WordPress?

Taco Verdo
sumber

Jawaban:

17

Ini adalah masalah yang sangat rumit. Ini menggabungkan masalah konten HTML yang inheren dengan tantangan terjemahan baru, seperti pemindaian untuk string, proses terjemahan itu sendiri, dan verifikasi.

Jadi kita harus menggabungkan:

  1. Teks (dalam bentuk yang dapat diterjemahkan)
  2. Markup HTML (dalam bentuk sulit dihancurkan, tetapi sebaiknya fleksibel)
  3. Tujuan URL (dalam bentuk yang aman dan sebaiknya diterjemahkan, mungkin khusus untuk bahasa!)

Kita juga perlu mempertimbangkan keakraban dan seni sebelumnya, dengan kata lain - apa yang akan dilakukan inti. Ok, itu tidak membantu bahwa dari pemeriksaan cepat inti melakukan ini di sebagian besar (jika tidak semua) dari cara-cara ini.

Dari faktor-faktor ini dan diskusi di sekitar saya akan mengatakan ada tiga ember pendekatan, tergantung pada kebutuhan dan prioritas.

Sederhana - satu string dengan segalanya

__( 'Please read <a href="https://goo.gl">this</a>', 'example-domain' );
  • mudah diikuti dalam kode
  • memungkinkan untuk menerjemahkan semua bagian (teks, markup, URL) secara keseluruhan
  • URL hardcoded
  • rawan jeda HTML
  • populer di intinya

Seimbang - URL pecah

sprintf( 
    __( 'Please read <a href="%s">this</a>', 'example-domain' ), 
    esc_url( 'https://goo.gl' ) 
);
  • Mudah untuk diikuti
  • dapat menerjemahkan semua bagian, tetapi URL perlu panggilan terjemahan yang terpisah
  • URL bisa dinamis dan lolos
  • rawan jeda HTML
  • populer di intinya
  • populer secara anekdot dengan pengembang / penerjemah

Sedikit demi sedikit - kenaikan markup

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

atau melalui gabungan

'<a href="' . esc_url( 'https://goo.gl' ) . '">' 
. __( 'Please read this.', 'example-domain' );
. '</a>';
  • kurang terbaca
  • lebih tahan terhadap jeda HTML
  • kurang populer di intinya
  • membutuhkan lebih banyak konteks yang disediakan untuk terjemahan

Aturan jempol (sejauh yang saya lihat)

  1. sederhana untuk membuatnya sesederhana mungkin
  2. sedikit demi sedikit untuk mencegah jeda HTML
  3. seimbang untuk semua kasus lain (kemungkinan paling umum)
Jarang
sumber
+1. Saya suka opsi "Seimbang", mungkin dapat ditingkatkan menambahkan konteks menggunakan _xbukan__
gmazzap
Saya bermaksud cuplikan sebagai contoh dasar daripada yang komprehensif. Mungkin akan ada variasi di masing-masing karena banyaknya skenario dan fungsi terjemahan.
Jarang,
Opsi seimbang juga memiliki masalah, bahwa penerjemah dapat membuat markup yang salah. Untuk terjemahan yang pasti dan aman lebih baik, Anda mengecualikan html. Saya juga memilih fungsi terjemahan dengan konteks. Itu memberi para penerjemah kesempatan untuk memahami bagaimana tanpa pengetahuan tentang posisi, konteks dalam plugin, tema.
bueltge
Saya pernah mendengar argumen 'penerjemah butuh konteks' sebelumnya, tetapi itu membuat saya heran. Untuk apa mereka membutuhkan konteks dalam contoh ini ? Saya pikir ini praktik yang baik untuk memberikan konteks ketika dibutuhkan, tetapi apakah penerjemah benar-benar membutuhkannya dalam kasus ini? Apakah mereka perlu tahu apakah %skepanjangan dari <strong>atau <a href target="#">? Apakah itu mempengaruhi terjemahan mereka?
Taco Verdo
@TacoVerdo jika tautan terputus saya akan menganggap teks tanpa itu mungkin sangat ambigu, dalam hal ini konteksnya harus menentukan tujuan teks tersebut. Konteks berfungsi untuk memuat informasi sampai lengkap dan tidak ambigu. Saat Anda memecah teks menjadi potongan-potongan mandiri yang lebih kecil, masing-masing membutuhkan lebih banyak konteks untuk tempat yang cocok secara keseluruhan.
Jarang
7

Hari ini saya bekerja dengan banyak situs web multi bahasa, dan saya harus mengatakan:

  1. URL tautan sering kali perlu diterjemahkan.
  2. Output fungsi terjemahan trust buruk. Saya hampir tidak pernah menggunakan __()tetapi selalu esc_html__()/ esc_attr__(). Yang berarti bahwa string yang akan diterjemahkan tidak boleh berisi HTML dalam bentuk apa pun.
  3. Menulis dalam bahasa Inggris sering tidak menyadari bahwa dalam bahasa lain kata mungkin ditulis dengan cara berbeda tergantung pada konteksnya. Jadi ketika teks berisi 1 atau beberapa kata, selalu lebih baik menggunakan *_x()varian fungsi terjemahan.
  4. memasukkan lebih dari satu placeholder untuk setiap string yang diterjemahkan bisa "berbahaya". Jika penerjemah bukan pengembang, mereka akan dengan mudah merusak rendering halaman. Dalam contoh tersebut %1$sthis%2$sseorang penerjemah non-teknis tidak mengerti bahwa ssebelum thisitu diperlukan untuk rendering yang tepat, dan mungkin juga berpikir bahwa pengembang ingin mengetik thistetapi memiliki kesalahan ketik dan menulis sthis.

Karena semua alasan ini, "menerjemahkan dengan benar" teks yang berisi tautan sulit. Satu-satunya solusi yang mempertimbangkan semua yang disebutkan di atas adalah:

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

Yang aman dan mudah diterjemahkan oleh orang-orang non-teknis, tetapi juga verbose dan PITA untuk diterapkan, terutama jika ini harus dilakukan untuk beberapa tautan ...

Namun, untuk kode yang dirilis di alam bebas dengan ribuan pengguna (nyata atau potensial) berbicara banyak bahasa, ini adalah cara yang akan saya ambil.

Ini sebenarnya cara saya mengambil bahkan untuk kode internal-gunakan-saja, tapi itu saya.


Catatan :

Mungkin terlihat terlalu banyak untuk membuat kata "Google" diterjemahkan secara terpisah, dan itu mungkin benar untuk kasus khusus ini. Namun terkadang bahkan menganggap nama merek itu salah. Sebagai contoh, di Italia kami memiliki merek "Algida" yang dikenal dengan ~ 30 nama berbeda di seluruh dunia .

Dalam kasus seperti itu, pengodean URL dan / atau nama merek, akan menyebabkan masalah.

Berikan konteks untuk terjemahan akan membantu penerjemah memutuskan apakah mereka perlu menerjemahkan nama merek atau tidak.

gmazzap
sumber
2

Anda harus menyimpan markup dalam string yang dapat diterjemahkan, karena penerjemah harus tahu ada tautan. Dalam beberapa bahasa, teks tautan yang dihasilkan mungkin menjangkau beberapa kata, bahkan mungkin ada koma (atau yang setara) di dalam atau markup lainnya yang perlu disarangkan dengan benar.

Penting juga untuk membangun teks tautan berbicara, bukan ini atau di sini .

2 atau 3 adalah satu-satunya opsi yang dapat diterjemahkan, tetapi Anda juga harus membuat URL dapat diterjemahkan.

fuxia
sumber