發布日期:2025 年 5 月 8 日
使用 Translator API 和 Language Detector API,讓全球觀眾都能存取您的內容。您可以使用 Language Detector API 判斷輸入內容所用的語言,並使用 Translator API 將該語言翻譯成其他語言。這兩項 API 都會在用戶端執行,並使用 Chrome 內建的 AI 模型,因此速度快、安全且免費,不會產生伺服器費用。
API | 說明 | 網頁 | 額外資訊 | Chrome 狀態 | Intent |
---|---|---|---|---|---|
Translator API | MDN | 查看 | 出貨意願 | ||
Language Detector API | MDN | 查看 | 出貨意願 |
瞭解 Policybazaar 和 JioHotstar 這兩間大型國際企業,如何使用這些內建 API 並從中獲益。
Policybazaar 的多語言客戶服務
Policybazaar 是印度最大的保險平台,註冊客戶超過 9, 700 萬人。印度擁有令人驚嘆的語言多樣性,全國各地有許多語言和方言。
為支援客戶間的語言多樣性,Policybazaar 採用了兩種 Translator 和 Language Detector API 實作方式:隨時提供保險協助,以及以客戶偏好的語言提供市場洞察文章。
透過 Finova AI 取得保險協助
保險本質上是個人產品,特定保單的依據是機密資訊。Policybazaar 的客戶經常尋求有關如何選擇方案或方案支援內容的指引。雖然 Policybazaar 的員工會說多種語言,但他們需要一個能跨時區和在非上班時間運作的解決方案。因此,Policybazaar 打造了 Finova AI,可根據客戶偏好的語言提供量身打造的保險輔助服務。
「Chrome 的語言偵測器和翻譯器 API 可滿足客戶的各種語言需求,讓我們的保險協助服務更加順暢。因此,使用者可以透過偏好的印度語言進行通訊,不會有明顯延遲。」
—Policybazaar 壽險事業部設計主管 Rishabh Mehrotra
團隊選擇了用戶端 AI,也就是在瀏覽器或使用者裝置上進行推論。與伺服器代管或無伺服器 AI 相比,用戶端 AI 的延遲時間最短,成本也較低。即時對話的訊息量大且速度快,因此以伺服器為基礎的解決方案會耗費大量成本和時間。
Chrome 內建 AI 實作功能提供瀏覽器內建模型,因此推論作業會在裝置上執行。這是滿足主要需求的絕佳解決方案。
// Language Detector and Translator APIs implemented with React
import { useRef } from "react";
const useService = () => {
const languageModel = useRef(null);
const translatorCapabilitiesModel = useRef(null);
const loadAllModels = async () => {
if (window?.LanguageDetector) {
languageModel.current = await window.LanguageDetector.create().catch(() => null);
}
}
// Detect what language the customer is writing
const detectLanguage = async (message) => {
if (!languageModel.current) return "";
try {
const [result] = await languageModel.current.detect(message);
const { detectedLanguage, confidence } = result || {};
return confidence * 100 > 50 ? detectedLanguage : "";
} catch (err) {
console.error(err);
return "";
}
};
// Translate messages to and from the detected language and English
const translateMessage = async (message, detectedLanguage, targetLanguage = 'en') => {
try {
const modelAvailability = await window.Translator.availability({ sourceLanguage: detectedLanguage, targetLanguage });
if (!['available', 'downloadable'].includes(modelAvailability)) {
return message;
}
const translator = await window.Translator.create({ sourceLanguage: detectedLanguage, targetLanguage });
const translatedMessage = await translator.translate(message);
return translatedMessage;
} catch (error) {
return message;
}
}
return { detectLanguage, translateMessage, loadAllModels };
}
export default useService;
市場洞察文章翻譯
「Translator API 非常容易整合到現有的 React 程式碼中。我們選擇採用這項用戶端解決方案,是為了確保客戶和服務專員能快速取得翻譯結果。API 可以在兩秒內翻譯 1,000 個字元的文章。」
—Policybazaar 技術主管 Aman Soni
Policybazaar 的人壽保險業務部門提供大量文章,讓消費者和客戶服務專員掌握市場狀況。
由於印地文是使用者廣泛使用的語言,因此他們試用 Translator API,將文章從英文翻譯成印地文。
他們使用下列指令碼,在網站中新增翻譯功能:
// Initialize the translator, setting source and target languages
var translator = null;
var translatorAvailable = false;
var languageOptionsData = { name: "Hindi", code: "hi" };
var IGNORED_TEXT_NODES = ['RSI', 'NAV'];
function checkForLanguageOptions() {
if (window.Translator) {
translatorAvailable = true;
return window.Translator.create({
sourceLanguage: 'en',
targetLanguage: languageOptionsData.code
}).then(function (createdTranslator) {
translator = createdTranslator;
});
} else {
translatorAvailable = false;
return Promise.resolve();
}
}
/**
* Translate the article content using the Translator API.
* @param {HTMLElement} container - element that holds the article content.
* @return {Promise<string>} A promise that resolves to the container's innerHTML after translation.
*/
function translateArticle(container) {
if (!translatorAvailable) { return Promise.resolve(''); }
var textNodes = getAllTextNodes(container);
var promiseChain = Promise.resolve();
textNodes.forEach(function (element) {
if (IGNORED_TEXT_NODES.indexOf(element.nodeValue) !== -1) return;
var message = element.nodeValue;
promiseChain = promiseChain.then(function () {
return translator.translate(message).then(function (translated) {
element.nodeValue = translated;
}).catch(function (error) {
console.error('Translation error:', error);
});
});
});
return promiseChain.then(function () {
return container.innerHTML;
});
}
透過 Chrome 提供的模型和 API,顧客可以近乎即時地翻譯文章。
JioHotstar 提供動態字幕翻譯功能
JioHotstar 是印度首屈一指的數位串流平台,提供多種語言的電影、電視節目、體育賽事和原創內容。該平台正在探索 Translator API,以提升字幕翻譯品質。
JioHotstar 專為印度使用者設計,他們傾向以當地語言觀看內容。JioHotstar 提供豐富的內容目錄,但要滿足所有使用者的區域語言需求並提升內容觀看體驗,仍是一大挑戰。
平台會使用 Translator API,根據使用者的偏好語言或地理區域,動態將英文字幕翻譯成其他語言。語言選單會提供動態翻譯選項,系統會自動偵測缺少的原始字幕,並從 Chrome 支援的語言中補上。這項功能可提升字幕的使用者體驗,讓更多使用者能存取內容。
系統會根據為每位使用者量身打造的主要清單,檢查瀏覽器是否有現有的語言套件,藉此產生可用的動態語言清單。使用者選取語言後,如果瀏覽器已下載對應的語言套件,系統會立即顯示翻譯文字。否則系統會先下載語音包,再開始翻譯。
使用者選取語言並看到翻譯結果後,即可確認語言包已成功下載。從此以後,所有附上字幕的內容都會以所選語言顯示。這有助於消除使用者的不確定感,否則他們可能會猶豫是否要瀏覽內容,不確定內容是否提供偏好的語言。
下列程式碼範例會初始化及設定翻譯工具。
class SubTitleTranslator {
// Cache translator instances based on source-target language pair, so that we don't create this often for multiple contents
#translatorMap = {};
// Get or create a translator for the language pair
async #createTranslator(sourceLanguage, targetLanguage) {
const key = `${sourceLanguage}-${targetLanguage}`;
const translator = this.#translatorMap[key];
// Check if a translator already exists for a language pair in the map
if (translator) {
return translator;
}
// Check if translation is available
const isAvailable =
(await Translator.availability({ sourceLanguage, targetLanguage })) ===
"available";
if (isAvailable) {
// If available, create a new translator and cache it
this.#translatorMap[key] = await Translator.create({
sourceLanguage,
targetLanguage,
});
return this.#translatorMap[key];
}
return null;
}
// Translate text
async #translateText(text, sourceLanguage, targetLanguage) {
const translator = await this.#createTranslator(
sourceLanguage,
targetLanguage
);
// Returns the given input text if translator is unavailable
if (!translator) {
return text;
}
return await translator.translate(text);
}
// Public method to get a reusable translation function for a specific language pair.
getTranslatorFor(sourceLanguage, targetLanguage) {
return async (text) => {
try {
return this.#translateText(text, sourceLanguage, targetLanguage);
} catch {
return text;
}
};
}
}
接著,他們會使用 Translator API 生成翻譯字幕。
const translatorFactory = new SubTitleTranslator();
/* Accept English input and translate to Tamil.*/
const translateToTamil = translatorFactory.getTranslatorFor('en','ta');
/* Accept English text as input and translate it to Japanese. */
const translateToJapanese = translatorFactory.getTranslatorFor('en','ja');
/* Accept English input and returns English, as `JTA` is not a valid language code. */
const translateToUnknownLanguage = translatorFactory.getTranslatorFor('en','jta');
還有幾項額外函式會更新最終轉譯的字幕。
/* updateSubtitle is the internal function that updates the rendered subtitle. */
translateToTamil('hi').then(result => updateSubtitle(result))
translateToJapanese('hi').then(result => updateSubtitle(result))
translateToUnknownLanguage('hi').then(result => updateSubtitle(result))
最佳做法
雖然 Translator 和 Language Detector API 的用途不同,但有許多通用的最佳做法:
- 對翻譯文字進行品質評估,確保文法和脈絡一致。視情況考慮提供選項,讓使用者對翻譯內容提供意見回饋。
- 提供微調器、載入器或進度列等進度 UI,指出回應能力。舉例來說,Policybazaar 的聊天機器人會顯示輸入指標,表示正在處理使用者的輸入內容。
結論與最佳化建議
您是否正在使用這些 API 建構新項目?歡迎在 X 上的@ChromiumDev 或 LinkedIn 上的 Chromium for Developers 分享您的想法。
資源
- 開始使用 Chrome 的內建 API
- 進一步瞭解 Language Detector API
- 進一步瞭解 Translator API
- 賦予部落客力量:CyberAgent 如何部署內建 AI,提升內容創作體驗
特別銘謝
感謝 Policybazaar 的 Rishabh Mehrotra 和 Aman Soni、JioHotstar 的 Bhuvaneswaran Mohan 和 Ankeet Maini,以及 Alexandra Klepper、Thomas Steiner 和 Kenji Baheux 協助撰寫及審查本文。