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

[HELP] 有人用CI做过多语种网站吗?我遇到个问题

[复制链接]
发表于 2014-12-8 16:42:32 | 显示全部楼层 |阅读模式
1. 我想做一个多语种网站,语言文件都能正常引入。我把语言文件中的变量直接放到视图php文件中的。比如这种格式的 <?=$movie?>
2. 但是在用js+json生成二级分类的时候,遇到问题了。发现无法按照要求生成上面格式的html结果代码,代码如下:
3. 因为js在拼接的时候,一旦出现'<?', 标签就会被PHP解析
HTML复制代码
 
        原始html代码
        <select name="father" class="category"></select>
        <select name="child" class="sub-category"></select>
 
        <!--
                如何在CI框架中,只用js的情况下,把json数据变成下面的代码?
                var data = '{"movie":["cam","dvd"],"music":["lossless","mp3"]}';
        -->
 
        结果代码
        <select name="father" class="category">
                <option value="movie"><?=$movie?></option>
                <option value="music"><?=$music?></option>
        </select>
        <select name="child" class="sub-category">
                <option value="cam"><?=$cam?></option>
                <option value="dvd"><?=$dvd?></option>
        </select>
 
 
复制代码


4. JS代码如下
JS复制代码
 
        <script type="text/javascript">
                // 声明初始化函数
                function initialize(data){
                        var father = ""; // 预先声明
                        var child = ""; //
                        var times = 0 ; // 初始化的时候,子类只显示json第一个对象的第一组数据,这个是记录each执行的次数
                        $.each(data,function(oneKey,oneVal){
                                times++;
 
                                // 父类菜单的拼接
                                father += ('<option value="'+oneKey+'">'+'<?=$'+oneKey+'?>'+'</option>');
                                if(times<=1){
                                        $.each(oneVal,function(twoKey,twoVal){
                                                // 初始化时子类菜单的拼接
                                                child += ('<option value="'+twoVal+'">'+'<?=$'+twoVal+'?>'+'</option>');
                                        });
                                }
                        });
                        $('select.category').append(father); // 最后完成父菜单节点插入
                        $('select.sub-category').append(child); // 最后完成子菜单节点插入
                }
                // 声明二级菜单json格式的数据
                var data = '{"movie":["cam","dvd"],"music":["lossless","mp3"]}';
                // 解析json数据
                var temp = $.parseJSON(data);
                // 调用初始化函数
                initialize(temp);
        </script>
 
 
复制代码


 楼主| 发表于 2014-12-9 13:48:08 | 显示全部楼层
世云哥 发表于 2014-12-9 11:32
JS也分服务器和客户端的吧?可以指定是在服务器端运行的。不过既然php了何必还要js服务器端?
不过这样 ...

1. 如果用PHP来输出option的话,我觉得比较麻烦,因为我现在做是一个二级联动菜单。用户选择的时候,就需要ajax请求php获取对应的子分类,不如用你说的第二种方法
2. 不同的json语言的话,我试了一下,因为我对json不精通,写出来的json格式有点繁琐,导致jquery解析的时候用到3个$.each来解析,麻烦您帮看一下,js代码如下:
JS复制代码
 
        // 声明初始化函数
        function initialize(data){
                var father = ""; // 预先声明
                var child = ""; //
                var times = 0 ; // 初始化的时候,子类只显示json第一个对象的第一组数据,这个是记录each执行的次数
                $.each(data,function(oneKey,oneVal){
                        times++;
                        // 父类菜单的一次拼接
                        father += ('<option value="'+oneKey+'">');
                        $.each(oneVal,function(twoKey,twoVal){
                                // 父类菜单的二次拼接
                                father += (twoKey+"</option>");
                                if(times<=1){
                                        $.each(twoVal,function(threeKey,threeVal){
                                                // 子类菜单的拼接
                                                child += ('<option value="'+threeKey+'">'+threeVal+'</option>');
                                        });
                                }
                        })
                });
                $('select.category').append(father); // 最后完成父菜单节点插入
                $('select.sub-category').append(child); // 最后完成子菜单节点插入
        }
        // 声明二级菜单json格式的数据
        var data = '{ "movie":{ "<?=$movie?>": { "cam":"<?=$cam?>","dvd":"<?=$dvd?>","hdtv":"<?=$hdtv?>","seven_p":"<?=$seven_p?>","eight_p":"<?=$eight_p?>"}} ,"music": {"<?=$music?>":{"lossless":"<?=$lossless?>" , "mp3":"<?=$mp3?>"}}}';
        // 解析json数据
        var temp = $.parseJSON(data);
        // 调用初始化函数
        initialize(temp);
 
 
