给卡帕多奇亚青旅做预订页,我把土耳其语日期格式化踩了个遍

上个月接了个小外包:卡帕多奇亚格雷梅一家青旅的预订页,原本只有英语,老板想加土耳其语。技术栈很朴素,Vue 3 + Vite + dayjs,数据是从他那套老 PHP 后台导出的 JSON,大约 400 条房型和档期记录。上线前我在本地跑得好好的,切到 tr 之后日历上冒出一串 31 Aralık 2025 Salı 混着 12/31/2025,同一屏里两种写法,老板截图过来问是不是坏了。

先说我怎么处理的。dayjs 默认 locale 是 en,只 import 语言包不会自动生效,得显式设置,还要处理后台传来的已经是 ISO 字符串的情况:

import dayjs from 'dayjs'
import 'dayjs/locale/tr'

dayjs.locale('tr')

export function fmtDate(input, style = 'long') {
  const d = dayjs(input)
  if (!d.isValid()) return '—'
  return style === 'short' ? d.format('DD.MM.YYYY') : d.format('D MMMM YYYY, dddd')
}

土耳其语的月份名和星期名都是独立词,dayjs 的 tr 包够用,但 dddd 出来是 Salı 这种首字母大写形式,放进句子里会显得突兀,我又加了一个 .toLowerCase() 的分支只给正文用。另外后台有部分字段是 2025-12-31T00:00:00+03:00,直接交给 dayjs 没问题,但我一开始用 new Date() 中转,结果在构建机上时区不是 +03,日期整体偏了一天,房态直接错位。改成全程走 dayjs 并显式 .utcOffset(180) 之后稳定了。

为什么这么绕?因为土耳其语里日期不是「月/日」的思维,口语顺序是「31 Aralık 2025」,短格式本地习惯是 31.12.2025,点号分隔。如果我图省事直接 toLocaleDateString('tr-TR'),浏览器实现差异会让部分安卓 WebView 回退成英文,我实测两台旧机器都翻车了。代价就是自己维护格式串,多写十几行,但可控。

会失效的地方也说清楚:dayjs 的 tr locale 对 Mart、Mayıs 这类月份的首字母处理是固定的,如果老板坚持全小写排版,得自己映射一张表;另外后台有脏数据是 31/12/2025 这种 dd/MM 格式,dayjs 解析会当成非法或错位,我在入口加了一层正则兜底,不符合 ISO 的直接打日志丢给后台修,不在前端猜。

现在页面能跑了,但我一直没想明白一件事:像青旅这种多语言站点,日期到底该跟着界面语言走,还是跟着用户浏览器区域走?你们做土耳其本地化项目时是怎么定这条线的?

0
赞同度 100% · 0 条评论 · 2 阅读

0 条评论

支持 Markdown · 回复会实时推送给对方

还没有评论,写下第一条。