i18n trong Spring MVC là gì? Hướng dẫn tạo ứng dụng web đa ngôn ngữ

Khi ứng dụng của bạn là chỉ dành riêng cho người dùng Việt Nam, tất nhiên chúng ta không cần nghĩ đến việc tạo một ứng dụng web đa ngôn ngữ. Nhưng ngược lại, nếu ứng dụng là global cho tất cả các quốc gia, việc sử dụng i18n trong Spring MVC là một điều nên làm.

Demo sẽ làm được sau bài viết:

i18n là gì?

i18n hay còn gọi là quốc tế hóa trong tiếng Anh viết tắc của từ Internationalization, vì có 18 chữ cái ở giữa chữ cái i và chữ cái n nên hay được gọi ngắn gọn là i18n. Tring bài viết này mình xin sẽ hướng dẫn các bạn các để cấu hình cũng như sử dụng i18n, áp dụng vào dự án thực tế với Spring MVC.

Tạo ứng dụng web đa ngôn ngữ

Với Spring MVC đã hỗ trợ các lớp có sẵn từ các library mà chúng ta depencdencty  trong file pom.xml hay download về và đặt các tập tin file jar vào thư mục WEB-INF/lib,

Trong bài viết này, các bạn vui lòng nếu chưa biết gì spring mvc, xem lại loạt bài hướng dẫn của tôi tại đây.

Chúng ta cùng nhau bắt đầu một dự án đa ngôn ngữ:

Tạo controller: DemoController.java

package com.itphutran.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class DemoController {

	@RequestMapping(value = "/menu", method = RequestMethod.GET)
	public String demo() {
		return "menu";
	}
}

View: login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
 <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>  
 <%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%>  
 <%@taglib prefix="spring" uri="http://www.springframework.org/tags" %> 
<!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>Demo Spring MVC</title>
<style type="text/css">
	.wrrapper li {
		float:left; 
		margin-left:20px;
	}
	ul {
		list-style: none;
	}
	
	.wrrapper{
		padding: 30px;
		margin: 30px auto;
		border:  4px solid #bbb;
		border-radius: 10px;
		width:700px;
	}
	.lang p{
		float:left;
		width: 120px;
	}	
	.lang ul{
		float:left;
		width: 100px;
		font-size:10px;
	}	
	p{
		font-weight:bold;
		font-size: 12px;
	}
	.clr{
		clear: both;
	}
	.lang{
		width: 400xp;
	}
</style>
</head>
<body>
	<div class="wrrapper">
		<h1>i18n trong Spring MVC là gì? Hướng dẫn tạo ứng dụng web đa ngôn ngữ</h1>
		<div class="lang">
			<p>Chuyển đổi ngôn ngữ</p>
			<ul>
				<li> <a href="${pageContext.request.contextPath}/login?lang=vi" >Viet Nam</a></li>
				<li> <a href="${pageContext.request.contextPath}/login?lang=en" >English</a></li>
			</ul>
			<div class="clr"></div>
		</div>
		
		<div class="content">
			<h2>Đăng nhập vào hệ thống</h2>
			<form>
				<table>
					<tr>
						<td>
							<label>Tên đăng nhập</label>
						</td>
						<td>
							<input type="text" value="" name="username">
						</td>
					</tr>
					
					<tr>
						<td>
							<label>Mật khẩu</label>
						</td>
						<td>
							<input type="password" value="" name="password">
						</td>
					</tr>
					
					<tr>
						<td>
						</td>
						<td>
							<input type="submit" value="Đăng nhập" name="submit">
							<input type="reset" value="Nhập lại" name="reset">
						</td>
					</tr>
				</table>	
			</form>
		</div>
	</div>
</body>
</html>

File distpatcher-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        ">
	<mvc:annotation-driven />
	<context:component-scan base-package="com.itphutran.controller" />
		
	<bean id="viewResolver"
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/views/" />
		<property name="suffix" value=".jsp" />
	</bean>
	
	<bean id="messageSource"  
             class="org.springframework.context.support.ReloadableResourceBundleMessageSource">  
        <property name="basename" value="classpath:messages" />  
        <property name="defaultEncoding" value="UTF-8"/>  
      </bean>
  
      <bean id="localeChangeInterceptor"  
        class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">  
        <property name="paramName" value="lang" />  
      </bean>  

      <bean id="localeResolver"  
        class="org.springframework.web.servlet.i18n.SessionLocaleResolver">  
        <property name="defaultLocale" value="vi"/>  
      </bean>  

      <mvc:interceptors>  
           <bean parent="localeChangeInterceptor"/>  
      </mvc:interceptors>  
      
</beans>

Nhìn vào file dispatcher-servlet.xml trên,  chúng ta hãy đi đến những giải thích trong file cấu hình spring để hiểu hơn về cách sử dụng i18n.

Đầu tiên ta cấu hình view spring spring mvc, và trong bài viết này đang sử dụng view InternalResourceViewResolver.

