Come rendere un testo con collegamento ipertestuale traducibile in WordPress?


15

Ho visto diversi modi per rendere un testo traducibile con un collegamento ipertestuale. Tuttavia, non sono stato in grado di trovare un'unica best practice.

Quindi, ecco alcune delle soluzioni che ho trovato:

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

Il mio primo pensiero sarebbe che il metodo 1 sarebbe il migliore. Non richiede ai traduttori di conoscere HTML. Ma non consente anche a quelli che lo fanno di scherzare. È anche piuttosto ASCIUTTO (non ripetere te stesso) poiché non è necessario tradurre più volte l'intera parte HTML.

Tuttavia, quando si pubblica questa domanda su Twitter, le persone hanno risposto che il metodo 3 sarebbe il migliore, come puoi vedere qui .

Quindi, come devo rendere un testo con collegamento ipertestuale traducibile in WordPress?

Risposte:


17

Questo è un problema molto sfaccettato. Unisce i problemi inerenti al contenuto HTML con un carico completamente nuovo di sfide relative alla traduzione, come la ricerca di stringhe, il processo di traduzione stesso e la sua verifica.

Quindi dobbiamo combinare:

  1. Testo (in forma traducibile)
  2. Markup HTML (in forma difficile da rompere, ma preferibilmente flessibile)
  3. Destinazione URL (in forma sicura e preferibilmente traducibile, potrebbe essere specifica per la lingua!)

Dobbiamo anche considerare la familiarità e l'arte nota, in altre parole: cosa farebbe il core. Ok, non aiuta che da un controllo rapido il core faccia questo nella maggior parte (se non in tutti) di questi modi.

Da questi fattori e dalla discussione circostante direi che ci sono tre secchi di approcci, a seconda delle esigenze e delle priorità.

Semplice: una stringa con tutto

__( 'Please read <a href="https://goo.gl">this</a>', 'example-domain' );
  • facile da seguire nel codice
  • consente di tradurre tutte le parti (testo, markup, URL) nel loro insieme
  • URL hardcoded
  • incline a rotture HTML
  • popolare nel nucleo

Bilanciato: URL interrotto

sprintf( 
    __( 'Please read <a href="%s">this</a>', 'example-domain' ), 
    esc_url( 'https://goo.gl' ) 
);
  • facile da seguire
  • può tradurre tutte le parti, ma gli URL richiedono una chiamata di traduzione separata
  • L'URL può essere dinamico ed evaso
  • incline a rotture HTML
  • popolare nel nucleo
  • popolare aneddoticamente con sviluppatori / traduttori

Piecemeal - markup scoppiato

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

o tramite concatenazione

'<a href="' . esc_url( 'https://goo.gl' ) . '">' 
. __( 'Please read this.', 'example-domain' );
. '</a>';
  • meno leggibile
  • più resistente alle interruzioni HTML
  • meno popolare nel nucleo
  • ha bisogno di più contesto fornito per la traduzione

Regola del pollice (per quanto lo vedo)

  1. semplice mantenerlo il più semplice possibile
  2. frammentario per evitare interruzioni HTML
  3. bilanciato per tutti gli altri casi (probabilmente il più comune)

+1. Mi piace l'opzione "Bilanciata", forse può essere migliorata aggiungendo il contesto usando _xinvece di__
gmazzap

Intendevo frammenti come esempi di base piuttosto che completi. Probabilmente ci saranno variazioni in ciascuno a causa del numero puro di scenari e funzioni di traduzione.
Rarst

L'opzione bilanciata ha anche il problema che i traduttori possono creare markup errati. Per una traduzione sicura e sicura è meglio escludere l'html. Anche io voto per le funzioni di traduzione con il contesto. Ciò dà ai traduttori la possibilità di comprendere il come senza una conoscenza della posizione, del contesto nel plugin, del tema.
fusione

Ho già sentito l'argomento "i traduttori hanno bisogno del contesto", ma mi fa meravigliare. Per cosa hanno bisogno del contesto in questo esempio ? Penso che sia buona prassi fornire un contesto quando necessario, ma in questo caso i traduttori ne hanno davvero bisogno? Devono sapere se %ssta per <strong>o <a href target="#">? Influisce sulla loro traduzione?
Taco Verdo,

@TacoVerdo se il collegamento viene interrotto, suppongo che il testo senza di esso potrebbe benissimo essere ambiguo, in tal caso il contesto dovrebbe dire a quale destinazione è destinato il testo. Il contesto serve a riempire le informazioni fino a quando non sono complete e inequivocabili. Quando si suddivide il testo in pezzi autonomi più piccoli, ognuno di essi ha bisogno di più contesto per adattarsi all'intero.
Rarst

7

In questi giorni lavoro con molti siti web multilingue e devo dire:

  1. Gli URL dei collegamenti spesso devono essere traducibili.
  2. L'output della funzione di traduzione fidata è negativo. Praticamente non uso mai __()ma sempre esc_html__()/ esc_attr__(). Ciò significa che la stringa da tradurre non può contenere HTML di alcun tipo.
  3. Scrivendo in inglese spesso non ci rendiamo conto che in altre lingue una parola potrebbe essere scritta in modi diversi a seconda del contesto. Quindi, quando il testo contiene 1 o poche parole, è sempre meglio usare la *_x()variante delle funzioni di traduzione.
  4. includere più di un segnaposto per ogni stringa traducibile può essere "pericoloso". Se il traduttore non è uno sviluppatore, interromperà facilmente il rendering della pagina. Nell'esempio %1$sthis%2$sun traduttore non tecnico non capisce che il sprecedente thisè necessario per un rendering corretto e può anche pensare che lo sviluppatore abbia voluto digitare thisma avesse un refuso e abbia scritto sthis.

Per tutti questi motivi è difficile tradurre "correttamente" il testo che contiene collegamenti. L'unica soluzione praticabile che tiene conto di quanto detto sopra è:

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

Che è sicuro e facile da tradurre da persone non tecniche, ma anche prolisso e un PITA da implementare, specialmente se questo deve essere fatto per diversi collegamenti ...

Tuttavia, per un codice rilasciato in natura con migliaia di utenti (reali o potenziali) che parlano molte lingue, questo è il modo in cui prenderei.

Questo è in realtà il modo in cui prendo anche per il codice solo per uso interno, ma sono io.


Nota :

Potrebbe sembrare troppo per rendere la parola "Google" traducibile separatamente, e questo è probabilmente vero per questo caso specifico. Ma a volte anche supporre che i nomi dei marchi siano sbagliati. Solo per fare un esempio, in Italia abbiamo il marchio "Algida" che è conosciuto con circa 30 nomi diversi in tutto il mondo .

In tal caso, la codifica dell'URL e / o il nome del marchio causeranno problemi.

Fornire un contesto per la traduzione aiuterà i traduttori a decidere se devono o meno tradurre il marchio.


2

Devi mantenere il markup nella stringa traducibile, perché i traduttori devono sapere che esiste un collegamento. In alcune lingue il testo del link risultante potrebbe comprendere più parole, potrebbe esserci persino una virgola (o un equivalente) all'interno o un altro markup che deve essere nidificato correttamente.

È anche importante creare un testo di collegamento vocale, non questo o qui .

2 o 3 sono le uniche opzioni traducibili, ma dovresti anche rendere l'URL traducibile.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.