JavaWeb之多語言國際化


這周打算把國際化、JDBC和XML學習一下,從下周就開始學習三大框架,再堅持一個半月吧就能入門JavaWeb了,上周周末兩天過的真是生不如死,兩天坐在家里,醒來就寫博客,原本在公司也自己操作了一遍,其實不用寫也可以,不過想着為了加深印象,還是自己寫出來這樣印象更深,基礎更扎實,學習編程就和當兵一樣,平時多流汗,戰時少流血,平時解決的bug多了,那以后遇到類似的就會學會避免出錯。還是接着上面的博客留下的坑來說。上一博客jsp標簽庫中留了幾個標簽,其中就有今天要學的多語言國際化的。

一、資源國際化、資源本地化

I18N:Internationalization,資源國際化,I10N,Localization,資源本地化,個人的感覺兩者沒什么區別,可能是主體不一樣,國際化是對於開發運營者來說,本地化對於用戶來說。

二、資源文件編碼

資源文件屬性名為properties,保存的是key-value形式的屬性對,必須為ASCII字符,由於中文、日文等是采用Unicode字符,所以要對其進行轉碼。轉碼可以使用JDK自帶的native2ascii.exe工具,位於JDK安裝目錄的bin文件下,可以使用命令行native2ascii -[options] [inputfile] [outputfile],其中options包括-encoding encoding_name 或reverse.-encoding encoding_name是將文件按照encoding_name指定的格式轉化,reverse將編碼后的文件還原,encoding可省略,如果指定,一定要與原文件編碼方式一致,否則會出現亂碼。

先在E:\java文件夾下新建了一個messages.txt的文件,然后寫入prompt.hello=您好!。打開命令行輸入native2ascii命令,如上圖可能會報錯,如果報錯可能是因為JDK沒寫入環境變量path中,也可以直接打開jdk的bin文件夾,在其文件夾下使用native2ascii命令,然后會自動輸出對應的資源文件。這里我輸出的是與源文件文件名一樣的,也可以直接輸出messages_zh_CN.properties.

prompt.hello=\u60a8\u597d!

三、資源文件的使用

1.不帶參數的資源文件

在WebContent/WEB-INF下創建classes文件夾,然后在文件夾下創建resources文件夾,之后把編碼過的資源文件引入,由於我沒在轉碼時直接轉成帶有locale的,所以改名為messages_zh_CN.properties.最后創建一個messages.properties資源文件用於做為默認的資源文件,如果找不到就顯示這里面的。

在使用中就要用到上一博客的fmt標簽庫的標簽:<fmt:bundle/><fmt:message/><fmt:setBundle/>

<fmt:bundle basename="resources/messages" prefix="prompt.">
<fmt:message key="hello">
</fmt:message>
</fmt:bundle>

<fmt:bundle/><使用basename指定資源文件,如果資源文件有相同的前綴,可以使用prefix,這里messages資源文件用的prompt.hello,所以prefix="prompt.".

<fmt:message/>:顯示資源文件,通過key顯示找到對應的value。其實<fmt:message/>還有另外3個屬性:var、scope、bundle.

var:聲明var屬性,message返回的資源就會存儲到var變量中而不寫到JSP中。

scope:這個不說了,用的地方好多。

bundle:聲明被綁定的資源,與setbundle一起使用。

默認的是中文,如果想驗證英文,可以在:<fmt:bundle>上增加設置locale.

<fmt:setLocale value="en"/>

2.帶參數的資源文件

在上面的是不帶參數的資源文件,但在開發過程中往往有一些變量,這樣的話就需要帶參數的資源文件。

<fmt:bundle basename="resources/messages" prefix="prompt.">
<fmt:message key="hello">
</fmt:message>
<br>
<fmt:message key="info">
<fmt:param value="${pageContext.request.remoteAddr}"></fmt:param>
<fmt:param value="${pageContext.request.locale}"></fmt:param>
<fmt:param value="${pageContext.request.locale.displayLanguage}"></fmt:param>
</fmt:message>
</fmt:bundle>

3.<fmt:setBundle/>標簽

<fmt:setBundle/><fmt:bundle/>兩者的關系和<fmt:setTimeZone/><fmt:TimeZone/>兩個的關系類似。><fmt:bundle/>只作用的標簽范圍內,<fmt:setBundle/>標簽作用在scope范圍內。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<!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>

<fmt:bundle basename="resources/messages" prefix="prompt.">
<fmt:message key="hello">
</fmt:message>
<br>
<fmt:message key="info">
<fmt:param value="${pageContext.request.remoteAddr}"></fmt:param>
<fmt:param value="${pageContext.request.locale}"></fmt:param>
<fmt:param value="${pageContext.request.locale.displayLanguage}"></fmt:param>
</fmt:message>
</fmt:bundle>
<br>
<fmt:setBundle basename="resources/messages" var="resource" scope="request"/>
<fmt:message bundle="${ resource}" key="prompt.hello"></fmt:message>
<fmt:message bundle="${ resource}" key="prompt.info">
<fmt:param>${pageContext.request.remoteAddr}</fmt:param>
<fmt:param value="${pageContext.request.locale}"></fmt:param>
<fmt:param value="${pageContext.request.locale.displayLanguage}"></fmt:param>
</fmt:message>
</body>
</html>

setBundle把資源映射到var="resource"變量中,message利用bundle綁定資源顯示。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM