支持多语言页面(XML AJAX)

多语言

这里的多语言页面是指 一个页面怎么支持多国语言。多国语言:如English 简体中文 繁体中文 等等。
支持多语言的页面,像Google翻译工具就直接是通过机器翻译来做多语言,这种机器翻译的网页可读性是一般的,用户体验也不会很好。我一开始就不考虑。

方案比较

  1. 直接写多种语言的html页面,然后不同的语言就切换不同的URL,这种方式最笨,也最直接。如果你的网页的结构不同语言的差别很大,或者所支持的功能差很多那可以考虑这种方式。
  2. 使用CSS伪元素的content:attr(en)形式,将语言写在元素属性中,这也是一种笨办法
  3. 还有就是通过后台,采用同一模板,利用ResourceBundle配置多语言resource文件,实现网页不同语言版本的显示。
    ResourceBundle提供的properties文件,采用XMLResourceBundle,采用XML文件的方式定义配置文件。
  4. JavaScript AJAX实现,把不同语言的字段存在不同的XML文件中,使用的是同一个HTML页面,利用AJAX来读取不同语言的内容。

关于检测还是下拉切换

这里对于多语言的支持,我想到的其实有两个方案:

  • 通过JS检测客户端或者浏览器的语言来确定使用什么语言显示HTML页面。 这个好处是比较自动不需要人工去选择语言。 当然如果要用js检测,对于浏览器来说可以检测navigator.language, 但是其实这个其实并不可靠,因为用户是可以修改浏览器的语言的。
  • 直接在页面提供一个select列表,然后根据选择的语言来切换页面语言。这个也是AJAX来实现。 好处是比较可靠,切换语言是可控的。但是缺点就是要手动去选择了。

具体实现

实现思路
对于一个页面的多语言,我采用一个select列表来切换语言。
把整个功能作为做成一个jQuery插件。 同时我们需要把不同语言的具体字段内容用一个xml文件存起来放到服务器,我们通过Ajax来异步读取这个xml的内容,然后我们通过不同XML不同的标签来区分不同的语言。 然后用js自动生成option列表,以及切换语言。 利用onchange事件触发。
我用id来标识不同的字段内容。 但是这个做法需要在html也要设置一个跟在xml中完全对应的id。

XML文本如下:

<content>
    <type>
        <zh>zh</zh>
        <en>en</en>
    </type>
    <text id="head">
        <zh>Balight APP 新手指南</zh>
        <en>Balight APP User Guide</en>
        <DD>ASDASDASD</DD>
    </text>
    <text id="step2">
        <zh>步驟二:請將鋰電池安裝到Balight上。(務必要聽到清脆的"咔"聲才代表有穩固安裝)</zh>
        <en>Step 2 – Install the battery on your Balight.</en>
    </text>
    <text id="step3">
        <zh>步驟三:按下開關開啟Balight,開機時請靜止幾秒,此時正在水平校正,LED燈熄滅後即可開始騎動。</zh>
        <en>Step 3 – Press and hold the Power Button until the LED turns on. The LED should light up in 5 seconds. If the LED is not on, contact support at support@balight.com.</en>
    </text>
    <text id="connect">
        <zh>連接您的Balight</zh>
        <en>Connect your Balight to your Balight App</en>
    </text>


</content>

用XML的好处是易读性较好,而且标签也是完全自己定义的。
用JSON也可以只是可读性没那么好。
扩展语言的话,只需要增加一个新的标签即可。

jQuery代码:

(function($){

    $.fn.cloudLang = function(params){

     /*   var defaults = {
            file: 'lang_Content.xml',
            lang: 'en'
        }*/

        var aTexts ={};


        $.ajax({
              type: "GET",
              url: params.file,
              dataType: "xml",
              success: function(xml){
                            //这里是遍历解析XML文档
                            $(xml).find('text').each(function()
                            {
                                var textId = $(this).attr("id");//提取id的值
                                var text = $(this).find(params.lang).text();//找到所有<zh> or <en> 标签
                                aTexts[textId] = text;//存储文本到这个数组中
                            });
                            // 遍历HTML文档每个id,然后替换文本
                            for(var id in aTexts){
                                $('#'+id).text(aTexts[id]);
                            }
            }
        });
    };

})(jQuery);
$(document).ready(function(){
    function createOptions(){
        //var select=document.getElementById('language');
        var selectx=$('#language');
        $.get('lang_Content.xml',function(data){
            var xml=$(data);
            xml.find('type').children().each(function(){
                var text=$(this).text();
                selectx.append('<option value="'+text+'">'+text+'</option>');
            });
        });
    }
    createOptions();

    $('#language').on('change',function(){
        var value=$('#language').val();
        //console.log(value);
        //根据下拉列表选择的进行填充
        $('body').cloudLang({lang:value,file:"lang_Content.xml"});
    });
});

遇到的主要问题
用Ajax读取XML的内容,来生成option,select列表一刷新出来是没有一个默认的选定值的。这样就会需要切换几次这个列表才能使得切换是有效的。还有就是你多次选了同一个值,这个值刚好是默认值,它就不会显示出来。

<select name="language" id="language">
</select>

我们可以通过以下代码给一个默认的选定值:

$('#language option:last-child')[0].selected=true

