这是一个做入境游的客户,主要接日本和英语国家的团。网站要中、英、日三语,行程页大概 60 个,每页有标题、简介、行程天数、出发日期、价格、注意事项六块内容。听着不复杂,做起来最费劲的不是翻译,是日期和货币。
结构先定死
我们没有给每种语言各建一套页面。数据库里行程主表存公共字段(天数、价格、出发城市 id),另开一张翻译表,按 language_code 加 item_id 存文本,三个语言就是三行。后台加一条行程,编辑填三次文字,不用复制整页。
语言放 URL 第一段:/ja/tours/12、/en/tours/12。Nginx 里一条 rewrite 就够,不用为每种语言配一套路由。
日期格式吵了两轮
日文站客户要求写成「2026年11月5日」,英文站要「05 Nov 2026」,中文站「2026-11-05」。同一趟团期,三个页面显示三样。一开始想用 PHP 的 strftime 按 locale 切,结果服务器上 locale 不全,日文环境没装,直接退回英文。
后来改成自己写了个小函数:日期字段在库里统一存 DATE 类型,输出时按 language_code 查一张格式表,三个模板字符串。代码不到二十行,比折腾系统 locale 稳。
价格不换算,但格式要变
客户明确说页面只显示人民币,不自动换汇,怕汇率对不上。但英文和日文站的数字分隔符、货币符号位置不一样:¥12,800 和 12,800 元。这个也是格式表的一部分。另外日文站的「注意事项」普遍比中文长一截,卡片高度不固定,我们把列表改成 flex 换行,没写死高度。
翻译回填那两周
内容不是我们翻的,客户找了译员。后台给了个批量导入,CSV 三列:item_id、language_code、text。第一版导入脚本没处理换行,译员在单元格里敲了回车,一行拆成两行,2000 多行数据错了 37 行。改成用 PHP 的 fgetcsv 并把 enclosure 设对之后才准。那天我们把导进来的数据全表核了一遍,按 item_id 排序打印出来,一页页对。
上线后
切语言的下拉放在右上角,用 cookie 记住选择,下次直接进对应语种。没做按浏览器语言自动跳,客户说团队里有人浏览器是英文但想看中文站,别自作主张。
站点现在还在跑。后来加过签证申请表单,是另一回事了。

