惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Vercel News
Vercel News
The GitHub Blog
The GitHub Blog
博客园 - 【当耐特】
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Recent Announcements
Recent Announcements
D
Docker
GbyAI
GbyAI
酷 壳 – CoolShell
酷 壳 – CoolShell
WordPress大学
WordPress大学
The Cloudflare Blog
雷峰网
雷峰网
A
About on SuperTechFans
小众软件
小众软件
博客园 - Franky
博客园 - 聂微东
F
Full Disclosure
大猫的无限游戏
大猫的无限游戏
C
Check Point Blog
MongoDB | Blog
MongoDB | Blog
G
Google Developers Blog
Microsoft Azure Blog
Microsoft Azure Blog
U
Unit 42
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
V
V2EX
Engineering at Meta
Engineering at Meta
宝玉的分享
宝玉的分享
aimingoo的专栏
aimingoo的专栏
量子位
P
Proofpoint News Feed
Hugging Face - Blog
Hugging Face - Blog
博客园_首页
罗磊的独立博客
Martin Fowler
Martin Fowler
D
DataBreaches.Net
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
S
Secure Thoughts
Project Zero
Project Zero
L
LangChain Blog
阮一峰的网络日志
阮一峰的网络日志
C
Cybersecurity and Infrastructure Security Agency CISA
T
Tailwind CSS Blog
S
Schneier on Security
Blog — PlanetScale
Blog — PlanetScale
The Hacker News
The Hacker News
Spread Privacy
Spread Privacy
Security Latest
Security Latest
NISL@THU
NISL@THU
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
C
CXSECURITY Database RSS Feed - CXSecurity.com
J
Java Code Geeks

HaoUp's Blog

ChatGPT语音迎来大升级:GPT-Live能边听边说,复杂问题交给后台模型处理 iPhone 照片误删找回攻略:有 iCloud 就能试,限 40 天内(附流程) 谈谈 Apple 27 系统:新鲜,也有点折腾 ChatGPT 生图:一键输出专业分层 PSD 源文件 关掉路由器 DHCP,用 Surge 开出“一机一网”的网络 Codex对话经常连续多次Reconnecting? 与 Codex 共舞数月:从入门到离不开全部功能体验感受 DeepSeek-V4 正式发布:教你如何 CC Switch 极速配置与无缝切换 Codex 居然可以控制我的电脑了! 新国标充电宝,又贵又歪 此帐户不符合 Google AI 计划的资格怎么办? 这工具吹爆:CompressO免费、离线、无广告,视频一拖就瘦身! 终端党狂喜!这款 AI 编程工具不花一分钱,还能把代码留给自己 全网炸锅!Claude Code Cli内部核心代码全部流出 Google Stitch 2026深度解析:从Vibe Design到Voice Canvas,免费AI设计工具如何重塑创意流程 QClaw深度体验:把电脑装进微信,基于 OpenClaw 的全能远程 AI 助手 Orbit —— 改善 macOS 应用切换与文件流转的“环形中枢” Deck一款兼顾原生、隐私的现代macOS剪贴板管理器工具 告别PS修图!iOS神器「超级制图」上手体验:AI无痕改字,一键修改图片文字 年轻人的第一台 Mac?一文看懂全新 MacBook Neo 用 Nugget 安装 iPhone/iPad 动态壁纸 Mac总是弹窗提示更新?2026 最新“养老”指南 Halo站点维护插件(Site Maintenance)使用与配置指南 告别聊天框OpenAI Codex App上手初体验
前端无侵入式翻译方案
HaoUp · 2026-02-07 · via HaoUp's Blog

前言

单纯引入 translate.js 还需要用户手动点击切换,体验不够极致。我们可以通过浏览器原生的navigator.language接口,在页面加载之初就判断用户所在的“语言时区”,自动执行翻译指令。

核心流程

translate.js 工作逻辑不像传统的 SSR(服务端渲染),它更像是一个勤劳的粉刷匠。为了理解它的核心机制,我整理了以下伪代码,并利用高亮标记了关键步骤:

// translate.js 核心逻辑简化版
var translate = {
  execute: function() {
    // 1. 递归扫描 DOM 树,提取所有文本节点
    var nodes = this.getTextNodes(document.body); // [!code highlight]

    var textToTranslate = [];
    
    nodes.forEach(node => {
      // 2. 核心优化:优先读取本地缓存 (LocalStorage/IndexedDB)
      var cache = this.storage.get(node.text); // [!code focus]
      
      if(cache) {
        // [!code ++] 命中缓存:直接替换 DOM,0 网络请求
        node.replace(cache); 
      } else {
        // [!code --] 未命中:不做处理,加入待翻译队列
        textToTranslate.push(node.text);
      }
    });

    // 3. 队列合并打包,发送请求
    if(textToTranslate.length > 0){
      this.api.post(textToTranslate, (result) => {
        this.render(result); // 批量渲染
        this.storage.save(result); // 写入缓存
      });
    }
  }
}
  • DOM 扫描 (getTextNodes):它智能避开了 <script> 和 <style> 标签,只提取 nodeType === 3 的文本,防止翻译代码导致页面崩溃。

  • 缓存机制 (storage.get):这是它速度快的核心。通过 Hash 索引存储翻译结果,第二次访问时直接从本地读取,延迟几乎为零。

进阶玩法

光有翻译库还不够,我们不能让用户进来全是中文,还得手动找翻译按钮。最好的体验是用户无感,页面主动适应,利用浏览器原生的navigator.language API,我们可以获取用户的首选语言,并配合 translate.js 实现自动切换。

包含了大陆、港澳台、海外的三级分流逻辑:

function autoSwitchLanguage() {
  // 1. 获取浏览器语言 (兼容性处理)并转为小写
  let userLang = (navigator.language || navigator.userLanguage).toLowerCase(); // [!code highlight]
  
  // 2. 默认兜底策略:非中文地区全部设为英文
  let targetLang = 'english'; 
  let htmlLang = 'en';

  // 3. 智能判断逻辑
  // [!code focus:12] 聚焦核心判断区域
  if (userLang.startsWith('zh')) {
    // 命中中文语系
    if (userLang === 'zh-cn') {
      // 大陆地区 -> 保持简体(无需翻译)
      targetLang = 'chinese_simplified';
      htmlLang = 'zh-CN';
    } else {
      // 港澳台 (zh-hk, zh-tw, zh-mo) -> 切换繁体
      targetLang = 'chinese_traditional';
      htmlLang = 'zh-TW'; 
    }
  }

  // 4. 修改 HTML 标签属性 (对 SEO 友好)
  // [!code warning] 注意:这一步对搜索引擎识别非常重要
  document.documentElement.lang = htmlLang;

  // 5. 调用 translate.js 执行切换
  if (translate.language.getLocal() !== targetLang) {
    translate.changeLanguage(targetLang);
    console.log(`检测到环境: ${userLang}, 已切换至: ${targetLang}`);
  }
}

代码深度解析

  • startsWith('zh'):利用字符串匹配,通过这一行代码就圈定了所有华人用户,避免了列举 zh-sg, zh-my 等复杂情况。

  • document.documentElement.lang:很多翻译方案只改了文字,没改 lang 属性。加上这一行,可以让浏览器自带的翻译工具知道页面已经变了,避免重复提示翻译,同时利于 Google/Bing 的 SEO 收录。

效果对比与验证

为了验证这套逻辑的健壮性,引入前后的变化:

<!-- 原始状态 (默认) -->
<html lang="zh-CN">
  <body>你好,世界</body>
</html>

<!-- ❌ 错误示范:仅翻译文字,不改 lang -->
<html lang="zh-CN"> <!-- [!code error] 浏览器会困惑:明明写着zh-CN,内容却是英文 -->
  <body>Hello, World</body>
</html>

<!-- ✅ 正确示范 (脚本执行后) -->
<html lang="en"> <!-- [!code ++] 属性已修正,SEO 友好 -->
  <body>Hello, World</body>
</html>

实战测试

为了确保自动嗅探在全球各地都生效,我没有只用VPN简单测试,而是使用了比特浏览器进行了指纹环境模拟。

  1. 模拟美国环境 (US-IP / en-US): 页面加载瞬间,targetLang 锁定为 english,整站自动转为英文。

  2. 模拟香港环境 (HK-IP / zh-HK): 脚本精准识别非大陆中文区,自动切换为繁体中文,符合当地阅读习惯。

  3. 模拟上海环境 (CN-IP / zh-CN): 保持原生简体,不触发任何翻译 API 请求,节省资源。

结语

通过 translate.js 的轻量级翻译能力,配合navigator.language的精准分流,我们仅仅用了不到 50 行代码,就解决了一个中型项目的国际化难题。

这种方案的优势在于:

  1. 极速部署: 前端独立完成,无需后端改库。

  2. 体验极佳: 配合Hash缓存和预加载,几乎没有“闪烁感”。

  3. 成本低廉: 相比于昂贵的Google Translate API,这种方案对于个人站长简直是福音。

项目地址:https://github.com/xnx3/translate