広告ネットワークを翻訳関連の Google 検索機能と連携させる

ユーザーが翻訳されたコンテンツにアクセスしやすくするために、Google 検索には複数の翻訳関連の機能が用意されています。広告ネットワークを運用していて、翻訳されたウェブページに広告が正しく表示されない場合は、このガイドの手順に沿って、広告のレンダリングと属性の付与が適切か確認してください。

Google のアプローチ

ユーザーが検索結果から Google 翻訳提供の翻訳されたコンテンツにアクセスする場合、Google はページをパブリッシャーから取得し、ソース URL を書き換え、ユーザーが翻訳された検索結果をクリックしたときにそのウェブページを翻訳します。

Google で翻訳された URL を元の URL に変換する

パブリッシャーのソース URL を利用して広告ネットワークを運用する場合は、Google で翻訳された URL を変換して広告を正しく機能させる必要があります。パブリッシャーのホスト名をデコードする手順は次のとおりです。

  1. ホスト名からドメインのプレフィックスを抽出するには、.translate.goog サフィックスを削除します。
  2. _x_tr_enc パラメータを ,(カンマ)文字で区切り、encoding_list として保存します。
  3. ドメインのプレフィックスの先頭に _x_tr_hp パラメータの値を追加します(存在する場合)。
  4. encoding_list1 が含まれ、出力が 1- で始まる場合は、手順 2 の出力から 1- プレフィックスを削除します。
  5. encoding_list0 が含まれ、出力が 0- で始まる場合は、手順 3 の出力から 0- プレフィックスを削除します。プレフィックスを削除する場合は、is_idntrue に設定します。それ以外の場合は、is_idnfalse に設定します。
  6. /\b-\b/(正規表現)を .(ドット)文字に置き換えます。
  7. --(二重ハイフン)文字を -(ハイフン)文字に置き換えます。
  8. is_idntrue に設定されている場合、punycode プレフィックス xn-- を追加します。
  9. 省略可: Unicode に変換します。

Google で翻訳された URL からホスト名をデコードするための JavaScript コードの例

function decodeHostname(proxyUrl) {
  const parsedProxyUrl = new URL(proxyUrl);
  const fullHost = parsedProxyUrl.hostname;
  // 1. Extract the domain prefix from the hostname, by removing the
        ".translate.goog" suffix
  let domainPrefix = fullHost.substring(0, fullHost.indexOf('.'));

  // 2. Split _x_tr_enc parameter by "," (comma), save as encodingList
  const encodingList = parsedProxyUrl.searchParams.has('_x_tr_enc') ?
      parsedProxyUrl.searchParams.get('_x_tr_enc').split(',') :
      [];

  // 3. Prepend value of _x_tr_hp parameter to the domain prefix, if it exists
  if (parsedProxyUrl.searchParams.has('_x_tr_hp')) {
    domainPrefix = parsedProxyUrl.searchParams.get('_x_tr_hp') + domainPrefix;
  }

  // 4. Remove '1-' prefix from the output of step 2 if encodingList contains
  //    '1' and the output begins with '1-'.
  if (encodingList.includes('1') && domainPrefix.startsWith('1-')) {
    domainPrefix = domainPrefix.substring(2);
  }

  // 5. Remove '0-' prefix from the output of step 3 if encodingList contains
  //    '0' and the output begins with '0-'.
  //    Set isIdn to true if removed, false otherwise.
  let isIdn = false;
  if (encodingList.includes('0') && domainPrefix.startsWith('0-')) {
    isIdn = true;
    domainPrefix = domainPrefix.substring(2);
  }

  // 6. Replace /\b-\b/ (regex) with '.' (dot) character.
  // 7. Replace '--' (double hyphen) with '-' (hyphen).
  let decodedSegment =
      domainPrefix.replaceAll(/\b-\b/g, '.').replaceAll('--', '-');

  // 8. If isIdn equals true, add the punycode prefix 'xn--'.
  if (isIdn) {
    decodedSegment = 'xn--' + decodedSegment;
  }
  return decodedSegment;
}

URL を再構成する

  1. 元のページ URL を使用して、ホスト名をデコードされたホスト名に置き換えます。
  2. すべての _x_tr_* パラメータを削除します。

コードをテストする

次の表を使用して、コードの単体テストを作成できます。proxyUrl の場合、decodeHostname は期待値と一致している必要があります。

以下の表は、ホスト名のデコードをテストする場合にのみ使用できます。URL のパス、フラグメント、オリジナル パラメータが変わらないようにする必要があります。

proxyUrl decodeHostname
https://example-com.translate.goog example.com
https://foo-example-com.translate.goog foo.example.com
https://foo--example-com.translate.goog foo-example.com
https://0-57hw060o-com.translate.goog/?_x_tr_enc=0 xn--57hw060o.com (⚡😊.com)
https://1-en--us-example-com/?_x_tr_enc=1 en-us.example.com
https://0-en----w45as309w-com.translate.goog/?_x_tr_enc=1 xn--en--w45as309w.com (en-⚡😊.com)
https://1-0-----16pw588q-com.translate.goog/?_x_tr_enc=0,1 xn----16pw588q.com (⚡-😊.com)
https://lanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch-co-uk.translate.goog/?_x_tr_hp=l llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch.co.uk
https://lanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch-co-uk.translate.goog/?_x_tr_hp=www-l www.llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch.co.uk
https://a--aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa-com.translate.goog/?_x_tr_hp=a--xn--xn--xn--xn--xn--------------------------a a-xn-xn-xn-xn-xn-------------aa-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com
https://g5h3969ntadg44juhyah3c9aza87iiar4i410avdl8d3f1fuq3nz05dg5b-com.translate.goog/?_x_tr_enc=0&_x_tr_hp=0- xn--g5h3969ntadg44juhyah3c9aza87iiar4i410avdl8d3f1fuq3nz05dg5b.com (💖🌲😊💞🤷‍♂️💗🌹😍🌸🌺😂😩😉😒😘💕🐶🐱🐭🐹🐰🐻🦊🐇😺.com)