You are here

Drupal meetup补充:如何实现对drupal中变量的多语言支持

g089h515r806 的头像
Submitted by g089h515r806 on 星期日, 2008-12-14 14:23

在drupal中,并不是所有的文本都使用了t()函数,drupal中自带的一些变量,还有就是第3方模块的变量,由于是存在数据库中的,而且是可以配置的,所以很不好实现多语言支持。其实,实现起来也很简单,但是很少人用到这一点。

我在使用Ubercart建站中,就遇到了这样的问题,由uc_catalog模块创建的分类区块和导航,里面的词汇表的名称,采用的是变量的形式,我们可以看看源代码:

'title' => variable_get('uc_catalog_name', t('Catalog')),

这个变量名为uc_catalog_name,默认为'Catalog',这个时刻配置的,培植页面就在这个词汇表的编辑页面。启用了i18n模块以后,我费了很大的劲,尝试了各种方法,都没有把这个变量解决掉。后来我想了一个办法,那就是使用js对这个文中的内容进行替换。不过觉得这种方式并不正规。我找了不少的地方,差了不少的英文页面,包括ubercart.org上,有人也遇到了同样的问题,但是却没有答案,有人说这是ubercart的bug,我很沮丧,说实在的,如果这样的话,那我就惨了。

不断的翻阅翻译相关的文档,最终找到了头目,Multilingual Variables,http://drupal.org/node/313272,这篇文章很好的解决了这个问题,我看到的时候,第一个感觉就是找到了,这里面的两篇文章我读了一遍。

我的解决方案如下,在settings配置文件中,也就是内容的最下面,添加如下内容:

/**

* Multilingual settings

*

* This is a collection of variables that can be set up for each language when i18n is enabled.

* These are the basic ones for Drupal core, but you can add your own here.

*/

$conf['i18n_variables'] = array(

       'uc_catalog_name',

  // Site name, slogan, mission, etc..

//  'site_name',

//  'site_slogan',

//  'site_mission',

//  'site_footer',

//  'anonymous',

  // Different front page for each language

//  'site_frontpage',

  // Primary and secondary links

//  'menu_primary_links_source',

//  'menu_secondary_links_source',

  // Contact form information

//  'contact_form_information',

);

其它的变量是我拷贝过来的,保存,当然,修改settings文件的时候,需要修改文件的权限的。

修改完以后,就是进入词汇表的切换页面,输入catalog,然后就是切换到繁体中文,在同样的页面,输入“图书目录”。现在好了。这个变量的多语言切换功能实现了。

这就是Ubercart的长处,它将自己的功能,完全架构在drupal之上,自己本身不用处理这种与业务无关的内容。

本文算是我今天在meetup上的补充吧。

相关链接:  http://zhupou.cn

论坛:

097633q 的头像

呵呵,我看你写的”这就是Ubercart的长处“,没用过ubercart,呵呵,对了,老葛,帮我下
function profile_user($type, &$edit, &$user, $category = NULL) {switch ($type) {case 'load':return profile_load_profile($user);case 'register':return profile_form_profile($edit, $user, $category, TRUE);case 'update':return profile_save_profile($edit, $user, $category);case 'insert':return profile_save_profile($edit, $user, $category, TRUE);case 'view':return profile_view_profile($user);case 'form':return profile_form_profile($edit, $user, $category);case 'validate':return profile_validate_profile($edit, $category);case 'categories':return profile_categories();case 'delete':db_query('DELETE FROM {profile_values} WHERE uid = %d', $user->uid);}}
在profile.module 205行左右我想把上面这个hook_user改成hook_menu,有几个问题不明白,一个是($type, &$edit, &$user, $category = NULL)这些参数怎么处理,一个是里面的$type换成menu的话应该怎么处理?麻烦你了!不好意思。

g089h515r806 的头像

Andy,学学D6吧,比drupal5好多了,不然会落伍的,localizer模块在Drupal6中已经被废弃了,全面地被i18n取代了。
我在建站的时候总结出来的,这个是,我花了一天的心血,才找到的东东,很少有人知道变量的多语言支持这样的技术了,包括drupal.org社区,还有ubercart.org社区,很多人都问这个问题,都没有人解答得了,还有人觉得这个是bug呢。与时俱进才能保持技术的领先性阿。