摘要:本文说明了为国际化用户开发 Web 站点时支持多种语言和货币的最佳方法。
目录
简介
本文说明了为国际化用户开发 Web 站点时支持多种语言和货币的最佳方法。您的目标应该是使您的客户在任何时候都很容易更改语言或货币,而不会丢失上下文(也就是说,不用重新定位至包含不同内容的另一页)。有几种方法可实现多种语言和货币。您可以根据您的喜好以及工程限制来选择其中一种。
示例站点 Sweet Forgiveness 演示了本文所述的原理,该站点位于 http://www.microsoft.com/commerceserver/default.htm(英文)。Sweet Forgiveness 站点是一个多语言站点,并且它支持多种货币。它混合了本文所述的多种方法。
使用多种语言
大多数公司将由于能为客户提供用来与站点交互的语言选择而得益。但是,很多公司不是忽略了这个问题,就是通过部署其站点的多个版本来解决这个问题。例如,Amazon.com 提供了其站点的多个版本(包括 Amazon.de 和 Amazon.nl)。
如果一个站点的所有版本可以同时更新,那么多个版本的并存将不成为问题。但大多数情况下,每一版本都必须分别更新,这会导致版本间有很大差别。例如,Amazon.com 英语版的功能就比德语版和荷兰语版丰富得多。如此显著的区别会使项目组产生混淆,并且使站点不易管理。本节将讨论创建单一的多语言站点的方法。
语言相关字符串
电子商务站点中使用了两种语言相关字符串:
- 产品信息
- 站点信息(包括广告和折扣说明中的 HTML 内容)
产品信息
“产品信息”字符串是属于产品的语言相关属性的集合,例如名称和说明。产品信息应该存储在产品目录中,并且应该能用站点支持的所有语言进行显示,因为一个多语言产品目录比各种语言的独立目录更易于管理。
要管理语言相关属性,可简单的调整每个属性的代码,以标识此属性显示时所使用的语言。例如,您的产品可能包含一个 short_description 属性,该属性需要以英语、法语和荷兰语显示。要实现此目标,您可以将 short_description 重命名为 short_description_en 作为英语版本,重命名为 short_description_fr 作为法语版本,而重命名为 short_description_nl 作为荷兰语版本。当页面显示产品说明时,您可以调整代码以选择包含语言代码(en 表示英语,fr 表示法语,nl 表示荷兰语)的 short_description 属性。语言代码可以是用户输入的参数,也可以是用户配置文件的一个属性。
站点信息
站点信息是站点必须显示的字符串的集合,例如“Product of the Week”、“Search”和“OK”。您可以将整套可显示字符串以不同语言存储在数据库或可扩展标记语言 (XML) 文件中。选择 XML 比选择 HTML 更好,因为它更容易迁移。例如,如有必要,您可以通过电子邮件将 XML 文件发送给翻译人员。有关如何使用 XML 文件以不同语言存储可显示字符串的示例,请参阅 Sweet Forgiveness 站点上的 Rc.xml 文件,该文件的所有站点信息均采用字符串的形式。
当应用程序启动时,Global.asa 文件读取 XML 文件。字符串存储在 Microsoft® Commerce Server 2000 MessageManager 对象中,该对象具有应用程序作用域,这样就确保 Web 领域中的每台服务器对每种语言都有一份自己的字符串集合。
当必须在站点上显示一个字符串时,可用以下方法调用从 MessageManager 对象检索该字符串:
mscsMessageManager.GetMessage(sStringName, sLanguage)
要加快网页的执行,您可以将经常显示的字符串(如菜单栏,它是单个字符串的连接)存储在 CacheManager 对象中以供日后检索。当您这么做时,MessageManager 对象只需要对它们查找一次。
您也可以对其他可显示的字符串使用同样的技术,例如对在 Commerce Server Business Desk 中不能更改的折扣说明。
缓存
Commerce Server Solution Sites 广泛使用了 CacheManager 对象。实质上,CacheManager 对象是一种扩展的 Dictionary 对象,它以名称/数值对的方式存储字符串。
如果您检查 Solution Site 代码,将会看到名称/数值对的名称部分被称为缓存关键字。如果您决定要实现多语言页面,则缓存关键字的生成必须是针对特定语言的。您可用以下代码完成此操作:
sCacheKey = sCatalogName & sCategoryName & CStr(iPageNumber) & sLanguageCode
使用特定于语言的缓存关键字生成方法使语言代码成为缓存关键字的一部分,这样 CacheManager 对象就可以检测要显示的语言。
选择语言
一种经常用于欧洲站点的基本站点方案是:在用户第一次访问站点时为其提供语言选择。用户必须单击一个链接或按钮,以便按选定的语言来访问该站点。然后,此选择作为属性存储在用户配置文件中,或存储在用户计算机的 Cookie 中,使用户再次访问该站点时能立即显示正确的语言。
某些站点使用另一种方案:它们通过从 Internet 协议 (IP) 地址查找国家/地区扩展来推测用户的母语。例如,如果某用户从 proxy.myprovider.co.uk(基于英国的提供商)上网,则这些站点假设该用户讲英语。这通常是一种方便的策略,但不一定最准确。例如,许多出国旅游的旅游者从 cybercafé 浏览 Web。很多其他用户从 .com、.net 或类似的地址浏览,而它们与特定的语言没有任何明显的对应关系。
在第三种方案中,对于使用 Microsoft® Internet Explorer 的用户,站点可以检查默认的语言设置。这种方案的缺点是许多用户安装了英语版的 Internet Explorer 并且没有更改语言设置,即使英语不是他们的母语。此方案中也会出现 cybercafé 问题。如果 cybercafé 用 Internet Explorer 设置本地语言参数,则使用此方案的站点将假设从此位置登录的旅游者想使用本地语言而不是母语查看网页。
对于大多数站点,最好的解决方案可能是第一种方案:让用户选择语言然后保存在用户的配置文件中。下次无论用户从什么位置登录,站点都会自动切换至用户选择的语言。
更改语言
多语言站点应该使用户在每一页上都可以从一种语言更改为另一种语言。Sweet Forgiveness 示例站点使用一个下拉菜单,用户在此站点的任意页面上都可以从这个下拉菜单中选择新的语言。有些站点显示国旗图标,用户可以单击图标以选择相应的语言。
某些多语言站点仅允许在站点主页上更改语言,这意味着用户必须从站点的其他位置返回主页以选择新的语言。这种方法容易实现,但与允许用户在任何页面更改语言以保留正在执行的操作的上下文相比,对用户不够友好。
有四种方法可对语言上下文进行编码:
- 使用客户端 Cookie 来存储当前语言代码。
- 在 URL 中对语言代码进行编码。
- 在用户配置文件中存储所选择的语言。
- 使用预先生成的页面。
所使用的方法取决于工程的限制和开发人员的喜好。
对语言代码使用客户端 Cookie
如果允许的话,使用客户端 Cookie 是对语言上下文进行编码的最简单方法。要进行此操作,您需要将语言代码(en、fr、nl 等等)存储在 Cookie 中,并在每个显示语言相关字符串的页面中读取该 Cookie。您也可以通过将 Cookie 的到期期限设置得非常长(例如到 2100 年 1 月 1 日)使其持久,这样该站点就能始终知道用户的语言(假设用户同意使 Cookie 持久)。
最好仅在您能够控制是否接受 Cookie 的情况下使用此技术;例如,已验证概念或公司内部的工程。如果某个用户的浏览器不支持 Cookie(例如蜂窝电话中的微型浏览器),就不能使用这种技术。
在 URL 中对语言代码进行编码
您可以将语言代码嵌入 URL 中,这与 Solution Sites 生成会话 ID 标签的方法相似。这意味着需要修改 GenerateURL 函数以将语言代码添加到您创建的每一个链接上,从而使站点显示正确的语言。例如,您必须对每个链接调用 GenerateURL,从而将 http://commercesitename.tld/mypage.asp 变成 http://commercesitename.tld/mypage.asp?lang=nl。然后每一页都能够简单地读取语言参数。
注意: 您不能用静态 HTML 页面对语言代码进行编码,因为 HTML 页面不能将任何输入参数传递给其他页面。
在用户配置文件中存储所选择的语言
对所选择的语言进行编码的另一种方法是在用户配置文件中保留用户语言。这样做需要您在用户配置文件中添加 language 属性。以后,如果用户更改语言,您必须更新此属性。这是存储所选择语言的节省开销的有效方法,因为涉及的性能开销仅仅是检索和更新配置文件。
使用预先生成的页面
如果您的站点大部分是静态 HTML 页面,则您可以选择使用预先生成的页面对站点语言进行编码。预先生成的页面不需要向其他页面传递语言标识符,因为页面的上下文(页面所在的目录)提供了这种能力。预先生成的页面不必提供语言信息就能链接至其他页面。另外,预先生成的页面不需要读取 Cookie、URL 参数或用户配置文件,以确定显示哪种语言。
要预先生成支持的所有语言的页面,您可以将所有页面放在 /source 目录下,并将可以预先生成的字符串放在 Active Server Pages (ASP) 代码中用分隔符号分隔。例如,您可以如下指定 Search 按钮:
<INPUT TYPE=SUBMIT VALUE="[[=Search]]">
在这段代码中,[[=Search]]
是要翻译的词语的助记符。您必须编写一个页面生成器,读取 /source 目录下的所有页面,通过使用 MessageManager 对象来查找分隔的助记符,翻译分隔的助记符,然后将翻译的页面保存在特定的语言目录下。使用支持英语、法语和荷兰语的站点作为示例,您可以从 /source 目录下读取页面,并在 /en、/fr 和 /nl 目录下生成页面。您可以使此进程每天自动运行一次或两次,或者当您更新站点时运行此进程。
预先生成页面的方法可以节省运行时的时间,并且不依赖于 CacheManager 对象。另外,如果您的站点有大量静态页面(这些页面除了调用 MessageManager 对象以查找字符串以外,不执行任何其他逻辑操作),使用此方法可以显著地提高性能,因为现在那些页面是真正的静态 HTML 页面,而不是 ASP 页面。将那些静态页面放在仅用于静态内容的专用服务器上,能进一步提高性能。
使用多种货币
有关支持多种货币的问题与有关支持多种语言的问题相似,但比它更容易解决。您可以支持多种货币并让用户在其间来回切换,也可以同时以所有货币显示价格。对于某些电子商务站点,同时以多种货币显示价格会很有用;但对于大多数站点,特别是企业对消费者 (B2C) 站点,第一种方法更简单一些。
产品价格
如果可能,您应该仅以一种货币(“参考”货币)来存储产品价格信息。例如,您先以美元或欧元来存储价格,然后在需要时以其他货币实时重新计算价格。要基于参考货币来重新计算价格,您需要一个汇率表来确定其他货币与参考货币的汇率。汇率表应该包含以下字段:
- 货币符号
- 国际标准化组织 (ISO) 的货币代码
- 汇率
- 显示格式
下例显示了汇率表的一种形式。
货币符号 | ISO 货币代码 | 汇率 | 显示格式 |
$ | USD(美元) | 1.0 | ####.## |
£ | UKP(英镑) | 1.2 | ####.## |
F | BEF(比利时法郎) | 0.023 | ######,00 |
€ | EUR(欧元) | 0.9 | ####.## |
当您的站点显示一个价格时,它根据汇率重新计算该价格,并以相关的货币符号和显示格式来显示。
要点: 如果您存储搜索结果并用 CacheManager 对象产生详细的页面,则必须在缓存关键字中包含货币。否则,当您试图以其他货币显示价格时,您会检索到错误的结果。
对不同区域使用不同价格
有些工程要求对不同区域使用不同价格。例如,某种汽车在德国开价 100,000 德国马克,但在美国仅开价 40,000 美元。但这是特定区域的价格,而不是特定货币的价格。生活在美国的德国客户无论使用德国马克还是美元,为该车支付的价钱是一样的。
通常,对不同区域使用不同价格需要在产品属性中明确显示价格,因此您必须在您的目录中保留多种价格。要完成此操作,您可以使用 Business Desk 中的 Catalog Editor 模块来创建自定义目录,或者向目录架构中添加特定区域的价格属性。目的在于创建客户感兴趣的、有吸引力的、面向市场的价格。例如,简单地将项目的美国报价 $9.95 与转换系数相乘,产生的比利时法郎价格(例如 457 法郎)不符合当地习惯,因此这种方法不可取。更好的方法是为比利时创建一个自定义目录,包含适合比利时市场的价格(例如 450 法郎)。
对不同区域使用不同折扣
对不同区域使用不同折扣的概念与对不同区域使用不同价格的概念相似,但特定区域的折扣不需要自定义目录或多个价格属性,而可以配置 Commerce Server Purchase 管道和 Content Selection 管道来根据不同的区域执行不同的折扣。尽管初看上去这好像是一个与货币相关的问题,但实际上它与货币无关。有关 Commerce Server 管道的详细信息,请参阅 Commerce Server 2000 帮助。
更改货币
有关更改货币的问题与有关更改语言的问题相似。Sweet Forgiveness 示例站点包含一个下拉菜单,用户可以从其中按与选择语言相同的方式来选择货币。由于演示的需要,与语言一样,货币也始终通过 URL 来传递。
您可以通过以下任何方法来提供当前货币:
- 用客户端 Cookie 来存储当前货币代码: 象更改语言一样,使用客户端 Cookie 是对货币上下文进行编码的最简单方法。此方法的唯一缺点是,某些用户不得不使用他们不喜欢的 Cookie。而且,漫游用户不得不重新输入其数据。
- 在 URL 中对货币代码进行编码: 使用您在更改语言时所使用的同一个 GenerateURL 函数来包括当前货币。
- 在用户配置文件中存储货币代码: 在用户配置文件中存储相应的货币代码是一种选择,但显示货币信息的每个页面以后都需要调用用户配置文件。如果用户的配置文件数据已被缓存,则这是能够从任何位置使用用户设置的一种可靠而快速的方法。
配置国际化区域设置
您可以配置一个站点,使它使用与您的开发语言不同的语言。例如,您可以用英语开发站点,但需要用这个英语站点来创建一个法语站点。要通过使用不同的语言来创建站点:
- 在 Microsoft® Windows® 2000 中设置系统区域。在“控制面板”中,为新区域设置“区域设置”下的选项。您必须为每台计算机单独设置区域,并启用以给定的代码页显示和输入文本。您也必须定义区域的默认设置,例如货币、数值格式、日期和时间格式。
- 配置 Microsoft® SQL Server™ 排序设置。SQL Server 排序设置在安装 SQL Server 时进行设置,安装完成后就不能对其进行更改。排序设置决定了数据库对非 Unicode 数据采用的代码页和排序方式。(数据库架构决定了数据是否是 Unicode。)
- 通过使用 App Default Config 资源,在 Commerce Server Manager 中更改下列 Commerce Server 站点属性:
- Site default locale
- Page encoding charset
- Unit of Measure for Weight
- Currency: Base currency locale
- Currency: Base currency code
- Currency: Base currency symbol
如果您计划显示多种货币,则需要为每种额外的货币配置下列属性:
- Currency: Alternate currency options
- Currency: Alternate currency conversion rate
- Currency: Alternate currency locale
- Currency: Alternate currency code
- Currency: Alternate currency symbol
- Currency: Currency display order options
- Site default locale
有关配置 App Default Config 资源的详细信息,请参阅 Commerce Server 2000 帮助中的“配置 App Default Config 资源属性”主题。
配置 Windows 系统区域之后,SQL Server 默认使用相应的排序方式。(代码页和排序方式与区域相匹配。)当您配置 Commerce Server 时,Commerce Server 数据库将支持您配置的代码页。您可以在 Commerce Server Manager 中对 App Default Config 资源中的任意设置进行更改。
当您解压缩 Business Desk 或使用 Solution Sites 之一后,以下站点配置属性都基于系统区域,您不需要更改它们:
- Site default locale(数字和日期的格式)。
- Base currency locale。
注意: Base currency symbol 和 Base currency code 属性的设置方式不同。
- Page encoding charset(设置为支持系统区域相关语言的默认字符集)。可在 Business Desk 头文件中使用编码字符集为每个页面设置字符集。
如果要在为相同区域配置的系统上用 Commerce Server Site Packager 解压缩本地化站点,则除非要显示多种货币,否则您不必更改任何设置。Site Packager 程序包中包括了所有其他设置。在发布站点前,一定要检查所有设置。
例如,如果在朝鲜语的系统上安装英语站点,您可以在 Business Desk 中输入朝鲜语语言字符,而不需要作任何其他更改。
但是,如果您要以不同的语言在为开发语言配置的系统上运行站点(例如,在英语系统上运行法语站点),您需要配置下列设置:
- 将 Default site locale、Base currency locale 和 Page encoding charset 属性设置为 French。
- 在 BDHeader.asp 和 BDXMLHeader.asp 文件中,执行以下步骤:
- 删除
<%@ LANGUAGE=VBSCRIPT%>
。
- 取消注释
<%'@ LANGUAGE=VBSCRIPT CODEPAGE=1252 %>
,并将代码页设置为法语的正确值。
注意: 在创建货币属性时,Catalogs 模块使用 Base currency symbol 和 Base currency code 属性。
- 删除
本文档中包含的信息代表 Microsoft Corporation 在发布日期对所讨论问题的最新观点。由于 Microsoft 必须适应不断变化的市场情况,因此,这些信息并非 Microsoft 方面所作的承诺,Microsoft 也不能保证出版日之后提供的任何信息都完全正确。
本白皮书仅作信息参考之用。MICROSOFT 对本文档中的有关信息不作任何明示或暗示的担保。
用户有责任遵从所有适用的版权法。在不限制版权的情况下,未经 Microsoft Corporation 明确书面许可,不得擅自将本文档的任何部分进行复制、存储在或输入可检索系统,或以任何形式或方式(电子、机械、影印、录制或其他方式)进行传播,或用作其他目的。
Microsoft 对本文档中的主题持有专利权、专利申请权、商标权、版权或其他相关的知识产权。Microsoft 只提供在任何书面许可协议中明确规定的权利,而不授予您本文档的上述专利权、商标权、版权或其他知识产权。
本文中用作示例的公司、组织、产品、人名和事件均为虚构,与任何真实的公司、组织、产品、个人或事件没有任何直接或间接的关联。
© 2001 Microsoft Corporation 版权所有。保留所有权利。
Microsoft 和 Windows 是 Microsoft Corporation 在美国和/或其他国家或地区的注册商标或商标。
此处提到的真实的公司和产品名称是其各自所有者的商标。