select添加option要注意的是:
标准的做法是s.options.add(new Option(text,value));

注意在IE6的话,要先添加option到select中,否则是空白的:

   s.appendChild(option);
     option.text = 'hello world';
     option.value =3;

还有就是使用jQueryMobile的话,会有bug,就是select一开始是没有显示出选定的option的值的 !

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 基于 AJAX 的多层架构开发项目,需要考虑以下几个方面: 1.前端技术 前端技术包括 HTML、CSS、JavaScript 等,其中 JavaScript 是 AJAX 技术的核心。可以使用 jQuery、Vue.js、React 等前端框架来简化开发。 2.后端技术 后端技术可以选择 PHP、Java、Python 等语言,使用框架例如 SpringMVC、Django、Flask 等来实现数据的处理和存储。 3.AJAX 技术 AJAX 技术可以通过 XMLHttpRequest 对象来实现。通过 AJAX 可以异步地请求后端数据,并将数据插入到前端页面中,从而实现无刷新的页面交互效果。 4.多层架构 多层架构包括表现层、业务逻辑层和数据访问层。表现层负责前端页面的展示和交互,业务逻辑层负责业务逻辑的处理,数据访问层负责数据的存储和访问。 在多层架构中,前端页面通过 AJAX 技术向业务逻辑层发起请求,业务逻辑层处理请求并访问数据访问层,最终将处理结果返回给前端页面。 综上所述,基于 AJAX 的多层架构开发项目需要掌握前端技术、后端技术、AJAX 技术和多层架构的相关知识。 ### 回答2: 基于Ajax的多层架构开发项目是一种基于Web的应用程序开发模式。它将应用程序的不同层次分离开来,包括展示层、业务逻辑层和数据访问层,并通过Ajax(Asynchronous JavaScript and XML)技术实现前后端之间的数据交互和异步通信。 该多层架构开发项目具有以下特点: 1. 分离前后端:通过Ajax技术,前端页面与后端服务器之间的数据交互可以实现无需刷新页面的异步通信,提高用户体验。前端使用JavaScript异步请求数据并将结果动态更新到页面上,后端则负责处理请求并返回所需数据。 2. 提高响应速度:由于Ajax的异步特性,前端可以同时发送多个请求,从而减少页面加载时间和数据传输时间。用户能够迅速地获取数据,同时可以在等待数据的同时进行其他操作。 3. 可重用性和可维护性:将应用程序的不同层次分离开来,使得各个层次的代码更清晰、更易于维护。开发人员可以专注于各自层次的开发,降低代码耦合度,提高代码重用性。 4. 安全性增强:通过Ajax技术,可以减少对敏感数据的暴露,因为只有在用户请求数据时才会传输相关数据,提高了应用程序的安全性。 5. 提供更好的用户体验:通过无需刷新页面的数据更新,用户能够更快地获取所需信息,并能够在页面上进行实时交互,提高了用户的满意度和使用体验。 总之,基于Ajax的多层架构开发项目能够提供更好的用户体验、提高响应速度、增强应用程序的安全性,并且具有良好的代码结构和可维护性,是一种值得推荐的开发模式。 ### 回答3: 基于Ajax的多层架构开发项目是一种用于构建Web应用程序的技术方案。它将应用程序的不同部分划分为多个层次,每个层次负责不同的功能和任务,通过Ajax技术进行交互和通信。 这种架构一般由以下几层组成: 1. 表示层:负责将用户界面展示给用户,并接收用户的交互请求。通常使用HTML、CSS和JavaScript编写,可以实现动态内容的呈现和用户界面的交互。 2. 业务逻辑层:负责处理用户请求并进行业务处理。它包含了应用程序的核心逻辑,处理用户的操作和请求,并与数据访问层进行交互。这一层通常使用服务器端的脚本语言(如PHP、Python或Java)来实现。 3. 数据访问层:负责与数据库进行数据的读取、写入和更新操作。通过与数据库进行交互,将数据传递给业务逻辑层进行处理,并将处理结果返回给表示层。在这一层,可以使用SQL语言编写数据库操作语句。 4. 数据库层:负责存储应用程序的数据。可以使用关系型数据库(如MySQL、Oracle)或非关系型数据库(如MongoDB)来存储数据。 通过Ajax技术,这些不同层次的组件可以实现快速、无刷新的数据交互。在用户与应用程序进行交互时,表示层可以通过Ajax技术发送异步请求到业务逻辑层,业务逻辑层再与数据访问层进行交互,最后将结果返回给表示层用于页面的更新。 基于Ajax的多层架构开发项目具有以下优势: 1. 增强用户体验:通过Ajax技术,实现了快速响应和无刷新的数据更新,提高了用户与应用程序的交互体验。 2. 解耦合性:通过将应用程序的不同部分划分为多个层次,实现了各组件之间的解耦合,方便维护和扩展。 3. 可重用性:每个层次只负责特定的功能和任务,可以实现组件的重用,提高开发效率。 4. 安全性:通过合理的权限控制和加密机制,保障了数据的安全性。 综上所述,基于Ajax的多层架构开发项目可以提升Web应用程序的性能、可维护性和用户体验,并提供了一种灵活可扩展的架构设计。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值