本地化日期模式实战:Timeline Visualizer如何避免9种语言日期渲染崩溃
2026/9/18 10:03:17 网站建设 项目流程

本地化日期模式实战:Timeline Visualizer如何避免9种语言日期渲染崩溃

【免费下载链接】google-timeline-visualizerVisualize your year in travel using your Google Location History (Timeline) data项目地址: https://gitcode.com/GitHub_Trending/go/google-timeline-visualizer

Timeline Visualizer是一款把你的 Google 位置历史(Timeline)数据变成旅行回顾视频的开源工具。它支持英、日、韩、简中、繁中、西、法、德、葡、印尼、越南共 11 种界面语言,而每一帧视频画面上都会绘制当天的日期。听起来平平无奇,但在多语言 App 里,"把日期画出来"恰恰是最容易崩溃的一环——本项目用一套本地化日期模式(localized date pattern)方案,成功让所有语言的日期渲染零崩溃。

背景:视频里的日期从哪来?

Timeline Visualizer 渲染视频时,会在画面信息卡片上画出"日期 · 距离",例如英语是 "August 2025 · 12 km",日文则是 "2025年8月 · 12 km"。

日期不是硬编码的字符串,而是由一个日期模式(pattern)驱动:

  • 英语模式是MMMM yyyy(完整月份 + 四位年份)
  • 日文、简中、繁中用yyyy年M月
  • 韩文用yyyy년 M월

这些模式存放在各语言的 strings.xml 资源文件中,由 TimelinePainter.kt 在逐帧绘制时调用格式化器渲染。问题在于:日期模式本身是一段"准代码",里面y代表年、M代表月、d代表日——它不是给翻译看的人类语言。

一次翻译引发的崩溃 💥

灾难就这样发生了:

  • 西语、法语、葡语翻译把yyyy的四个y"翻译"成了aaaa
  • 德语翻译则把它变成了jjjj

a在日期模式里是"上午/下午"的保留符号,j根本不是合法符号。格式化器在第一帧渲染时(此时跑在主线程上)直接抛出IllegalArgumentException,App 当场崩溃。

结果就是:西班牙、法国、葡萄牙、德国的用户,Timeline 导入刚成功、视频刚开始播放,App 就闪退了。

三重防线:日期渲染不再崩溃 🛡️

Timeline Visualizer 的修复不是打一个补丁,而是从"预防、兜底、校验"三个层面设防。

1️⃣ 预防:标记为不可翻译

在默认资源 values/strings.xml 中,日期模式被显式标记为translatable="false",让翻译工具直接跳过它,从源头杜绝"好心翻译"。

2️⃣ 兜底:运行时自动回退默认模式

核心防御在 RenderText.kt。即便某种语言的模式是坏的(比如历史遗留的MMMM aaaa),渲染时也不会崩溃,而是静默回退到默认的MMMM yyyy模式,只是日期显示为英文月份,播放绝不中断。对应的单元测试在 RenderTextTest.kt 中,专门复现了aaaa(葡语)和jjjj(德语)两种事故场景。

3️⃣ 校验:守卫测试扫描全部语言文件

最关键的一道防线是 LocalizedDatePatternsTest.kt。它会在 CI 中自动扫描每一个values-xx/strings.xml,对日期模式做三重检查:

  • ✅ 模式能否被DateTimeFormatter成功编译(编译不过直接报错)
  • ✅ 格式化结果里必须包含年份(对比渲染2025年与不同月份的结果)
  • ✅ 默认资源中必须保留translatable="false"标记

任何翻译者提交一个"看起来像翻译"的模式(比如把yyyy改成aaaa),在合并前就会被测试拦截,根本轮不到用户看到崩溃。

各语言日期模式一览

语言模式渲染示例(2025年8月19日)
英语 / 印尼语 / 越南语MMMM yyyyAugust 2025
日语yyyy年M月2025年8月
简体中文 / 繁体中文yyyy年M月2025年8月
韩语yyyy년 M월2025년 8월

语言清单与归一化逻辑定义在 AppLanguage.kt,其中还处理了zh-Hans/zh-Hantpt-BR、印尼语旧代码inid等常见地区标签陷阱。

小结:多语言 App 的日期渲染该怎么做?

这个案例对所有做国际化的项目都有借鉴意义:

  1. 模式即代码——日期模式、数字格式这类"伪翻译"字符串,务必标记translatable="false",别让机器翻译碰它们
  2. 永远留一条回退路径——用户输入或资源出问题时,优雅降级比崩溃体验好一百倍
  3. 用测试守住资源文件——把"每种语言的格式串都能编译并渲染出年月"写成自动守卫测试,崩溃就挡在 CI 里

Timeline Visualizer 正是靠这三重防线,让 9 种以上语言的日期渲染从"一帧就闪退"变成了"永远画得出来"。🎬

【免费下载链接】google-timeline-visualizerVisualize your year in travel using your Google Location History (Timeline) data项目地址: https://gitcode.com/GitHub_Trending/go/google-timeline-visualizer

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询