用户
 找回密码
 入住 CI 中国社区
搜索
查看: 6803|回复: 8
收起左侧

[Others] 关于多语言的表的设计问题

[复制链接]
发表于 2010-7-15 02:30:43 | 显示全部楼层 |阅读模式
本帖最后由 zhouli520 于 2010-7-15 02:32 编辑

相信大家也经常给在中国的老外开发网站,这就肯定会涉及到多语言的问题了
  前台的一些固定的东西可以直接用ci给的多语言类解决,但是往往有很多后台添加的东西也需要多语言
这时候就需要设计一个多语言的数据表了,我们公司经常会给一些外国的酒吧什么的开发网站,有时候要求的语言种类达到了4种
什么中文繁体 英语土耳其语
此时,我建表的时候就会把那些有多语言的字段建成cname(Chinese).tcname(traditional chinese),name(english),tname(turkish),
不过这样有个缺点就是如果一张表里,里面有多个字段都涉及到了多语言的话,那么这张表的字段肯定会翻番的增长,一张表里字段太多了让我看着很不爽
同事却建议我用另一种办法,就是把多语言的字段都拿出来额外建张表,里面属性是关联的表id,字段名,和一个语言id,这样的好处是方便以后可以继续扩展
语言,但是每次查询又要多查询1张表,也感觉有点麻烦
想问下各位大大,你们平常是怎么解决关于多语言的建表问题的???
   有什么好方案和大家分享下吧,打了这么多废话,希望没有看瞎你们的眼睛
发表于 2010-7-15 10:01:17 | 显示全部楼层
放一个表里肯定不合适。
多查询一个表不麻烦,关键要看你如何封装代码,这是重点。很多代码都可以简化到一行代码,这样就不麻烦了,呵呵
发表于 2010-7-15 18:04:58 | 显示全部楼层
同意楼上的关键要看你如何封装代码
 楼主| 发表于 2010-7-15 20:04:49 | 显示全部楼层
需要怎么封装呢???
我处理多语言的时候一般都是将用户选择的语言种类放入session
当在control输出信息到前台时,先拿到session根据session判断从数据库中拿哪个语言字段比如
$lang = $this->session->userdata('language');
if($lang=='english'){
   foreach($example as $e){
        $name = $e['name'];
   }
}
if($lang=='chinese'){
   foreach($example as $e){
        $name = $e[c'name'];
   }
}
else{
   foreach($example as $e){
        $name = $e[c'name'];
   }
}

这样取值很麻烦,而且产生和夺重复代码,请hex帮我看看有什么好的封装方法呢?
发表于 2010-7-16 00:34:28 | 显示全部楼层
封装代码要通盘考虑,只这几个代码当然没什么可封装的了,呵呵
这个就只能靠你自己总结+提炼了。
发表于 2010-8-24 01:02:40 | 显示全部楼层
那有什么好方法处理多语呢,我准备要做一个,在这找参考呢...
发表于 2010-9-7 09:14:43 | 显示全部楼层
我有一种方式,不知道适不适合你
我在做FAQ时,需要牵涉到两个版本,英文与泰文,但英文是我的基础版本,我这里随便写几个字段表示一下
如有h_id,h_title,h_content三个字段
当只有一个英文版本时,这就可以了,但如果这时我要扩展另一个版本怎么办呢,我加三个字段
h_language,h_transstatus,h_relationid
第一个字段代表的意思是当前这条记录是英文版本,还是什么版本,可以用相应的标记位来实现,第二个就是当前这条记录是否已经翻译,如果未翻译,它的状态位是也是用标记位来实现,同时,这条记录会原始的数据就是英文的,第三个字段最重要,表示的是当前这条记录关联的原始记录是哪条,也就是英文记录,至此就可以实现你要的功能了
总结:其实你之前说不同的语言,增相应的字段,会翻倍的增加字段数量,觉得不合适,其实我这里只是把你的字段改成增加记录了,如你有两个版本时,你在录入原始记录时,就会生成相对应语言版本数量的记录,然后再根据那三个字段来管理相应多语言版本记录的关系.
发表于 2014-11-20 00:07:57 | 显示全部楼层
许多人软件都是配置文件的方式,语言和内容没关系,任何人都可以使用任何语言,内容可以同时包含多种语言。
选择配置就行了,默认英文。
语言配置文件单独目录,
zh_cn,en,jp
目录里面再分应用
zh_cn/admin/menu.lang.php
zh_cn/home/menu.lang.php
zh_cn/public/deault.lang.php

array(
  'hello_wolrd'=>'Hello world !',
...
)

调用时静态类或者函数


许多企业网站的做法直接多个表,cn_xx,en_xx,然后一些公共表




发表于 2015-6-12 10:24:39 | 显示全部楼层
楼上的大神们,我现在设计一个多语言的网站,有什么设计思路,我想做个语言版本自己可以切换,怎么设计?如果写死了$config['language'] = 'english'  那么不能自动装载其他目录下的语言包。只能自动装载english目录下的,怎么解决?

本版积分规则