Jak zrobić tekst z hiperłączem do przetłumaczenia w WordPress?

15

Widziałem różne sposoby tworzenia tekstu z tłumaczeniem hiperłącza. Nie udało mi się jednak znaleźć jednej najlepszej praktyki.

Oto niektóre z rozwiązań, które znalazłem:

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

Moją pierwszą myślą byłoby, że metoda 1 byłaby najlepsza. Nie wymaga od twoich tłumaczy znajomości HTML. Ale nie pozwala też tym, którzy robią z tym bałagan. Jest również dość SUCHY (Don't Repeat Yourself), ponieważ nie musisz tłumaczyć całego fragmentu HTML w kółko.

Jednak zamieszczając to pytanie na Twitterze, ludzie odpowiedzieli, że metoda 3 byłaby najlepsza, jak widać tutaj .

Jak więc utworzyć tekst z hiperłączem do przetłumaczenia w WordPress?

Taco Verdo
źródło

Odpowiedzi:

17

To bardzo skomplikowana kwestia. Łączy w sobie nieodłączne problemy z treścią HTML z zupełnie nowym wyzwaniem tłumaczenia, takim jak skanowanie ciągów, sam proces tłumaczenia i jego weryfikacja.

Więc musimy połączyć:

  1. Tekst (w formie do przetłumaczenia)
  2. Znaczniki HTML (w trudnych do złamania, ale najlepiej elastycznych)
  3. Miejsce docelowe adresu URL (w bezpiecznej i najlepiej przetłumaczalnej formie, może być specyficzne dla języka!)

Musimy także wziąć pod uwagę znajomość i stan techniki, innymi słowy - co by zrobiło. Ok, to nie pomaga, że ​​od szybkiego sprawdzenia rdzeń robi to na większość (jeśli nie wszystkie) z tych sposobów.

Na podstawie tych czynników i otaczającej dyskusji powiedziałbym, że istnieją trzy grupy podejść, w zależności od potrzeb i priorytetów.

Prosty - jeden ciąg ze wszystkim

__( 'Please read <a href="https://goo.gl">this</a>', 'example-domain' );
  • łatwe do naśladowania w kodzie
  • pozwala tłumaczyć wszystkie części (tekst, znaczniki, URL) jako całość
  • Adres URL zakodowany na stałe
  • podatne na pęknięcia HTML
  • popularny w rdzeniu

Zrównoważony - zepsuty adres URL

sprintf( 
    __( 'Please read <a href="%s">this</a>', 'example-domain' ), 
    esc_url( 'https://goo.gl' ) 
);
  • Łatwy do podążania
  • może tłumaczyć wszystkie części, ale adresy URL wymagają osobnego wywołania tłumaczenia
  • Adres URL może być dynamiczny i mieć zmienne znaczenia
  • podatne na pęknięcia HTML
  • popularny w rdzeniu
  • anegdotycznie popularny wśród programistów / tłumaczy

Piecemeal - rozbity znacznik

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

lub poprzez konkatenację

'<a href="' . esc_url( 'https://goo.gl' ) . '">' 
. __( 'Please read this.', 'example-domain' );
. '</a>';
  • mniej czytelne
  • bardziej odporny na pęknięcia HTML
  • mniej popularny w rdzeniu
  • potrzebuje więcej kontekstu do tłumaczenia

Reguła kciuka (o ile ją widzę)

  1. proste, aby było tak proste, jak to możliwe
  2. fragmentarycznie, aby zapobiec łamaniu się HTML
  3. zrównoważony dla wszystkich innych przypadków (prawdopodobnie najczęściej)
Rarst
źródło
+1. Podoba mi się opcja „Zrównoważony”, być może można ją ulepszyć dodając kontekst, używając _xzamiast__
gmazzap
Fragmenty zamierzyłem jako podstawowe przykłady, a nie wyczerpujące. Prawdopodobnie będą różne w zależności od liczby scenariuszy i funkcji tłumaczenia.
Rarst
Zrównoważona opcja ma również problem polegający na tym, że tłumacze mogą tworzyć niewłaściwe znaczniki. Dla pewnego i bezpiecznego tłumaczenia lepiej jest wykluczyć HTML. Głosuję również za funkcjami tłumaczenia z kontekstem. Dzięki temu tłumacze mogą zrozumieć, w jaki sposób bez wiedzy o pozycji, kontekście w wtyczce, temacie.
bueltge
Słyszałem już argument „tłumacze potrzebują kontekstu”, ale zastanawiam się. Do czego potrzebują kontekstu w tym przykładzie ? Myślę, że dobrą praktyką jest zapewnianie kontekstu w razie potrzeby, ale czy tłumacze naprawdę go potrzebują w tym przypadku? Czy muszą wiedzieć, czy %soznacza, <strong>czy <a href target="#">? Czy to wpływa na ich tłumaczenie?
Taco Verdo
@TacoVerdo jeśli link jest uszkodzony z Przypuszczam tekst bez to może równie dobrze być niejednoznaczne, w tym przypadku kontekst powinien powiedzieć co docelowy tekst jest za. Kontekst służy do uzupełniania informacji, dopóki nie będą kompletne i jednoznaczne. Kiedy dzielisz tekst na mniejsze samodzielne części, każdy z nich potrzebuje więcej kontekstu, aby zmieścił się w całości.
Rarst
8

Obecnie pracuję z wieloma stronami wielojęzycznymi i muszę powiedzieć:

  1. Adresy URL linków często muszą być przetłumaczalne.
  2. Dane wyjściowe funkcji tłumaczenia zaufania są złe. Prawie nigdy nie używam, __()ale zawsze esc_html__()/ esc_attr__(). Co oznacza, że ​​ciąg do przetłumaczenia nie może zawierać HTML-a.
  3. Pisząc po angielsku często nie zdajemy sobie sprawy, że w innych językach słowo może być pisane na różne sposoby, w zależności od kontekstu. Dlatego gdy tekst zawiera 1 lub kilka słów, zawsze lepiej jest skorzystać z *_x()wariantu funkcji tłumaczenia.
  4. zawarcie więcej niż jednego symbolu zastępczego dla każdego przekładalnego łańcucha może być „niebezpieczne”. Jeśli tłumacz nie jest programistą, łatwo przerwie renderowanie strony. W tym przykładzie %1$sthis%2$snietechniczny tłumacz nie rozumie, że stuż przed thisjest konieczne do poprawnego renderowania, i może również myśleć, że deweloper chciał pisać, thisale miał literówkę i pisał sthis.

Z tych wszystkich powodów „prawidłowe” tłumaczenie tekstu zawierającego linki jest trudne. Jedynym realnym rozwiązaniem, które bierze pod uwagę wszystkie wyżej wymienione, jest:

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

Który jest bezpieczny i łatwy do przetłumaczenia przez osoby nietechniczne, ale także szczegółowe i PITA do wdrożenia, zwłaszcza jeśli trzeba to zrobić dla kilku linków ...

Jednak w przypadku kodu wydanego na wolności z tysiącem (prawdziwych lub potencjalnych) użytkowników mówiących w wielu językach, to jest mój sposób.

Tak właśnie podchodzę do kodu do użytku wewnętrznego, ale to ja.


Uwaga :

Może się wydawać, że słowo „Google” może być przetłumaczone osobno, i to chyba prawda w tym konkretnym przypadku. Ale czasami nawet zakładam, że nazwy marek są nieprawidłowe. Przykładowo we Włoszech mamy markę „Algida” znaną z około 30 różnych nazw na całym świecie .

W takim przypadku zakodowanie adresu URL i / lub nazwy marki spowoduje problemy.

Podaj kontekst tłumaczenia, aby pomóc tłumaczom w podjęciu decyzji o przetłumaczeniu nazwy marki.

gmazzap
źródło
2

Musisz zachować znaczniki w ciągach do przetłumaczenia, ponieważ tłumacze muszą wiedzieć, że istnieje link. W niektórych językach wynikowy tekst łącza może obejmować wiele słów, wewnątrz może znajdować się przecinek (lub odpowiednik) lub inny znacznik, który musi być poprawnie zagnieżdżony.

Ważne jest również zbudowanie mówionego tekstu linku, nie tego lub tutaj .

2 lub 3 to jedyne opcje do przetłumaczenia, ale powinieneś również umożliwić tłumaczenie adresu URL.

fuxia
źródło