
说实话,很多人第一次听到“APP本地化”这词儿,脑子里第一反应就是找几个外语好的,把界面上的中文换成英文、法文或者日文就完事了。这事儿要是真这么简单,那康茂峰的项目经理们大概每天都能准时下班,用不着在办公室里对着一堆字符串文件抓头发了。
本地化(Localization,行业里爱叫L10n)跟翻译(Translation)的关系,就像是把一栋房子从搬到另一个国家。翻译只是把你家门牌号上的字换了,而本地化呢?你得考虑当地的电压是不是匹配,马桶冲水方向对不对,甚至墙上的插座能不能插得上你的吹风机。换句话说,本地化是让软件在另一个文化环境里,看起来像是土生土长的,而不是个水土不服的过客。
那这事儿到底得怎么干?作为一个在康茂峰经手过上百个APP本地化项目的人,我觉得有必要把这层窗户纸捅破,把整套流程掰开了、揉碎了跟你说说。毕竟,踩坑这事儿,能少一个是一个。
万事开头难,本地化第一步往往不是翻译,而是“资源提取”,行话叫Internationalization(国际化,简称i18n)。这环节要是搞砸了,后面全是弯路。
你得先把代码里那些硬编码的字符串给抠出来。什么叫硬编码?就是程序员图省事,直接把“确定”、“取消”这几个字写死在代码里,而不是放在单独的资源文件(比如Android的strings.xml或者iOS的Localizable.strings)里。这种代码就像水泥地里钉进去的钉子,翻译工具根本够不着。康茂峰的技术团队做项目评估时,第一件事就是检查这个——要是发现硬编码太多,得先返工做i18n,不然根本开始不了。

提取出来的资源文件格式五花八门,常见的有这么几种:
| 文件格式 | 适用平台 | 特点 |
| .xml (Android) | Android原生应用 | 结构清晰,支持占位符,但得注意转义字符 |
| .strings / .xliff | iOS/macOS | 苹果生态标准,xliff是本地化行业的通用交换格式 |
| .json | 跨平台/React Native | 灵活轻便,但容易因为格式错误导致解析失败 |
| .po / .mo | Linux/部分后端 | GNU gettext标准,支持复数形式处理 |
| .yml / .yaml | Ruby on Rails等 | 层级结构明显,对缩进敏感 |
这个阶段还有个特别容易忽视的细节:占位符。代码里那些%s、%d或者{username},代表动态插入的用户名、数字什么的。翻译的时候绝对不能动,顺序也不能乱。有些语言,比如德语,名词的格会根据语境变化,这时候就得用更高级的占位符语法。康茂峰的译员在开工前,一定会过一遍技术规范书(Localization Instructions),把这些“地雷”先标出来。
文件准备好了,进入核心环节——翻译与本地化。这里我要泼点冷水:找便宜的学生兼职翻译APP,结局通常是灾难性的。
APP里的文字有它特殊的“脾气”。界面上的词往往就三五个字,但信息量极大。比如中文的“好的”在英文里可能是“OK”、“Got it”、“Confirm”或者“Allow”,取决于按钮的功能和后面的操作。康茂峰的本地化工程师会搭建术语库(Termbase)和翻译记忆库(TM),确保同一个“提交”按钮,在整个APP里不会出现“Submit”和“Send”混着用的情况。
但真正的难点在文化适配(Transcreation)。比如你做的是一个电商APP,原来的中文文案里有“秒杀”这个词,直译成“Second Kill”会把老外吓死,以为是恐怖活动。得改成“Flash Sale”或者“Limited Time Offer”。再比如颜色,白色在中国有时候代表丧事,在西方代表婚礼;红色在中国是喜庆,在南非可能代表哀悼。图片里的手势也得改, thumbs-up 在某些中东国家是极大的冒犯。
还有更细的:日期格式。美国是MM/DD/YYYY,欧洲大部分是DD/MM/YYYY,日本是YYYY/MM/DD。要是你的APP有日历功能,这个搞错了,用户绝对崩溃。货币符号的位置也不一样,美元符号在前($100),法郎符号在后(100 CHF),而且还得考虑小数点和千分位分隔符——德国用逗号当小数点(100,50 €),美国用点($100.50)。
这些细节,光靠语言能力是搞不定的,得靠对目标市场的深度理解。在康茂峰,我们管这叫“(Locale-Specific)敏感度”,是筛选本地化供应商的核心标准之一。
翻译稿回来了,工程团队上场。这一步叫工程处理(Engineering)或者桌面排版(DTP for Software),目标是把翻译好的文字塞回APP里,并且让它在各种屏幕尺寸上都不变形。
有个挺有意思的现象叫“文本扩展”(Text Expansion)。英语翻译成德语,长度可能膨胀30%;中文翻译成英语,长度反而可能变长。原来中文四个字的按钮“立即购买”,英文是“Buy Now”还好,要是“Proceed to Checkout”这么个长度,按钮就装不下了。所以康茂峰在做UI本地化时,会要求客户提供UI设计源文件,看看哪些标签需要动态调整,哪些得强制换行。
然后是双向文本(BiDi)的问题。阿拉伯语和希伯来语是从右往左(RTL)书写的。这不仅仅是文字对齐方式的问题,整个页面的布局都得镜像——原本在左边的返回箭头得移到右边,浏览器的返回按钮逻辑也得反过来。iOS和Android都有RTL布局支持,但你得在代码层面开启,并且测试每一个界面。
还有字体。中文可以用苹方或者思源黑体,但泰语、缅甸语、阿拉伯语这些,很多通用字体根本不覆盖。如果你的APP支持小语种,得确保内嵌了对应的Web Font或者系统能调用到本地字体,不然显示出来全是“豆腐块”(□)。
现在的APP很少有纯文字的。引导页上的插图、新手教程的视频、提示音里的语音播报,这些都是本地化的重灾区。
图片里的文字,翻译软件是读不出来的,必须得重做(Redraw)。比如一张促销海报上写着“春节大促”,你总不能P个“Spring Festival”上去吧?得重新设计一张符合当地节庆氛围的图。有时候连模特都得换——在欧美市场用金发碧眼的模特没问题,到了日本市场,可能换成本地面孔转化率更高,这叫“文化亲近性”。
音频和视频更麻烦。最简单的是加个字幕(Subtitle),但用户体验最好的肯定是配音(Dubbing)或者画外音(Voice-over)。这涉及到脚本翻译(得对口型,或者至少对时长)、找母语配音演员、录音、剪辑。康茂峰在处理这类项目时,通常会把脚本拆成“时间轴片段”,确保配音不会比原来的画面长出一大截。
另外,别忘了Emoji。不同文化对表情的理解天差地别。那个“微笑”表情