软件产品国际化应注意的细节之一
Posted by Admin L in Thinking in Programming & Software on 11-06-2008.
作者:牧山道人
原文地址:https://www.seeksunslowly.com/software-internationalization-1
转载请注明出处,谢谢。
_____________________________________
本文议题为日期、时间、数字及货币等格式的国际化。
“/”、“:”、“,”、“.”出现在格式串中时具有特殊意义,实际输出因 Windows 区域设置(包括具体的格式设置)而异。如在默认的“中文(中国)”区域设置下,以上 4 分隔符实际输出时“/”变为“-”(日期分隔符),其他不变;但在其他区域设置中,如“法语(法国)”,千分位符“,”变为“ ”(非空格,而是法文字符集下的一个字符),小数点“.”变为“,”。其他区域情况不一一列举,总之各区域日期、时间、数字及货币格式是存在一定差异的。
由此引申出两个问题:以上四类资料的显示及读写,下面分别剖析并寻找答案。
** 显示
提供两种常见做法:以软件开发人员所在区域或其惯用的格式显示;以软件用户所在区域之格式显示。显然,将本区域或自己惯用之格式强加于用户身上是不友好的做法,否则 Windows 也没必要搞个区域设定了,以美国人惯用之格式一以贯之即可,微软一定省不少事。所以我们应采用后者,该如何实现呢?非常简单:在格式串中原封不动采用以上分隔符即可——因为他们本就因区域设定而异。
** 读写
这里只说存储,因为读与写互为逆操作,只分析其中之一即可。
同样提供与上文类似的两种常见做法:以软件开发人员所在区域或其惯用的格式存储;以软件用户所在区域之格式存储。存储操作该用哪种好呢?还是后者吗?先来看一种情况:在区域设定为“中文(中国)”的 OS 上以“YYYY/MM/DD”存下日期,实际存入值为“YYYY-MM-DD”(中国默认日期分隔符为“-”),再去“中文(台湾)” OS 上以“YYYY/MM/DD”读取此日期(台湾日期分符默认就是“/”),此时系统要求一个实际存储为“YYYY/MM/DD”之日期,而我们存入的是“YYYY-MM-DD”,结果是此日期不能正常转换/读取。所以,存储时应采用前者。如果直接以“/”、“.”等作分隔符,实际存入之资料仍具有地方特色,更换区域后读取就可能失败,这里有个小技巧——存储时,在“/”、“.”等分隔符前加上转义字符“\”,这样,源串就会按分隔符被原样格式化。如以“YYYY\/MM\/DD”在“中文(中国)” OS 上存储一日期,实际存储资料为“YYYY/MM/DD”,而程序中读取出来后也以“YYYY\/MM\/DD”先作格式化,日期即可还原。这样,不管在哪种区域的 OS 上存储/读取都具有一致的内部格式。问题得到解决。
附:也许很多程序员不认为软件用户会改变区域设定,这种观念的形成可能是因为自己不曾更改便想当然耳。其实这种情况是比较普遍的:软件企业为了更好的为不同区域的最终用户测试产品,很可能同时安装简体中文、繁体中文及英文 Windows;到国外公司上班,使用该区域设定(以前某软件的存档可能不再有效);就算在国内,仍然存在使用非简体中文 OS 的情况,比如广东很多企业就使用繁体中文 OS,某些外资企业甚至使用英文 OS,…… 另外,就算一直使用同一区域设定的用户,也存在不定期按个人偏好手动调整日期、时间、数字及货币格式的情况。所以,作一致的内部数据读取接口是非常必要的,特别是需要面向全球不同国家/地区用户的软件产品。