컬렉션을 사용해 정리하기
내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.
광고 네트워크에서 번역 관련 Google 검색 기능을 사용하도록 설정
Google 검색은 사용자가 번역된 콘텐츠에 액세스할 수 있는 번역 관련 기능을 제공합니다. 광고 네트워크를 운영하는데 광고가 번역된 웹페이지에서 올바르게 작동하지 않는다면 이 가이드의 단계를 따라 광고가 올바르게 렌더링되거나 기여도 분석이 정확하게 이루어지는지 확인해야 합니다.
Google의 접근방식
사용자가 검색결과 내에서 Google 번역을 통해 제공되는 번역된 콘텐츠에 액세스하면 Google에서는 게시자로부터 페이지를 검색하여 소스 URL을 재작성하고 사용자가 번역된 검색결과를 클릭한 후 웹페이지를 번역합니다.
Google 번역 URL을 원래 URL로 변환
게시자의 소스 URL에 의존하는 광고 네트워크를 운영하는 경우 Google 번역 URL을 변환하여 광고가 올바르게 작동하는지 확인해야 합니다. 다음 단계를 따라 게시자의 호스트 이름을 디코딩합니다.
.translate.goog
접미사를 삭제하여 호스트 이름에서 도메인 접두사를 추출합니다.
_x_tr_enc
매개변수를 ,
(쉼표) 문자로 분할하고 encoding_list
로 저장합니다.
_x_tr_hp
매개변수 값이 있으면 도메인 접두사 앞에 추가합니다.
encoding_list
에 1
이 포함되어 있고 출력이 1-
로 시작하면 2단계 출력에서 1-
접두사를 삭제합니다.
encoding_list
에 0
이 포함되어 있고 출력이 0-
로 시작하면 3단계 출력에서 0-
접두사를 삭제합니다. 접두사를 삭제한 경우 is_idn
을 true
로 설정합니다. 그 외의 경우에는 is_idn
을 false
로 설정합니다.
/\b-\b/
(정규식)를 .
(점) 문자로 바꿉니다.
--
(이중 하이픈) 문자를 -
(하이픈) 문자로 바꿉니다.
is_idn
이 true
로 설정되어 있으면 punycode 접두사 xn--
을 추가합니다.
- 선택사항: 유니코드로 변환합니다.
Google 번역 URL에서 호스트 이름을 디코딩하는 자바스크립트 코드 샘플
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 재구성
- 원본 페이지 URL을 사용하여 호스트 이름을 디코딩된 호스트 이름으로 바꿉니다.
- 모든
_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=0
|
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)
|
달리 명시되지 않는 한 이 페이지의 콘텐츠에는 Creative Commons Attribution 4.0 라이선스에 따라 라이선스가 부여되며, 코드 샘플에는 Apache 2.0 라이선스에 따라 라이선스가 부여됩니다. 자세한 내용은 Google Developers 사이트 정책을 참조하세요. 자바는 Oracle 및/또는 Oracle 계열사의 등록 상표입니다.
최종 업데이트: 2025-08-04(UTC)
[null,null,["최종 업데이트: 2025-08-04(UTC)"],[[["\u003cp\u003eAd networks need to adjust how they handle Google Translate URLs to ensure ads function correctly on translated pages.\u003c/p\u003e\n"],["\u003cp\u003eA process is outlined to decode Google Translate URLs back to the original publisher's URL, involving extracting and manipulating URL components.\u003c/p\u003e\n"],["\u003cp\u003eProvided JavaScript code offers a solution to decode the hostname from Google Translate URLs.\u003c/p\u003e\n"],["\u003cp\u003eReconstructing the full original URL involves replacing the decoded hostname and removing Google Translate-specific parameters.\u003c/p\u003e\n"],["\u003cp\u003eA table with sample URLs and expected decoded hostnames aids in testing the implementation.\u003c/p\u003e\n"]]],["Ad networks must decode Google Translate URLs to ensure ads function on translated pages. This involves extracting the domain prefix, splitting the `_x_tr_enc` parameter, prepending the `_x_tr_hp` parameter, conditionally removing prefixes based on `encoding_list`, replacing hyphens, and adding a punycode prefix if `is_idn` is true. Finally, reconstruct the original URL by replacing the hostname with the decoded one and removing `_x_tr_*` parameters. Sample JavaScript code and test cases are provided.\n"],null,["# Ad Networks & Translation Search Features | Google Search Central\n\nEnabling your ad network to work with translation-related Google Search features\n================================================================================\n\n\nGoogle Search offers several [translation-related features](/search/docs/appearance/translated-results)\nthat enable users to access translated content. If you run an ad network and your ads aren't\nworking properly on translated web pages, you'll need to follow the steps in this guide to\nmake sure your ads render or attribute correctly.\n\nOur approach\n------------\n\n\nWhen users access translated content provided by [Google\nTranslate](https://translate.google.com/about/) from within search results, Google retrieves the page from the publisher, rewrites\nthe source URL, and translates the web page after the user clicks the translated result.\n\nConvert the Google Translate URL to the original URL\n----------------------------------------------------\n\n\nIf you run an ad network that relies on the publisher's source URL, you'll need to convert the\nGoogle Translate URL to make sure your ads are working properly. Follow these steps to decode the publisher's hostname:\n\n1. Extract the domain prefix from the hostname, by removing the `.translate.goog` suffix.\n2. Split the `_x_tr_enc` parameter by the `,` (comma) character and save it as `encoding_list`.\n3. Prepend the value of the `_x_tr_hp` parameter to the domain prefix, if it exists.\n4. If `encoding_list` contains `1` and the output begins with `1-`, remove the `1-` prefix from the output of step 2.\n5. If `encoding_list` contains `0` and the output begins with `0-`, remove the `0-` prefix from the output of step 3. If you removed the prefix, set `is_idn` to `true`. Otherwise, set `is_idn` to `false`.\n6. Replace `/\\b-\\b/` (regex) with the `.` (dot) character.\n7. Replace the `--` (double hyphen) character with the `-` (hyphen) character.\n8. If `is_idn` is set to `true`, add the punycode prefix `xn--`.\n9. **Optional**: Convert to Unicode.\n\n### Sample JavaScript code for decoding the hostname from a Google Translate URL\n\n```gdscript\nfunction decodeHostname(proxyUrl) {\n const parsedProxyUrl = new URL(proxyUrl);\n const fullHost = parsedProxyUrl.hostname;\n // 1. Extract the domain prefix from the hostname, by removing the\n \".translate.goog\" suffix\n let domainPrefix = fullHost.substring(0, fullHost.indexOf('.'));\n\n // 2. Split _x_tr_enc parameter by \",\" (comma), save as encodingList\n const encodingList = parsedProxyUrl.searchParams.has('_x_tr_enc') ?\n parsedProxyUrl.searchParams.get('_x_tr_enc').split(',') :\n [];\n\n // 3. Prepend value of _x_tr_hp parameter to the domain prefix, if it exists\n if (parsedProxyUrl.searchParams.has('_x_tr_hp')) {\n domainPrefix = parsedProxyUrl.searchParams.get('_x_tr_hp') + domainPrefix;\n }\n\n // 4. Remove '1-' prefix from the output of step 2 if encodingList contains\n // '1' and the output begins with '1-'.\n if (encodingList.includes('1') && domainPrefix.startsWith('1-')) {\n domainPrefix = domainPrefix.substring(2);\n }\n\n // 5. Remove '0-' prefix from the output of step 3 if encodingList contains\n // '0' and the output begins with '0-'.\n // Set isIdn to true if removed, false otherwise.\n let isIdn = false;\n if (encodingList.includes('0') && domainPrefix.startsWith('0-')) {\n isIdn = true;\n domainPrefix = domainPrefix.substring(2);\n }\n\n // 6. Replace /\\b-\\b/ (regex) with '.' (dot) character.\n // 7. Replace '--' (double hyphen) with '-' (hyphen).\n let decodedSegment =\n domainPrefix.replaceAll(/\\b-\\b/g, '.').replaceAll('--', '-');\n\n // 8. If isIdn equals true, add the punycode prefix 'xn--'.\n if (isIdn) {\n decodedSegment = 'xn--' + decodedSegment;\n }\n return decodedSegment;\n}\n```\n\nReconstruct the URL\n-------------------\n\n1. Using the original page URL, replace the hostname with the decoded hostname.\n2. Remove all `_x_tr_*` parameters.\n\nTest your code\n--------------\n\n\nYou can create unit tests for your code using the following table. Given a `proxyUrl`,\nthe `decodeHostname` must match the expected value.\n\n\nThe following table can only be used to test the hostname decoding. You'll need to ensure that\nthe path, fragment, and original parameters of the URL are preserved as is.\n\n| `proxyUrl` | `decodeHostname` |\n|----------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------|\n| `https://example-com.translate.goog` | `example.com` |\n| `https://foo-example-com.translate.goog` | `foo.example.com` |\n| `https://foo--example-com.translate.goog` | `foo-example.com` |\n| `https://0-57hw060o-com.translate.goog/?_x_tr_enc=0` | `xn--57hw060o.com (⚡😊.com)` |\n| `https://1-en--us-example-com/?_x_tr_enc=1` | `en-us.example.com` |\n| `https://0-en----w45as309w-com.translate.goog/?_x_tr_enc=0` | `xn--en--w45as309w.com (en-⚡😊.com)` |\n| `https://1-0-----16pw588q-com.translate.goog/?_x_tr_enc=0,1` | `xn----16pw588q.com (⚡-😊.com)` |\n| `https://lanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch-co-uk.translate.goog/?_x_tr_hp=l` | `llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch.co.uk` |\n| `https://lanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch-co-uk.translate.goog/?_x_tr_hp=www-l` | `www.llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch.co.uk` |\n| `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` |\n| `https://g5h3969ntadg44juhyah3c9aza87iiar4i410avdl8d3f1fuq3nz05dg5b-com.translate.goog/?_x_tr_enc=0&_x_tr_hp=0-` | `xn--g5h3969ntadg44juhyah3c9aza87iiar4i410avdl8d3f1fuq3nz05dg5b.com (💖🌲😊💞🤷♂️💗🌹😍🌸🌺😂😩😉😒😘💕🐶🐱🐭🐹🐰🐻🦊🐇😺.com)` |"]]