OpenCart - 中文论坛

标题: opencart做的多语言与多货币关联问题。 [打印本页]

作者: beson2000    时间: 2013-8-17 10:00
标题: opencart做的多语言与多货币关联问题。
用opencart做的双语言简体繁体和多货币人民币港币,点简体就直接显示是人民币的网站,点繁体就是港币网站。有哪位大侠会呢? 我有两个文件currency.tpl,language.tpl,现在的情况是点简体就不是自动显示是人民币的网站,点繁体不是自动显示就是港币网站。要实现点简体就直接显示是人民币的网站,点繁体就是港币网站。请大侠帮我改改。


作者: haha008    时间: 2013-8-17 16:41
本帖最后由 haha008 于 2013-8-17 16:43 编辑

你这需求很麻烦诶

首先,要考虑语言包和货币如何关联。

如:中文-人民币 、 中文-港币 、 中文-美元、 英文-英镑、英文-美元等等。但OC内部并没有这样的关联机制,所以要自己定义。
  1. /* 要弄成智能关联的话要改很多地方,甚至要修改数据库。具体改动得看你的需求和开发思路。下面提供个简单的硬性关联代码给你参考,若有不满,请勿拍砖! */
复制代码
好,废话不多说,首先:打开文件catalog\controller\module\language.php,找到以下代码

  1.         if (isset($this->request->post['language_code'])) {
  2.                         $this->session->data['language'] = $this->request->post['language_code'];
  3.                
  4.                         if (isset($this->request->post['redirect'])) {
  5.                                 $this->redirect($this->request->post['redirect']);
  6.                         } else {
  7.                                 $this->redirect($this->url->link('common/home'));
  8.                         }
  9.             }
复制代码
改成

  1.             if (isset($this->request->post['language_code'])) {
  2.                         $this->session->data['language'] = $this->request->post['language_code'];
  3.                        
  4.                         $currency_code = '';
  5.                        
  6.                         if ($this->request->post['language_code'] == 'en') {
  7.                                 $currency_code = 'USD';
  8.                         }
  9.                        
  10.                         if ($currency_code) {
  11.                                 $this->currency->set($currency_code);
  12.                                
  13.                                 unset($this->session->data['shipping_method']);
  14.                                 unset($this->session->data['shipping_methods']);
  15.                         }
  16.                
  17.                         if (isset($this->request->post['redirect'])) {
  18.                                 $this->redirect($this->request->post['redirect']);
  19.                         } else {
  20.                                 $this->redirect($this->url->link('common/home'));
  21.                         }
  22.             }
复制代码
其中重要部分,en 为英文包的Code,USD 为货币的Code。具体Code请参照后台 setting -> Localisation -> languages/currencys 的参数

  1.                         if ($this->request->post['language_code'] == 'en') {   // 判断接收到的语言是否是英文,对字母大小写敏感
  2.                                 $currency_code = 'USD';   // 如果是英文,就启用USD(美元)
  3.                         }


复制代码
弄好后,估计就有效果了吧。        若有BUG,请跟帖联系。

作者: NICK    时间: 2013-8-19 21:01
顶,本人也觉得首页既然已有了多语言选择就直接可以攘括掉多货币选择 这个功能
期待有成品出现
作者: beson2000    时间: 2013-8-24 13:04
haha008,

   谢谢大侠的回复。

  我按你的方法改了下,在其中加了以下代码,已实现点简体就直接显示是人民币的网站,点繁体就是港币网站。但是有个问题,就是没法识别当前电脑的语言,即当前电脑是简体,网站就显示简体版。当前电脑是繁体就显示繁体版。这个问题能帮助看看吗?

2.jpg (42.39 KB, 下载次数: 108)

2.jpg

作者: mengwb    时间: 2013-8-24 23:03
对于根据当前系统语言打开网站自动使用对应语言和货币的功能,系统本身有类似的功能,只不过系统只是对语言有这样的功能,可以自己研究下代码,改下。
此部分代码在opencart的入口文件index.php中,代码如下:
if (isset($request->server['HTTP_ACCEPT_LANGUAGE']) && $request->server['HTTP_ACCEPT_LANGUAGE']) {
        $browser_languages = explode(',', $request->server['HTTP_ACCEPT_LANGUAGE']);
       
        foreach ($browser_languages as $browser_language) {
                foreach ($languages as $key => $value) {
                        if ($value['status']) {
                                $locale = explode(',', $value['locale']);

                                if (in_array($browser_language, $locale)) {
                                        $detect = $key;
                                }
                        }
                }
        }
}

if (isset($session->data['language']) && array_key_exists($session->data['language'], $languages) && $languages[$session->data['language']]['status']) {
        $code = $session->data['language'];
} elseif (isset($request->cookie['language']) && array_key_exists($request->cookie['language'], $languages) && $languages[$request->cookie['language']]['status']) {
        $code = $request->cookie['language'];
} elseif ($detect) {
        $code = $detect;
} else {
        $code = $config->get('config_language');
}

if (!isset($session->data['language']) || $session->data['language'] != $code) {
        $session->data['language'] = $code;
}

if (!isset($request->cookie['language']) || $request->cookie['language'] != $code) {          
        setcookie('language', $code, time() + 60 * 60 * 24 * 30, '/', $request->server['HTTP_HOST']);
}                       


其中,首先以session中的设置为最优先,其次以cookie。如果没有session和cookie的设置,才取浏览器(可以认为是操作系统语言)的语言设置,来设置网站打开的语言。
对于货币可以参考语言的这种思路自己来进行修改。
作者: mengwb    时间: 2013-8-24 23:44
不过语言设置里的区域要特别注意,要全面,才能完全兼容各种浏览器。比如目前系统默认的英文设置,对于火狐和IE都有些问题,修改如下:en_US.UTF-8,en_US,en-US,en-us,en-gb,english
中文应该为:zh_CN.UTF-8,zh_CN,zh-Hans-CN,zh-cn,china
如此设置可保证在IE和火狐下做到打开网站时,在没有cookie和session的情况下,自动根据浏览器语言设置来自动识别网站语言。不过本人在win8下最新版的ie和火狐下测试,不同版本又无区别商不得而知。




欢迎光临 OpenCart - 中文论坛 (https://bbs.opencart.cn/) Powered by Discuz! X3.2