处理货币和语言切换的最佳实践

10
我正在使用Zend Framework(德语和英语)开发一个多语言项目,其中有一个小表单用于订购产品。用户应该能够:
  • 更改产品价格的首选货币
  • 更改整个网站的首选语言
目前,我使用Zend_Locale :: findLocale()获取用户的区域设置。通过我的浏览器设置,我得到“de_CH”,这很好。但是一旦出现以下问题就会有些麻烦:
  • 用户已经配置了浏览器只提供语言代码(“de”而不是“de_CH”)
  • 用户偏爱的语言不受网站支持
  • 用户来自一个不支持产品订单表格的货币的国家
只有语言代码 语言代码足以处理Zend_Translate,但是Zend_Currency需要更多信息。我认为没有解决方案可以从每个可能的用户那里获得带有国家代码的完整区域设置。我的问题是:您如何处理这些情况?您是否在bootstrap的_initLocale()中检查是否缺少国家代码并使用默认国家代码?是否有任何Zend Framework的方法可用? 不支持的语言 如果用户的语言是'fr',由于我们的网站不支持法语,我想使用默认语言。是否有比在引导程序中添加白名单数组更好的方法?例如,Zend_Translate的某种方法? 不支持的货币 如果支持用户的语言但不支持他的货币怎么办?我应该在引导程序中更改区域设置还是复制区域设置并将其更改为Zend_Currency? 主要问题 我认为我的主要问题是我不确定如何处理所有这些不同的区域设置问题。我的首选方法是验证在bootstrap的_initLocale()中设置的区域设置,以便我可以确保我支持它的语言和货币。
谢谢您的建议。
最好的问候, Nico 编辑1我对如何处理这些问题有了更多的想法。你认为这种方法怎么样?
  1. Zend_Locale():过滤所有没有国家代码的短语言环境,并使用应用程序支持的语言白名单(仅语言代码)。如果没有匹配项,则使用应用程序提供的默认值。
  2. Zend_Translate:从语言环境开始使用语言代码。但是,如果用户更改了首选语言,则保留语言环境不变(可能基于新语言代码和旧国家代码没有匹配的语言环境),仅更改Zend_Translate中的语言代码。
  3. Zend_Currency:将语言环境用作默认语言环境。如果用户更改了首选货币,则仅更改货币而不是语言环境。因此,格式化将基于旧的语言环境,因为更改货币并不意味着用户也想更改其语言环境。
这种方法可行吗?如果浏览器的语言环境设置如下,则存在第1步的问题:
  • de
  • en_US
也许应用程序确实支持德语,但由于它是一个短语言环境,应用程序将使用en_US代替。但我不知道哪种解决方案可以解决这个问题,因为我无法将短语言环境“升级”为完整的语言环境。

2
我不确定这是否有帮助,但作为用户,我讨厌应用程序和网站试图为我找到适合的语言。我认为最好在你的网站上有一个语言按钮或下拉菜单。对你的好处是你不必担心检测奇怪的语言组合。 - Matt
在Matt的建议上加1。我很困惑为什么你想支持每种语言和货币。你可能最多只会将你的网站翻译成5到10种语言。因此,尝试“检测”区域设置并执行必要的操作以找到正确的语言可能是不必要的。那么来自阿姆斯特丹的人怎么办?他们可能更喜欢英语或法语,但是你的网站检测到他们最有可能理解荷兰语?我投票支持语言/货币选择器。保持简单。 - Symen Timmermans
好的,但是为了能够生成完整的区域设置,用户还必须选择他的国家。否则,我会以错误的方式输出所选货币(例如,EUR 12.000.- 而不是 12'000 EUR)。但是,也许简单就是正确的中间道路;-)。谢谢您的建议。 - Nico
2个回答

1

你提到的问题很常见,我想只需要一点点工作就可以为你的用户设置区域设置。

从 de 到 de_DE 需要你知道他们是否位于德国,但如果你不知道用户所在地,则可以默认为 de_CH,即你所在的地区。

* The user has configured his browser to just give me the language code ('de' instead of 'de_CH')

在您的应用程序中进行映射。您的映射可以将其转换为de_DE,以供讲德语的德国居民使用。或者对于讲德语的瑞士居民,可以转换为de_CH。或者对于讲法语的瑞士居民,可以转换为fr_CH,以此类推,对于讲英语的人,它将是en_CH或en_DE。因此,这解决了两个问题。

需要用户的语言和位置来准确确定用户的区域设置。

如果您不知道他们的位置,则应默认使用您自己的默认语言和地区设置。

链接:Unicode-地区和语言映射

* The user prefers a language which is not supported by my website

如果您在欧洲,那么您应该有一个默认的语言和货币选择,这取决于您的本地设置和语言。如果您是瑞士人,则选择 de_CH 是有意义的。

* The user is from a country where they got a currency which isn't supported by my product order form

在这种情况下,您应该恢复默认设置。

Zend的Wiki上有许多使用Locales的示例。在Zend中设置地区的最常见位置是引导文件。

我使用了这个链接来参考Zend Framework Wiki上对此响应的支持。下面的代码提供了一个小例子,展示了如果语言环境无效,Zend_Locale类会抛出异常。您可以在此时检查位置和语言,并与从浏览器接收到的信息结合使用,为用户准确地设置语言环境。

链接:Zend Locale Introduction

  // within the bootstrap file
  try {
      $locale = new Zend_Locale('auto');
  } catch (Zend_Locale_Exception $e) {
      $locale = new Zend_Locale('de');
  }
  // within your model/controller
  $date = new Zend_Date($locale);
  $currency = new Zend_Currency($locale)

0
在我的情况下,我希望在用户首次访问我的网站时询问他们选择的语言和货币。在语言选择界面中,我会以用户浏览器的语言代码作为默认语言的参考,并在我的网站上提供快速语言切换按钮。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接