Policybazaar 和 JioHotstar 如何使用 Translator API 和 Language Detector API 打造多语言体验

Swetha Gopalakrishnan
Swetha Gopalakrishnan
Saurabh Rajpal
Saurabh Rajpal

发布时间:2025 年 5 月 8 日

借助 Translator APILanguage Detector API,让您的内容面向全球受众群体。借助 Language Detector API,您可以确定输入内容所用的语言;借助 Translator API,您可以将检测到的语言翻译成另一种语言。这两种 API 均在客户端运行,并内置于 Chrome 的 AI 模型,这意味着它们快速、安全且免费使用,因为没有服务器费用。

API 说明类视频 Web 扩展程序 Chrome 状态 意向
Translator API MDN Chrome 138 Chrome 138 视图 Intent to Ship
Language Detector API MDN Chrome 138 Chrome 138 视图 Intent to Ship

了解两家大型国际企业 Policybazaar 和 JioHotstar 如何使用这些内置 API 并从中获益。

Policybazaar 的多语言客户服务

Policybazaar 是印度最大的保险平台,拥有超过 9, 700 万注册客户。印度语言种类繁多,全国各地有多种语言和方言。

为了支持客户的这种语言多样性,Policybazaar 以两种方式实现了 Translator 和 Language Detector API:随时提供保险帮助,并以客户的首选语言提供包含市场洞见的文章。

借助 Finova AI 获得保险方面的帮助

保险本身就是一种个人产品,敏感信息是制定具体保单的基础。Policybazaar 的客户经常寻求有关如何选择方案或方案支持哪些内容的指导。虽然 Policybazaar 的员工会说多种语言,但该公司需要一种可在不同时区和非工作时间使用的解决方案。因此,Policybazaar 构建了 Finova AI,可根据客户偏好的语言提供量身定制的保险帮助。

用户可以使用自己的母语与 Finova 聊天机器人对话。

“Chrome 的语言检测器和翻译器 API 能够满足客户多样化的语言需求,从而帮助我们更顺畅地提供保险协助服务。因此,用户可以使用自己喜欢的印度语进行交流,而不会出现明显的延迟。”

- Rishabh Mehrotra,Policybazaar 人寿保险业务部门设计主管

该团队选择了客户端 AI,即在浏览器中或用户设备上进行的推理。与服务器托管型 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 个字符的文章。”

- Aman Soni,Policybazaar 技术主管

Policybazaar 的人寿保险业务部门提供了大量文章,可让客户和客户支持代理及时了解市场状况。

印地语是其用户广泛使用的语言,因此他们试用了 Translator API,以便按需将文章从英语翻译为印地语。

Policybazaar 可在英语和印地语之间实现顺畅快速的翻译。

为了向其网站添加翻译功能,他们使用了以下脚本:

// 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 API 和 Language Detector API 的这些用途各不相同,但仍有许多共同的最佳实践:

  • 对翻译后的文本进行质量评估,以确保语法和上下文保持一致。考虑为用户提供用于就翻译提供反馈的选项(如果合适)。
  • 提供一个进度界面(例如旋转器、加载器或进度条)来指示响应情况。例如,Policybazaar 使用了聊天机器人的输入指示器来表明它正在处理用户的输入内容。

结论和建议

您是否正在使用这些 API 构建新内容?欢迎通过 X 上的@ChromiumDevLinkedIn 上的 Chromium for Developers 与我们分享。

资源

致谢

感谢来自 Policybazaar 的 Rishabh MehrotraAman Soni、来自 JioHotstar 的 Bhuvaneswaran MohanAnkeet MainiAlexandra KlepperThomas SteinerKenji Baheux 协助撰写和审核本文。