Tiếp theo, ta thêm vào file cấu hình để khởi tạo một đối tượng của lớp ReloadableResourceBundleMessageSource. Trong class này có một thuộc tính là baseName, ta phải chỉ ra rằng giá trị của thuộc tính baseName là tên của file tài nguyên mà ở đó ta lấy nội dung ra từ các file tương ứng với các đoạn text khác nhau vì tùy theo mỗi quốc gia. Với defaultEncoding để set font chữ hiển thị được tiếng việt.

Thuộc tính  “classpath:” chỉ ra rằng vị trí của các file tài nguyên là nằm trong class path. Với project bình thường với web, chúng ta đặt trong classes, nhưng với project bằng maven các bạn đặt trong src hay resource..

Như vậy chúng cần phải tạo ra các file .properties tương ứng. Tên của các file này sẽ bao gồm tên gốc mà chúng ta chỉ ra ở trên. Ngoài ra tiếp nối theo sau sẽ là mã của một ngôn ngữ nhất định.

Ví dụ : english : en / Việt Nam : vi , Pháp : fr … vv

Với ứng dụng như demo trên, chúng ta đang sử dụng hai ngôn ngữ chính là viet nam và english nên các bạn cần tọa ra hai file properties là messageslà messages_vi.properties và messages.properties.

Tiếp đến ta có class  org.springframework.web.servlet.i18n.LocaleChangeInterceptor. Trước khi request được xử lý bởi Controller, nó phải đi qua các Interceptors, và ở đây bạn cần đăng ký LocaleChangeInterceptor,Interceptor này xử lý các thay đổi Locale từ phía người dùng. Nghĩa là một ứng dụng chạy lên, thì mức độ ưu tiên của intercepter trước servlet, vậy nên mọi request đến trước lhi đến controller xử lý nó được xử lý bởi intercepter.

Với spring mvc, chúng ta chỉ cần nói cho spring biết chúng ta đang muốn đăng ký quốc tế hóa ngôn ngữ bằng sử dụng bean cấu hình và áp dụng class như trên. ( org.springframework.web.servlet.i18n.LocaleChangeInterceptor.)Trong class trên chúng ta có thuộc tính là paramName, thuộc tính paramName dùng để khởi tạo biến param, dựa vào biến này mà i18n có thể biết được chúng ta đang muốn sử dụn ngôn ngữ nào.

Ở đây các bạn có thể hiểu nôm là tham số trên url, ví dụ như ?lang=vi, hay ?lang=en…vv

SessionLocaleResolver  là một class được tạo ra để lưu giá trị của ngôn ngữ hiện tại vào session. Nếu như không tìm được thông tin trong session thì sẽ báo interceptor để load thông tin từ file tài nguyên của ngôn ngữ mặc định. Và tất nhiên chúng ta có thể cho giá trịnh mặc định là ngôn ngữ nào bằng cách sử dụng thuộc tính: defaultLocale.Trong ví dụ này tôi đang sử dụng là Việt Nam.

Nội dung của hai file như sau:

messages_vi.properties

login.title=Đăng nhập vào hệ thống login.username=Tên đăng nhập login.password=Mật khẩu login.reset=Nhập lại login.submit=Đăng nhập login.h1=i18n trong Spring MVC là gì? Hướng dẫn tạo ứng dụng web đa ngôn ngữ login.lang=Ngôn ngữ

messages.properties

login.title=Login into system
login.username=Username
login.password=Password
login.reset=Reset
login.submit=Login
login.h1=What is i18n in Spring MVC? Guide to creating multilingual web application
login.lang=Langguage

 

Chúng ta sửa lại view login,jsp

<div class="wrrapper">
		<h1><spring:message code="login.h1"/></h1>
		<div class="lang">
			<p><spring:message code="login.lang"/> :</p>
			<ul>
				<li> <a href="${pageContext.request.contextPath}/login?lang=vi" >Viet Nam</a></li>
				<li> <a href="${pageContext.request.contextPath}/login?lang=en" >English</a></li>
			</ul>
			<div class="clr"></div>
		</div>
		
		<div class="content">
			<h2> <spring:message code="login.title"/></h2>
			<form>
				<table>
					<tr>
						<td>
							<label><spring:message code="login.username"/></label>
						</td>
						<td>
							<input type="text" value="" name="username">
						</td>
					</tr>
					
					<tr>
						<td>
							<label><spring:message code="login.password"/></label>
						</td>
						<td>
							<input type="password" value="" name="password">
						</td>
					</tr>
					
					<tr>
						<td>
						</td>
						<td>
							<input type="submit" value="<spring:message code="login.submit"/>" name="submit">
							<input type="reset" value="<spring:message code="login.reset"/>" name="reset">
						</td>
					</tr>
				</table>	
			</form>
		</div>

Như đã thấy ở trên, muốn hiển thị ra được nội dung từ các file messages thì chúng ta sử dụng <spring:message code=”key”/>

Qua bài viết này, chúng ta đã hiểu hơn về i18n trong java cũng như biết cách áp dụng qua project thực tế như form login. Hy vọng sẽ giúp ích cho các bạn!

 

0 0 đánh giá
Đánh giá bài viết
Theo dõi
Thông báo của
guest
0 Góp ý
Phản hồi nội tuyến
Xem tất cả bình luận
x