透過集合功能整理內容
你可以依據偏好儲存及分類內容。
讓廣告聯播網能使用 Google 搜尋的翻譯相關功能
Google 搜尋提供多種翻譯相關功能,方便使用者瀏覽翻譯後的內容。如果您是廣告聯播網供應商,在遇到翻譯網頁無法正常顯示廣告的情形時,請按照本指南的步驟操作,以確保廣告能正確顯示或歸因。
我們的做法
從搜尋結果中存取 Google 翻譯提供的翻譯內容時,只要使用者點選經過翻譯的搜尋結果,Google 就會從發布者的網站上擷取該網頁,並重新編寫來源網址。
將 Google 翻譯網址轉換為原始網址
如果廣告聯播網需要使用發布者的來源網址,您就必須轉換 Google 翻譯後的網址,以確保廣告能正常顯示。請按照下列步驟,解碼發布者的主機名稱:
- 移除後置字元
.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
,請加入國際化域名編碼前置字元 xn--
。
- 選用:轉換為萬國碼 (Unicode)。
JavaScript 程式碼範例:從 Google 翻譯網址中解碼出主機名稱
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;
}
重建網址
- 使用原始的網頁網址,以經過解碼的主機名稱取代原本的主機名稱。
- 移除所有
_x_tr_*
參數。
測試程式碼
您可以使用下表,為程式碼建立單元測試。對任一 proxyUrl
來說,decodeHostname
必須與預期的值相同。
下表只能用於測試主機名稱解碼作業,請務必確保網址的路徑、片段和原始參數維持不變。
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)
|
除非另有註明,否則本頁面中的內容是採用創用 CC 姓名標示 4.0 授權,程式碼範例則為阿帕契 2.0 授權。詳情請參閱《Google Developers 網站政策》。Java 是 Oracle 和/或其關聯企業的註冊商標。
上次更新時間:2025-08-04 (世界標準時間)。
[null,null,["上次更新時間:2025-08-04 (世界標準時間)。"],[[["\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)` |"]]