2013-05-09 63 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