2013-05-09 64 views
0

我正尝试使用浏览器语言首选项在Zend_Locale和Zend_Currency之间建立连接。Zend Locale&Zend_Currency:地区代码

浏览器:连接

$locale = new Zend_Locale(Zend_Locale::BROWSER); 
Zend_Debug::Dump($locale->getLanguage()); 
Zend_Debug::Dump($locale->getRegion()); 
die; 

结果:

string(2) "en" 
bool(false) 

浏览器:EN_US

$locale = new Zend_Locale(Zend_Locale::BROWSER); 
Zend_Debug::Dump($locale->getLanguage()); 
Zend_Debug::Dump($locale->getRegion()); 
die; 

结果:

string(2) "en" 
string(2) "US" 

何我有解决这个问题吗?

这是我的插件控制器:

class MyProject_Controller_Plugin_Language extends Zend_Controller_Plugin_Abstract { 

    public function routeShutdown(Zend_Controller_Request_Abstract $request) { 
     $locale = new Zend_Locale(Zend_Locale::BROWSER); 

     $registry = Zend_Registry::getInstance(); 

     // Check if the config file has been created 
     $isReady = MyProject_Main::isReady(); 

     $module = $request->getModuleName(); 

     if($module == "default"){ // set the right session namespace per module 
      $ns = new Zend_Session_Namespace ('Default'); 
     }elseif($module == "admin"){ 
      $ns = new Zend_Session_Namespace ('Admin'); 
     }else{ 
      $ns = new Zend_Session_Namespace ('Default'); 
     } 

     // check the user request if it is not set, please get the old prefereces 
     $lang = $request->getParam ('lang', $ns->lang); 

     if(empty($lang)){       // Get the user preference 
      if(strlen($locale) == 2){    // Check if the Browser locale is formed with 2 chars 
       $lang = $locale; 
      }elseif (strlen($locale) > 4){   // Check if the Browser locale is formed with > 4 chars 
       $lang = substr($locale, 0, 2);  // Get the language code from the browser preference 
      } 
     } 

     // Get the translate language or the default language: en 
     if(file_exists(PUBLIC_PATH . "/languages/$lang/$lang.mo")){ 
      $translate = new Zend_Translate(array('adapter' => "MyProject_Translate_Adapter_Gettext", 'content' => PUBLIC_PATH . "/languages/$lang/$lang.mo", 'locale' => $lang, 'disableNotices' => true)); 
     }else{ 
      $translate = new Zend_Translate(array('adapter' => "MyProject_Translate_Adapter_Gettext", 'locale' => $lang, 'disableNotices' => true)); 
     } 

     $registry->set('Zend_Translate', $translate); 
     $registry->set('Zend_Locale', $locale); 

     if($isReady){ 
      $ns->langid = Languages::get_language_id_by_code($lang); 
     }else{ 
      $ns->langid = 1; 
     } 

     $ns->lang = $lang; 
    } 
} 

感谢

回答

0

显然,客户的语言首选项是一个很好的第一步,但不会帮助你在任何情况下。即使它们返回了一个值,我也不会像您所描述的那样使用它来确定适当的货币 - 用户可以将其首选语言/区域设置为外国设置。例子是外籍人士和语言学习者。虽然这可能是一个边缘案例,但不要相信它来检测货币。

最健壮的解决方案是使用地理位置服务,该服务还返回找到的位置的货币,例如, http://www.geoplugin.com/webservices/php

这两种方法的组合也可能是一个很好的解决方案。如果它们返回冲突的值,则向用户提供从两种找到的货币(或来自其他货币)中进行选择的可能性。

+0

嗨我已经更新了我的问题添加php代码。正如你所看到的,我已经避免了像之前描述的那样设置货币,并且我已经以这种方式处理了区域设置,但在我看来,这是一种粗鲁的方式。任何建议? – Michelangelo 2013-05-10 09:36:43