JSP 国际化


在开始前,需要解释几个重要的概念:

  • 国际化(i18n):表明一个页面根据访问者的语言或国家来呈现不同的翻译版本。
  • 本地化(l10n):向网站添加资源,以使它适应不同的地区和文化。比如网站的印度语版本。
  • 区域:这是一个特定的区域或文化,通常认为是一个语言标志和国家标志通过下划线连接起来。比如"en_US"代表美国英语地区。

如果想要建立一个全球化的网站,就需要关心一系列项目。本章将会详细告诉您如何处理国际化问题,并给出了一些例子来加深理解。

JSP容器能够根据request的locale属性来提供正确地页面版本。接下来给出了如何通过request对象来获得Locale对象的语法:

  1. java.util.Locale request.getLocale()

检测Locale

下表列举出了Locale对象中比较重要的方法,用于检测request对象的地区,语言,和区域。所有这些方法都会在浏览器中显示国家名称和语言名称:

序号 方法 & 描述
1 String getCountry() 返回国家/地区码的英文大写,或 ISO 3166 2-letter 格式的区域
2 String getDisplayCountry() 返回要显示给用户的国家名称
3 String getLanguage() 返回语言码的英文小写,或ISO 639 格式的区域
4 String getDisplayLanguage() 返回要给用户看的语言名称
5 String getISO3Country() 返回国家名称的3字母缩写
6 String getISO3Language() 返回语言名称的3字母缩写

实例演示

这个例子告诉我们如何在JSP中显示语言和国家:

  1. <%@ page import="java.io.*,java.util.Locale" %>
  2. <%@ page import="javax.servlet.*,javax.servlet.http.* "%>
  3. <%
  4. //获取客户端本地化信息
  5. Locale locale = request.getLocale();
  6. String language = locale.getLanguage();
  7. String country = locale.getCountry();
  8. %>
  9. <html>
  10. <head>
  11. <title>Detecting Locale</title>
  12. </head>
  13. <body>
  14. <center>
  15. <h1>Detecting Locale</h1>
  16. </center>
  17. <p align="center">
  18. <%
  19. out.println("Language : " + language + "<br />");
  20. out.println("Country : " + country + "<br />");
  21. %>
  22. </p>
  23. </body>
  24. </html>

语言设置

JSP可以使用西欧语言来输出一个页面,比如英语,西班牙语,德语,法语,意大利语等等。由此可见,设置Content-Language信息头来正确显示所有字符是很重要的。

第二点就是,需要使用HTML字符实体来显示特殊字符,比如"&#241;" 代表的是"?","&#161;"代表的是 "?" :

  1. <%@ page import="java.io.*,java.util.Locale" %>
  2. <%@ page import="javax.servlet.*,javax.servlet.http.* "%>
  3. <%
  4. // Set response content type
  5. response.setContentType("text/html");
  6. // Set spanish language code.
  7. response.setHeader("Content-Language", "es");
  8. String title = "En Espa?ol";
  9.  
  10. %>
  11. <html>
  12. <head>
  13. <title><% out.print(title); %></title>
  14. </head>
  15. <body>
  16. <center>
  17. <h1><% out.print(title); %></h1>
  18. </center>
  19. <div align="center">
  20. <p>En Espa?ol</p>
  21. <p>?Hola Mundo!</p>
  22. </div>
  23. </body>
  24. </html>

区域特定日期

可以使用java.text.DateFormat类和它的静态方法getDateTimeInstance()来格式化日期和时间。接下来的这个例子显示了如何根据指定的区域来格式化日期和时间:

  1. <%@ page import="java.io.*,java.util.Locale" %>
  2. <%@ page import="javax.servlet.*,javax.servlet.http.* "%>
  3. <%@ page import="java.text.DateFormat,java.util.Date" %>
  4.  
  5. <%
  6. String title = "Locale Specific Dates";
  7. //Get the client's Locale
  8. Locale locale = request.getLocale( );
  9. String date = DateFormat.getDateTimeInstance(
  10. DateFormat.FULL,
  11. DateFormat.SHORT,
  12. locale).format(new Date( ));
  13. %>
  14. <html>
  15. <head>
  16. <title><% out.print(title); %></title>
  17. </head>
  18. <body>
  19. <center>
  20. <h1><% out.print(title); %></h1>
  21. </center>
  22. <div align="center">
  23. <p>Local Date: <% out.print(date); %></p>
  24. </div>
  25. </body>
  26. </html>

区域特定货币

可以使用java.text.NumberFormat类和它的静态方法getCurrencyInstance()来格式化数字。比如在区域特定货币中的long型和double型。接下来的例子显示了如何根据指定的区域来格式化货币:

  1. <%@ page import="java.io.*,java.util.Locale" %>
  2. <%@ page import="javax.servlet.*,javax.servlet.http.* "%>
  3. <%@ page import="java.text.NumberFormat,java.util.Date" %>
  4.  
  5. <%
  6. String title = "Locale Specific Currency";
  7. //Get the client's Locale
  8. Locale locale = request.getLocale( );
  9. NumberFormat nft = NumberFormat.getCurrencyInstance(locale);
  10. String formattedCurr = nft.format(1000000);
  11. %>
  12. <html>
  13. <head>
  14. <title><% out.print(title); %></title>
  15. </head>
  16. <body>
  17. <center>
  18. <h1><% out.print(title); %></h1>
  19. </center>
  20. <div align="center">
  21. <p>Formatted Currency: <% out.print(formattedCurr); %></p>
  22. </div>
  23. </body>
  24. </html>

区域特定百分比

可以使用java.text.NumberFormat类和它的静态方法getPercentInstance()来格式化百分比。接下来的例子告诉我们如何根据指定的区域来格式化百分比:

  1. <%@ page import="java.io.*,java.util.Locale" %>
  2. <%@ page import="javax.servlet.*,javax.servlet.http.* "%>
  3. <%@ page import="java.text.NumberFormat,java.util.Date" %>
  4.  
  5. <%
  6. String title = "Locale Specific Percentage";
  7. //Get the client's Locale
  8. Locale locale = request.getLocale( );
  9. NumberFormat nft = NumberFormat.getPercentInstance(locale);
  10. String formattedPerc = nft.format(0.51);
  11. %>
  12. <html>
  13. <head>
  14. <title><% out.print(title); %></title>
  15. </head>
  16. <body>
  17. <center>
  18. <h1><% out.print(title); %></h1>
  19. </center>
  20. <div align="center">
  21. <p>Formatted Percentage: <% out.print(formattedPerc); %></p>
  22. </div>
  23. </body>
  24. </html>