复制代码

JSON数据为:
JS复制代码
 
// 声明二级菜单json格式的数据
var data = '{ "movie":{ "<?=$movie?>": { "cam":"<?=$cam?>","dvd":"<?=$dvd?>","hdtv":"<?=$hdtv?>","seven_p":"<?=$seven_p?>","eight_p":"<?=$eight_p?>"}} ,"music": {"<?=$music?>":{"lossless":"<?=$lossless?>" , "mp3":"<?=$mp3?>"}}}';
 
 
复制代码


3. 语言变量我是直接存到php文件中的,也就是手册里面的方法,把语言文件存到/application/language/chinese/language.php。定义session后就可以指定全站的界面语言。因为我对js不了解,所以没敢用js存到array的方法

综上所说,麻烦你能看一看,第二项里面如何简化js代码及json数据格式
发表于 2014-12-12 14:33:30 | 显示全部楼层
json我也不太懂。。帮不了你什么。。看看这样写行不

{ "En":
        {
        "movie":
                {....
                } ,
        "music":
                {....
                }
        },
        "Zh":
        {
        "movie":
                { ...
                } ,
        "music":
                {...
                }
        },
}
发表于 2014-12-9 11:32:30 | 显示全部楼层
c710999999 发表于 2014-12-9 10:00
这种php+js的代码是不行的,一个服务器语言 一个客户端语言 别混一起使用
你用ajax异步读数据吧。


JS也分服务器和客户端的吧?可以指定是在服务器端运行的。不过既然php了何必还要js服务器端?
不过这样的应用可以有多种类似的方法呢。
1. 如果你只是几个常量的不同语言版本,你可以load一个配置文件,直接php输出option,不用js来append。
2.产生不同语言的json,这个就简单了。
3.你把语音变量用js存到一个array。或者object。然后js不要再输出php语句了,直接用判断语句输出相应的语言字符。如c710999999 所说,js在客户端解释后没有环境来解释php
发表于 2014-12-8 17:01:03 | 显示全部楼层
本帖最后由 世云哥 于 2014-12-8 17:14 编辑

按语言产生不同的json源不就行了?,你把字符串用变量替换,带入。
发表于 2014-12-8 17:31:09 | 显示全部楼层
prechar=”<?=$“; endchar=“?>”;
发表于 2014-12-8 17:55:28 | 显示全部楼层
father += ('<option value="'+oneKey+'">'+'<?=$'+oneKey+'?>'+'</option>');

你这几个地方很奇怪, PHP是服务端语言,js是客户端语言。
 楼主| 发表于 2014-12-9 08:08:16 | 显示全部楼层

这段代码是在JS中使用吗?如果是js中的话,我试过了,不行
 楼主| 发表于 2014-12-9 08:09:11 | 显示全部楼层
c710999999 发表于 2014-12-8 17:55
father += (''+''+'');

你这几个地方很奇怪, PHP是服务端语言,js是客户端语言。

这样做的原因是要生成结果代码
发表于 2014-12-9 10:00:04 | 显示全部楼层
NingerJohn 发表于 2014-12-9 08:09
这样做的原因是要生成结果代码

<?=$'+oneKey+'?>

这种php+js的代码是不行的,一个服务器语言 一个客户端语言 别混一起使用
你用ajax异步读数据吧。


发表于 2014-12-11 10:42:18 | 显示全部楼层
NingerJohn 发表于 2014-12-9 13:48
1. 如果用PHP来输出option的话,我觉得比较麻烦,因为我现在做是一个二级联动菜单。用户选择的时候,就需 ...

首先,看起来你 json是固定内容的?只有语言的差别,Chinese和Eng?没有其他的内容,比如数据名称,连接等
把它放到两个个文件里,然后用jquery getjson()来加载这个文件。根据不同的语言,加载不同的文件。
具体实现和测试请参考
http://www.w3school.com.cn/jquery/jquery_ref_ajax.asp

jquery有很大现成的库,你直接使用就可以了。


本版积分规则