web-dev-qa-db-ja.com

ハイパーリンク付きのテキストをWordPressで翻訳可能にする方法

ハイパーリンクを使ってテキストを翻訳可能にする方法はいくつかあります。しかし、私は単一のベストプラクティスを見つけることができませんでした。

だから、ここで私が見つけた解決策のいくつかは次のとおりです。

// 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部分全体を何度も何度も翻訳する必要がないので、これはかなりのDRY(自分自身を繰り返さないでください)でもあります。

しかし、この質問をTwitterに投稿すると、 here を見ればわかるように、方法3が最善であると人々は答えました。

それでは、どのように私はWordPressで翻訳可能なハイパーリンクのテキストを作るべきですか?

12
Taco Verdo

これは非常に多面的な問題です。固有のHTMLコンテンツの問題と、文字列のスキャン、翻訳プロセス自体、およびその検証など、まったく新しい翻訳の課題とを組み合わせたものです。

だから我々は組み合わせる必要があります:

  1. テキスト(翻訳可能形式)
  2. HTMLマークアップ(壊れにくいが、柔軟な形式が望ましい)
  3. URLの宛先(安全で翻訳可能な形式で、言語によって異なる場合があります)

また、親しみやすさと先行技術、つまりコアとなることについても考慮する必要があります。さて、それはクイックチェックからコアがこれらの方法のほとんど(全部ではないにしても)でこれをするのを助けません。

これらの要因と 周辺の議論 私は、ニーズと優先順位に応じて、3つのアプローチのアプローチがあると思います。

単純 - すべての文字列

__( '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. simple できるだけ単純にする
  2. piecemeal HTMLの改行を防ぐ
  3. balanced その他のすべての場合(おそらく最も一般的)
14
Rarst

最近私は多くの多言語ウェブサイトを扱っています、そして私は言わなければなりません:

  1. リンクのURLはしばしば翻訳可能である必要があります。
  2. 信頼変換機能の出力が正しくありません。私はほとんど__()を使いませんが、常にesc_html__()/esc_attr__()を使います。つまり、翻訳対象の文字列にはいかなる種類のHTMLも含めることができません。
  3. 英語で書くことは、他の言語ではWordがコンテクストによって異なる方法で書かれるかもしれないことをしばしば理解していません。そのため、テキストに含まれる単語が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 );

これは安全で技術的でない人々によって翻訳されるのが簡単ですが、特に冗長でPITAを実装することもできます。特に複数のリンクでこれを行う必要がある場合は...

しかし、たくさんの言語を話す何千人もの(本物または潜在的な)ユーザーがいる、実際に公開されているコードの場合、これが私のとる方法です。

これは実際には私が内部使用専用のコードでも取る方法ですが、それは私です。


「Google」という単語を個別に翻訳できるようにするには多すぎるように思われるかもしれませんが、これはおそらくこの特定のケースに当てはまります。しかし、ブランド名が間違っていると考えることさえあります。一例を挙げると、イタリアには "Algida" というブランド名があり、 世界中で30種類の異なる名前で知られています

そのような場合、URLやブランド名をハードコーディングすると問題が発生します。

翻訳の文脈を提供することで、翻訳者はブランド名を翻訳する必要があるかどうかを判断するのに役立ちます。

5
gmazzap

翻訳者は 知る にリンクがあるので、翻訳可能な文字列にマークアップを保存する必要があります。一部の言語では、結果として得られるリンクテキストが複数の単語にまたがっている場合があります。内部にカンマ(またはそれと同等のもの)があったり、正しくネストする必要があるその他のマークアップもあります。

this または here ではなく、話すリンクテキストを作成することも重要です。

2または3が唯一の翻訳可能なオプションですが、URLも翻訳可能にする必要があります。

2
fuxia