the5fire

关注Python、Django、Vim、Linux、Web开发、团队管理和互联网--Life is short, we need Python.


让软件国际化:把语言分离出来

作者:the5fire | 标签:     | 发布:2011-01-05 12:21 a.m. | 阅读量: 10136, 9795

市场上那些比较成熟的软件一般都具有语言选项,可以供不同国家的人使用。那些带有这项功能的软件的作者可谓是对自己的软件抱有很大的希望。当然,作为一个程序员,没人不想让自己的软件只能在自己手里使用,走向国际化也是我们的心声。(程序员A:我要国际化!!!)

包括你现在访问的我的这个网站,也是用着名的、国际化的WordPress程序架设的。一个国际化的程序的首要特点就是他可以是中文的也可以是英文的,也可以是xx文的。那么怎么实现的呢?

这里我用JSP+Servlet+JSTL+xml来简单的实现一下。记得把dom4j-1.6.1.jar和jstl.jar以及standard.jar拷到WEB-INF的lib文件下。

首先你需要建立一个类用来操作XML文件,XmlReader.java:

.. code:: java

package com.util;

import java.net.URL;
import java.util.*;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

/**
 * 读取xml中的内容
 * @author 胡阳
 *
 */
public class XmlReader {

    private static XmlReader instance = null;


    public synchronized static XmlReader getInstance() {

        if (instance == null) {
            instance = new XmlReader();
        }
        return instance;
    }

    private XmlReader() {

    }

    public Map getMenu(String type) {
        Map<String,Object> listMap = new HashMap<String,Object>();

        SAXReader reader = new SAXReader();
        Document doc;
        try {
            //采用url的方式读取文件
            URL url = Thread.currentThread().getContextClassLoader().getResource(type + ".xml");
            doc = reader.read(url);
            Element ele = doc.getRootElement();
            int count = ele.nodeCount();

            System.out.println(ele.getName() + count);
            for(Iterator i = ele.elementIterator(); i.hasNext(); ) { 
                Element element = (Element)i.next(); 
                listMap.put(element.attributeValue("id"), element.getText());
            } 
        } catch (DocumentException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

        return listMap;
    }
}

然后建立一个Servlet类,MenuServlet.java:

.. code:: java

package com.web;

import java.io.IOException;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.util.XmlReader;

/**
 * 得到菜单目录的Servlet
 * @author 胡阳
 *
 */
public class MenuServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String command = request.getParameter("language");

        if (null == command || "".equals(command)) {
            //默认选择中文
            command = "chinese";
        }

        Map listMenu = XmlReader.getInstance().getMenu(command);
        request.setAttribute("listMenu", listMenu);

        //页面转发
        request.getRequestDispatcher("/showMenu.jsp").forward(request, response);
    }


    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }

}

相应的我们需要配置一下web.xml文件:

::

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:javaee="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <servlet>
    <servlet-name>MenuServlet</servlet-name>
    <servlet-class>com.web.MenuServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>MenuServlet</servlet-name>
    <url-pattern>/servlet/MenuServlet</url-pattern>
  </servlet-mapping>
</web-app>

接着建立一个index.jsp:

::

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<frameset cols="20%,80%">

  <frame src="servlet/MenuServlet">
  <frame src="content.jsp">

</frameset>
<body>

</body>
</html>

接着是showMenu.jsp:

::

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> 
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
    function changeLanguage(field) {
            window.location="MenuServlet?language=" + field.value;
    }
</script>
</head>
<body>
    <div id="selectMenu">
        <select onchange="changeLanguage(this)">
            <option value="">-选择语言-</option>
            <option value="chinese">中文</option>
            <option value="english">English</option>
        </select>
        <span id="nowLanguage"></span>
    </div>
    <div id="menu">

        <ul>
            <c:forEach items="${listMenu}" var="entry">  
                   <li id="<c:out value="${entry.key}" />"><a href="#"><c:out value="${entry.value}" /></a> </li>  
            </c:forEach>  
        </ul>
    </div>
</body>
</html>

还有content.jsp:

::

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<p>内容页</p>
</body>
</html>

总结:

写这个的目的一方面是为了练习一下java操作xml以及使用JSTL,另一方面也分享一下这种设计思路。因为以前我们在做餐饮系统的时候,后来说客户连锁店开到了外国的一个什么地方,以后可能会要求改成英文的,当时的想法是把源代码改改,翻译一下其中的菜单,然后再次release。不过现在看来起初软件的设计的时候就没有搞清楚客户的状况。

- from the5fire.com
----EOF-----

微信公众号:Python程序员杂谈


其他分类: