Trong trường hợp ứng dụng web JSP / Servlet cơ bản, cách tiếp cận cơ bản sẽ là sử dụng JSTL fmt
taglib kết hợp với các gói tài nguyên . Gói tài nguyên chứa các cặp khóa-giá trị trong đó khóa là một hằng số giống nhau cho tất cả các ngôn ngữ và giá trị khác nhau trên mỗi ngôn ngữ. Gói tài nguyên thường là các tệp thuộc tính được tải bởi ResourceBundle
API. Tuy nhiên, điều này có thể được tùy chỉnh để bạn có thể tải các cặp khóa-giá trị từ cơ sở dữ liệu chẳng hạn.
Đây là ví dụ về cách quốc tế hóa biểu mẫu đăng nhập ứng dụng web của bạn với các gói tài nguyên dựa trên tệp thuộc tính.
Tạo các tệp sau và đặt chúng trong một số gói, ví dụ com.example.i18n
(trong trường hợp của Maven, hãy đặt chúng vào cấu trúc gói bên trong src/main/resources
).
text.properties
(chứa các cặp khóa-giá trị bằng ngôn ngữ mặc định, thường là tiếng Anh)
login.label.username = Tên người dùng
login.label.password = Mật khẩu
login.button.submit = Đăng nhập
text_nl.properties
(chứa nl
cặp khóa-giá trị tiếng Hà Lan ( ))
login.label.username = Gebruikersnaam
login.label.password = Wachtwoord
login.button.submit = Inloggen
text_es.properties
(chứa es
cặp khóa-giá trị tiếng Tây Ban Nha ( ))
login.label.username = Nombre de usuario
login.label.password = Contraseña
login.button.submit = Acceder
Tên tệp gói tài nguyên phải tuân theo mẫu sau name_ll_CC.properties
. Phần _ll
này phải là mã ngôn ngữ ISO 693-1 chữ thường . Nó là tùy chọn và chỉ được yêu cầu bất cứ khi nào _CC
phần này có mặt. Phần _CC
phải là mã quốc gia ISO 3166-1 Alpha-2 viết hoa . Nó là tùy chọn và thường chỉ được sử dụng để phân biệt giữa các phương ngữ ngôn ngữ cụ thể của quốc gia, như tiếng Anh Mỹ ( _en_US
) và tiếng Anh Anh ( _en_GB
).
Nếu vẫn chưa hoàn tất, hãy cài đặt JSTL. Nếu bạn đang chạy trên vùng chứa Servlet 2.5 hoặc mới hơn (Tomcat 6.0, v.v.) và của bạn web.xml
được tuyên bố là phù hợp với đặc tả Servlet 2.5, thì chỉ cần đặt jstl-1.2.jar vào /WEB-INF/lib
thư mục của webapp .
Tạo tệp JSP mẫu sau và đặt nó trong thư mục nội dung web.
login.jsp
<%@ page pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<c:set var="language" value="${not empty param.language ? param.language : not empty language ? language : pageContext.request.locale}" scope="session" />
<fmt:setLocale value="${language}" />
<fmt:setBundle basename="com.example.i18n.text" />
<!DOCTYPE html>
<html lang="${language}">
<head>
<title>JSP/JSTL i18n demo</title>
</head>
<body>
<form>
<select id="language" name="language" onchange="submit()">
<option value="en" ${language == 'en' ? 'selected' : ''}>English</option>
<option value="nl" ${language == 'nl' ? 'selected' : ''}>Nederlands</option>
<option value="es" ${language == 'es' ? 'selected' : ''}>Español</option>
</select>
</form>
<form method="post">
<label for="username"><fmt:message key="login.label.username" />:</label>
<input type="text" id="username" name="username">
<br>
<label for="password"><fmt:message key="login.label.password" />:</label>
<input type="password" id="password" name="password">
<br>
<fmt:message key="login.button.submit" var="buttonValue" />
<input type="submit" name="submit" value="${buttonValue}">
</form>
</body>
</html>
Các <c:set var="language">
quản lý ngôn ngữ hiện tại. Nếu ngôn ngữ được cung cấp dưới dạng tham số yêu cầu (theo ngôn ngữ thả xuống), thì ngôn ngữ đó sẽ được đặt. Nếu ngôn ngữ khác đã được đặt trước đó trong phiên, thì thay vào đó hãy sử dụng ngôn ngữ đó. Khác sử dụng ngôn ngữ do người dùng cung cấp trong tiêu đề yêu cầu.
Bộ <fmt:setLocale>
định vị cho gói tài nguyên. Điều quan trọng là dòng này là trước khi các <fmt:setBundle>
.
Khởi <fmt:setBundle>
tạo gói tài nguyên theo tên cơ sở của nó (nghĩa là tên gói đủ điều kiện đầy đủ cho đến khi có tên duy nhất không có mã _ll_CC
định nghĩa).
Việc <fmt:message>
truy xuất giá trị thông báo bằng khóa gói được chỉ định.
Nó <html lang="${language}">
thông báo cho các rô bốt tìm kiếm ngôn ngữ của trang để nó không bị đánh dấu là nội dung trùng lặp (do đó, tốt cho SEO).
Trình đơn ngôn ngữ thả xuống sẽ được JavaScript gửi ngay lập tức khi ngôn ngữ khác được chọn và trang sẽ được làm mới bằng ngôn ngữ mới được chọn.
Tuy nhiên, bạn cần lưu ý rằng các tệp thuộc tính được đọc theo mặc định bằng cách sử dụng mã hóa ký tự ISO-8859-1. Bạn sẽ cần phải thoát khỏi chúng bằng cách thoát unicode. Điều này có thể được thực hiện bằng cách sử dụng native2ascii.exe
công cụ do JDK cung cấp . Xem thêm phần bài viết này để biết thêm chi tiết.
Một giải pháp thay thế trên lý thuyết sẽ là cung cấp một gói có tùy chỉnh Control
để tải các tệp đó dưới dạng UTF-8, nhưng rất tiếc điều đó không được hỗ trợ bởi fmt
taglib JSTL cơ bản . Bạn sẽ cần phải tự mình quản lý tất cả với sự trợ giúp của a Filter
. Có những khung công tác (MVC) có thể xử lý điều này theo cách minh bạch hơn, như JSF, hãy xem thêm bài viết này .