使用货币和语言切换处理区域设置的最佳做法

时间:2010-12-30 14:05:13

标签: php zend-framework frameworks locale currency

我正在开发一个Zend Framework(德语和英语)的多语言项目,我有一个小表单来订购产品。用户应该能够:

  • 更改产品价格的首选货币
  • 更改整个网站的首选语言

目前我使用Zend_Locale :: findLocale()来获取用户的语言环境。使用我的浏览器设置,我得到'de_CH'并且效果很好。但是一旦出现一些问题:

  • 用户已将其浏览器配置为只给我语言代码('de'而不是'de_CH')
  • 用户更喜欢我的网站不支持的语言
  • 用户来自他们的产品订单不支持的货币的国家/地区

只需语言代码 语言代码足以处理Zend_Translate,但Zend_Currency需要更多信息。我认为没有解决方案可以使用来自每个可能用户的国家/地区代码来获取完整的语言环境。我的问题是:你如何处理这些情况?如果缺少国家/地区代码并使用默认国家/地区代码,您是否检查了引导程序的_initLocale()?是否有任何Zend Framework方法可以做到这一点?

不支持的语言 如果用户语言为'fr',我想使用默认语言,因为我们的网站不支持法语。是否有更好的可能性,而不是在bootstrap中添加白名单数组?例如Zend_Translate的方法?

不支持的货币 如果支持用户的语言但不支持他的货币怎么办?我应该更改引导程序中的语言环境,还是应该复制语言环境并将其更改为Zend_Currency?

主要问题 我认为我的主要问题是我不知道如何处理所有这些不同的语言环境问题。我首选的方法是验证bootstrap的_initLocale()中设置的语言环境,所以我可以肯定我可以支持它的语言和货币。

感谢您的建议。

祝你好运, 尼科

编辑1 我已经让自己更多地考虑了处理这些问题的方法。您如何看待这种方法?

  1. Zend_Locale():过滤所有短的区域设置(没有国家/地区代码),并使用包含您的应用程序支持的语言的白名单(只是语言代码)。如果没有匹配,请使用应用程序提供的默认值。
  2. Zend_Translate:从语言环境开始使用语言代码。但是,如果用户更改了首选语言,请保留区域设置(可能没有基于新语言代码和旧国家/地区代码的匹配区域设置),只需更改Zend_Translate中的语言代码。
  3. Zend_Currency:使用区域设置作为默认值。如果用户更改了首选货币,只需更改货币而不是区域设置。因此,格式将保留基于旧的区域设置,因为货币的更改并不意味着用户也想要更改其区域设置。
  4. 这种方法是否可以接受?如果浏览器区域设置如下设置,则步骤1存在问题:

    • EN_US

    也许该应用程序支持德语,但由于它是一个简短的语言环境,应用程序将使用en_US。但我不知道哪个解决方案可以解决这个问题,因为我无法将短的语言环境“升级”为完整的语言环境。

3 个答案:

答案 0 :(得分:1)

您突出显示的问题很常见,我想为您的用户设置区域设置需要做少量工作。

de to 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。所以这解决了2个问题。

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

如果您不知道该位置,则应默认使用您自己的默认语言和地点。

链接:Unicode - locality and language mapping

* 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)

答案 1 :(得分:0)

以下是我撰写的关于本地化的文章,我认为您在回答某些问题时可能会觉得有用。

http://phpadvent.org/2010/localization-by-anthony-gentile

答案 2 :(得分:0)

就我而言,我想让用户在第一次访问我的网站时选择他们的语言和货币。在语言选择界面我是从用户的浏览器中获取语言代码作为默认语言的参考。我还在我的网站上提供快速语言切换按钮。