改变产品价格的首选货币
>改变整个网站的首选语言
目前我使用Zend_Locale :: findLocale()来获取用户的区域设置.使用我的浏览器设置,我得到’de_CH’,这很好.但有一些问题,一旦:
>用户已经配置了他的浏览器,只给我语言代码(‘de’而不是’de_CH’)
>用户喜欢我的网站不支持的语言
>用户来自一个国家,他们得到的货币不受我的产品订单表格的支持
只是语言代码
语言代码足以处理Zend_Translate,但Zend_Currency需要更多信息.我认为没有任何解决方案可以从每个可能的用户处获取国家代码的完整语言环境.我的问题是:你如何处理这些情况?如果缺少国家代码并使用默认的国家/地区代码,请检查您的bootstrap的_initLocale()有没有Zend Framework方法呢?
不支持的语言
如果用户语言为“fr”,我想使用默认语言,因为我们的网站不支持法语.在引导中添加白名单数组有更好的可能性吗?例如Zend_Translate的方法?
不受支持的货币
如果支持用户的语言,而不是他的货币怎么办?我应该在引导程序中更改区域设置,还是应该复制一个区域设置并将其更改为Zend_Currency?
主要问题
我认为我的主要问题是我不确定如何处理所有这些不同的区域设置问题.我最喜欢的方法是验证bootstrap的_initLocale()中的区域设置,所以我可以确定我可以支持它的语言和货币.
谢谢你的建议.
最好的祝福,
尼科
编辑1
我已经对处理这些问题的方法提出了更多的想法.你对这种方法有什么看法?
> Zend_Locale():过滤所有的短语言环境(没有国家/地区代码),并使用您的应用程序支持的语言(仅限语言代码)的白名单.如果没有匹配,请使用您的应用程序给定的默认值.
> Zend_Translate:从语言环境开始使用语言代码.但是,如果用户更改首选语言,请保留本地区(可能根据新语言代码和旧国家代码不存在匹配的区域设置),只需更改Zend_Translate中的语言代码即可.
> Zend_Currency:使用语言环境作为默认值.如果用户更改首选货币,只需更改货币,而不是区域设置.因此,格式化将基于旧的区域设置,因为货币的更改不意味着用户也想改变他的区域设置.
这种做法可以接受吗?如果浏览器区域设置如下所示,步骤1有一个问题:
> de
> en_US
也许该应用程序确实支持德语,但由于它是一个简短的语言环境,应用程序将使用en_US.但是我不知道哪个解决方案可以解决这个问题,因为我无法将一个简短的语言环境升级到一个完整的语言环境.
de deE需要您知道他们是否位于德国,但如果您不知道用户的位置,则可以默认为de_CH,这是您的所在地.
* The user has configured his browser to just give me the language code ('de' instead of 'de_CH')
在您的应用程序中映射.您的映射可以将其转换为德语中德语居民的de_DE.或者说瑞士居民说德语.或者对于瑞士居民来说,对于英语人士来说,这是法语等等,这将是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上使用地方文件的例子.在Zend中设置本地的最常见的地方是引导文件.
我使用这个链接来引用对Zend Framework wiki的这个回应的支持.下面的代码提供了一个小例子,说明如果语言环境无效,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)