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

Nic*_*ico 10 php frameworks locale zend-framework 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:使用区域设置作为默认值.如果用户更改了首选货币,只需更改货币而不是区域设置.因此格式化将保持基于旧的语言环境,因为货币的更改并不意味着用户也想要更改其语言环境.

这种方法是否可以接受?如果浏览器语言环境设置如下,则步骤1存在问题:

  • EN_US

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

Tas*_*ros 1

您强调的问题很常见,我想需要做少量的工作来为您的用户设置区域设置。

de 到 de_DE 要求您知道它们是否位于德国,但如果您不知道用户所在位置,则可以默认为您所在的位置 de_CH。

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

将其映射到您的应用程序中。对于德国境内讲德语的居民,您的映射可以将其转换为 de_DE。或者 de_CH 表示瑞士说德语的居民。或者对于说法语的瑞士居民来说是 fr_CH,对于说英语的居民来说则是 en_CH 或 en_DE。所以这解决了2个问题。

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

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

链接:Unicode - 位置和语言映射

* The user prefers a language which is not supported by my website
Run Code Online (Sandbox Code Playgroud)

您应该有一个默认语言和货币,如果您在欧洲,那么选择就是您的默认地点和语言,如果您是瑞士人,那么 de_CH 就有意义。

* The user is from a country where they got a currency which isn't supported by my product order form
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您应该恢复为默认值。

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

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

链接:Zend Locale 介绍

  // 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)
Run Code Online (Sandbox Code Playgroud)