The problem is a bug in the model Mage_Core_Model_Url_Rewrite_Request
(Magento 1.8) and Mage_Core_Model_Url_Rewrite
(earlier versions).
The section of core code in 1.8 looks like this:
// Section from Mage_Core_Model_Url_Rewrite_Request::_rewriteDb()
$fromStore = $this->_request->getQuery('___from_store');
if (!$this->_rewrite->getId() && $fromStore) {
$stores = $this->_app->getStores();
if (!empty($stores[$fromStore])) {
$store = $stores[$fromStore];
$fromStoreId = $store->getId();
} else {
return false;
}
The Bug: the value of the query parameter is the store code, (in my case de
, en
or fr
).
The keys of the array returned by app->getStores()
are the numeric store IDs.
Thats why if (!empty($stores[$fromStore])) {
always fails.
Once that bug is fixed, another bug becomes apparent later in the same method (I think only in 1.8):
$targetUrl = $this->_request->getBaseUrl() . '/' . $this->_rewrite->getRequestPath();
The request objects base url always is the Magento base_url, without the store code.
Using $currentStore->getBaseUrl()
instead there fixes that bug, too.
Once those two issues are fixed the language switcher works fine. Here is an extension which does exactly that for Magento 1.8 (CE): https://github.com/Vinai/VinaiKopp_StoreUrlRewrites
In Magento 1.7 the issue might be something different. I still thought I'd add this answer, just in case google brings somebody else here who is running 1.8 or newer.
Tested, this and I can swap locales at will, and get the translations.
See Mage_Core_Model_Translate::getLocale()
which I changed to :
/**
* Retrieve locale
*
* @return string
*/
public function getLocale()
{
// custom code start to get current logged in customer
if(Mage::getSingleton('customer/session')->isLoggedIn()) {
$customerData = Mage::getSingleton('customer/session')->getCustomer();
$this->_locale = 'en_US'; // here you would pull the locale from a customer attribute
}
// custom code ends
if (is_null($this->_locale)) {
$this->_locale = Mage::app()->getLocale()->getLocaleCode();
}
return $this->_locale;
}
Now when I view the frontend, the locale is loaded from the files in app/locale/en_US (as compared to my default locale of en_AU)
Naturally the above code shoudl be done via a rewrite. Don't go edit core files ;)
Hope this helps, or at least puts you on the right track.
Best Answer
Language block is already in header block see below code for your reference
Can you put your code screenshot what you have done for language switcher in your code ?