问题
I am trying to create a connection between the Zend_Locale and the Zend_Currency using the browser language preferences.
BROWSER: en
$locale = new Zend_Locale(Zend_Locale::BROWSER);
Zend_Debug::Dump($locale->getLanguage());
Zend_Debug::Dump($locale->getRegion());
die;
Result:
string(2) "en"
bool(false)
BROWSER: en_US
$locale = new Zend_Locale(Zend_Locale::BROWSER);
Zend_Debug::Dump($locale->getLanguage());
Zend_Debug::Dump($locale->getRegion());
die;
Result:
string(2) "en"
string(2) "US"
Ho have I to solve this problem?
This is my plugin controller:
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;
}
}
Thanks
回答1:
Obviously, the client's language preferences are a good first step, but won't help you in all cases. Even if they return a value, I would not use it to determine the appropriate currency as you described - users may set their preferred language/region to a foreign setting. Examples are expats and language learners. Though this may be an edge case, don't trust it to detect currency.
The most robust solution would be to use a geolocation service which also returns the currency for the location found, e.g. http://www.geoplugin.com/webservices/php.
The combination of both methods may also be a good solution. If they return conflicting values, offer the user a possibility to choose from the two found currencies (or from any other).
来源:https://stackoverflow.com/questions/16469629/zend-locale-zend-currency-region-code