Wie mache ich einen Text mit Hyperlink in WordPress übersetzbar?

14

Ich habe verschiedene Möglichkeiten gesehen, einen Text mit einem Hyperlink übersetzbar zu machen. Es ist mir jedoch nicht gelungen, eine einzige bewährte Methode zu finden.

Hier sind einige der Lösungen, die ich gefunden habe:

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

Mein erster Gedanke wäre, dass Methode 1 am besten wäre. Ihre Übersetzer müssen sich nicht mit HTML auskennen. Aber es lässt auch nicht zu, dass diejenigen, die es tun, sich damit anlegen. Es ist auch ziemlich DRY (Don't Repeat Yourself), da Sie den gesamten HTML-Teil nicht immer wieder übersetzen müssen.

Beim Posten dieser Frage auf Twitter wurde jedoch geantwortet, dass Methode 3 am besten geeignet ist, wie Sie hier sehen können .

Also, wie soll ich einen Text mit Hyperlink in WordPress übersetzbar machen?

Taco Verdo
quelle

Antworten:

16

Dies ist ein sehr facettenreiches Thema. Es vereint inhärente Probleme mit HTML-Inhalten mit einer ganzen Reihe neuer Herausforderungen bei der Übersetzung, z.

Also müssen wir kombinieren:

  1. Text (in übersetzbarer Form)
  2. HTML-Markup (in schwer zu brechender, aber vorzugsweise flexibler Form)
  3. URL-Ziel (in sicherer und vorzugsweise übersetzbarer Form, möglicherweise sprachspezifisch!)

Wir müssen auch die Vertrautheit und den Stand der Technik berücksichtigen, mit anderen Worten: Was würde der Kern tun? Ok, es hilft nicht, dass der Kern dies auf die meisten (wenn nicht alle) Arten tut.

Ausgehend von diesen Faktoren und der umgebenden Diskussion würde ich sagen, dass es je nach Bedarf und Prioritäten drei unterschiedliche Ansätze gibt.

Einfach - eine Saite mit allem

__( 'Please read <a href="https://goo.gl">this</a>', 'example-domain' );
  • einfach im Code zu folgen
  • Ermöglicht die Übersetzung aller Teile (Text, Markup, URL) als Ganzes
  • URL fest codiert
  • anfällig für HTML-Brüche
  • beliebt im Kern

Ausgeglichen - URL defekt

sprintf( 
    __( 'Please read <a href="%s">this</a>', 'example-domain' ), 
    esc_url( 'https://goo.gl' ) 
);
  • einfach zu folgen
  • kann alle Teile übersetzen, URL (s) benötigen jedoch einen separaten Übersetzungsaufruf
  • URL kann dynamisch sein und mit Escapezeichen versehen werden
  • anfällig für HTML-Brüche
  • beliebt im Kern
  • Besonders beliebt bei Entwicklern / Übersetzern

Piecemeal - Aufschlag ausgebrochen

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

oder über die Verkettung

'<a href="' . esc_url( 'https://goo.gl' ) . '">' 
. __( 'Please read this.', 'example-domain' );
. '</a>';
  • weniger lesbar
  • widerstandsfähiger gegen HTML-Brüche
  • im Kern weniger beliebt
  • benötigt mehr Kontext für die Übersetzung

Faustregel (soweit ich das sehe)

  1. einfach , es so einfach wie möglich zu halten
  2. Stück für Stück , um HTML-Brüche zu vermeiden
  3. ausgeglichen für alle anderen Fälle (wahrscheinlich am häufigsten)
Rarst
quelle
+1. Ich mag die "Balanced" -Option, vielleicht kann das Hinzufügen von Kontext mithilfe _xvon__
gmazzap
Ich habe Schnipsel eher als grundlegende als als umfassende Beispiele gedacht. Aufgrund der Vielzahl von Szenarien und Übersetzungsfunktionen wird es wahrscheinlich zu Abweichungen kommen.
Rarst
Die ausgewogene Option hat auch das Problem, dass Übersetzer falsche Markups erstellen können. Für eine sichere Übersetzung ist es besser, wenn Sie HTML ausschließen. Auch ich stimme für Übersetzungsfunktionen mit Kontext. Das gibt den Übersetzern die Möglichkeit, das Wie zu verstehen, ohne Kenntnisse über Position, Kontext im Plugin, Thema.
Bueltge
Ich habe schon einmal gehört, dass die 'Übersetzer Kontext'-Argumente brauchen, aber ich wundere mich darüber. Wofür brauchen sie in diesem Beispiel Kontext ? Ich denke, es ist eine gute Praxis, Kontext bereitzustellen, wenn er benötigt wird, aber brauchen Übersetzer ihn in diesem Fall wirklich? Müssen sie wissen, ob %sfür <strong>oder steht <a href target="#">? Beeinflusst es ihre Übersetzung?
Taco Verdo
@TacoVerdo Wenn der Link abgebrochen ist, würde ich davon ausgehen, dass Text ohne ihn möglicherweise mehrdeutig ist. In diesem Fall sollte der Kontext angeben, für welches Ziel der Text bestimmt ist. Der Kontext dient dazu, Informationen aufzufüllen, bis sie vollständig und eindeutig sind. Wenn Sie Text in kleinere eigenständige Teile aufteilen, benötigt jeder von ihnen mehr Kontext, damit er in das Ganze passt.
Rarst
6

In diesen Tagen arbeite ich mit vielen mehrsprachigen Websites und ich muss sagen:

  1. URLs von Links müssen häufig übersetzbar sein.
  2. Die Ausgabe der Vertrauensübersetzungsfunktion ist schlecht. Ich benutze so ziemlich nie __()aber immer esc_html__()/ esc_attr__(). Das bedeutet, dass der zu übersetzende String keinerlei HTML enthalten darf.
  3. Wenn wir auf Englisch schreiben, merken wir oft nicht, dass ein Wort in anderen Sprachen je nach Kontext unterschiedlich geschrieben sein kann. Wenn der Text also 1 oder wenige Wörter enthält, ist es immer besser, die *_x()Variante der Übersetzungsfunktionen zu verwenden.
  4. Das Einfügen von mehr als einem Platzhalter für jede übersetzbare Zeichenfolge kann "gefährlich" sein. Wenn der Übersetzer kein Entwickler ist, kann die Seitenwiedergabe leicht unterbrochen werden. Im Beispiel %1$sthis%2$sversteht ein nicht technischer Übersetzer nicht , dass die skurz vor dem thisfür die richtige Darstellung notwendig ist, und kann auch denken , dass der Entwickler geben wollte thiseinen Tippfehler , sondern hatte und schrieb sthis.

Aus all diesen Gründen ist es schwierig, Text, der Links enthält, "richtig" zu übersetzen. Die einzige praktikable Lösung, die alle oben genannten Punkte berücksichtigt, ist:

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

Was sicher und einfach ist, von nicht-technischen Leuten übersetzt zu werden, aber auch ausführlich und von einer PITA implementiert zu werden, besonders wenn dies für mehrere Links durchgeführt werden muss ...

Für einen Code, der in freier Wildbahn veröffentlicht wird und bei dem Tausende (echte oder potenzielle) Benutzer viele Sprachen sprechen, ist dies jedoch der Weg, den ich einschlagen würde.

Dies ist eigentlich der Weg, den ich selbst für Code für den internen Gebrauch nehme, aber das bin ich.


Hinweis :

Es mag zu viel erscheinen, um das Wort "Google" separat übersetzbar zu machen, und das trifft wahrscheinlich auf diesen speziellen Fall zu. Aber manchmal wird sogar angenommen, dass Markennamen falsch sind. Um nur ein Beispiel zu nennen, in Italien haben wir die Marke "Algida", die mit ~ 30 verschiedenen Namen auf der ganzen Welt bekannt ist .

In diesem Fall kann das Hardcodieren der URL und / oder des Markennamens zu Problemen führen.

Wenn Sie den Kontext für die Übersetzung angeben, können die Übersetzer leichter entscheiden, ob sie den Markennamen übersetzen müssen oder nicht.

gmazzap
quelle
2

Sie müssen das Markup in der übersetzbaren Zeichenfolge behalten, da die Übersetzer wissen müssen, dass es einen Link gibt. In einigen Sprachen kann der resultierende Linktext mehrere Wörter umfassen, es kann sogar ein Komma (oder ein Äquivalent) innerhalb oder eines anderen Markups geben, das korrekt verschachtelt werden muss.

Es ist auch wichtig, einen sprechenden Linktext zu erstellen, nicht dies oder hier .

2 oder 3 sind die einzigen übersetzbaren Optionen, aber Sie sollten die URL auch übersetzbar machen.

fuxia
quelle