Openlibs.i18n

The lib of java internationalization, includes resource bundle and db implementation

Download as .zip Download as .tar.gz View on GitHub

Usage

Quick usage for the implementation java.util.ResourceBundle

1. Directly use pack name
//resource pack dir and pack name; 
//put your resource bundle file Log.properties 
//under your project path "openthinks/libs/i18n/resource/i18n/"
String BASE_PACK_DIR = "openthinks/libs/i18n/resource/i18n/";
String LOG_PACK_NAME = "Log";
//get internationalization message from bundle properties file
//get default locale message
String message = I18n.getMessage(BASE_PACK_DIR + LOG_PACK_NAME, "1000");
//get special locale message
message = I18n.getMessage(BASE_PACK_DIR + LOG_PACK_NAME,Locale.UK, "1000");
2. Use customized IBundleMessageType
//define a customized message type, here is a enum;
//it also can be normal class just implement interface IBundleMessageType
public enum CustomizedMessageType implements IBundleMessageType{
LOG, EXCEPTION, UI;
 @Override
 public String value(){
	return name() + ":" + BASE_PACK_DIR + name();
 }
 @Override
 public String getPackName(){
		//openthinks/libs/i18n/resource/i18n/LOG
		//openthinks/libs/i18n/resource/i18n/EXCEPTION
		//openthinks/libs/i18n/resource/i18n/UI
		return BASE_PACK_DIR + name();
 }
 @Override
 public String getMessageType(){
		return name();
 }
 public static final String BASE_PACK_DIR = 
	"openthinks/libs/i18n/resource/i18n/"; 
}
//get default locale message
String message = I18n.getMessage(CustomizedMessageType.LOG, "1000");
//get special locale message
message = I18n.getMessage(CustomizedMessageType.LOG,Locale.UK, "1000");

Locale change in application

Use class I18nApplicationLocale
//example for Swing UI, make it as Observer 
//and register to I18nApplicationLocale
class UI extends JFrame implements Observer{
 private JButton button;
 private JLabel label;
				 		
 public UI(){
	//initialize component
	//register to I18nApplicationLocale
	I18nApplicationLocale.getInstance().addObserver(this);
 }				 
 // Overrides Observer
 public void update(Observable o, Object argument){
	setLocaleMessage();
 }
				 		
 public void setLocaleMessage(){
	button.setText(I18n.getMessage(CustomizedMessageType.UI,"2000"));
	label.setText(I18n.getMessage(CustomizedMessageType.UI,"2001"));
 }
}
// when the application locale changed, call the following statement
I18nApplicationLocale.getInstance().changeCurrentLocale(Locale.UK);

Advance options

1. Message format >>

Sometimes, we need to set some placeholders in localization message, so that, we can pass the parameters from code.
How to do this?
Define localization message like this in properties file:
#UI_en.properties
#About
about.alert.header=About
about.alert.content=Version: {0}\nAuthor: {1}\nWebsite: {2}
Pass the parameters like this:
I18n.getMessage(
CustomizedMessageType.UI,//message pack/component
"about.alert.content", //message id
"1.0", "Dailey Dai","http://openthinks.xyz"//message parameters
);
/* final format message
Version: 1.0
Author: Dailey Dai
Website: http://openthinks.xyz
 */

2. How to do database implementations ? >>

Prepared the table in database(mysql)
create table message(
message_id varchar(500),
message_locale varchar(100), 
message_content varchar(1000)
);
insert into message(message_id,message_locale,message_content) 
values("1000","zh_CN","你好");
insert into message(message_id,message_locale,message_content) 
values("1000","en_US","Hello");
Define the message entity to map the table(need to implement IMessage)
import java.util.Locale;
import openthinks.libs.i18n.IMessage;
import openthinks.libs.sql.entity.Entity;
import openthinks.libs.utilities.LocaleUtils;
/**
 * This entity solution is used my another lib openlibs.sql
 * chose your usually solution(JPA,Hibernate,JDO) to instead it.
 */
public class MessageEntity extends Entity 
	implements IMessage{
 private String message_id;//related column name in table
 private String message_locale;
 private String message_content;
 @Override
 public String getContent(){
	return message_content;
 }
 @Override
 public Locale getLocale(){
	return LocaleUtils.langToLocale(message_locale);
 }
 @Override
 public String getMessageId(){
	return message_id;
 }
 public void setMessageId(String messageId){
	this.message_id = messageId;
 }
 public void setLocale(String locale){
	this.message_locale = locale;
 }
 public void setContent(String content){
	this.message_content = content;
 }
}
Implemented the QueryEngine from database
import java.io.Serializable;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Locale;
import openthinks.libs.i18n.IMessage;
import openthinks.libs.i18n.implement.database.query.IQueryer;
import openthinks.libs.i18n.implement.database.query.QueryEngine;
import openthinks.libs.sql.dhibernate.Session;
import openthinks.libs.sql.dhibernate.support.SessionFactory;
import openthinks.libs.sql.lang.Configurator;
import openthinks.libs.sql.lang.ConfiguratorFactory;
/**
 * Implemented {@link QueryEngine} by openlibs.sql and JDBC
 * You can change the solution with Hibernate,JDO and other ORM
 */
public class QueryEngineJDBC extends QueryEngine{
 static{
	QueryEngine.registerQueryEngine(new QueryEngineJDBC());
 }
 @Override
 public IQueryer getQueryer(){
	return new JDBCQueryer();
 }
 class JDBCQueryer implements IQueryer{
 /**
 * implemented by openlibs.sql simple {@link Entity}
 */
 @Override
 public <T extends IMessage> T query(Class<T> entityClass, 
 		Serializable messageId, Locale locale) {
	Session session = SessionFactory.getSession();
	String sql = "SELECT * FROM message WHERE message_id=?"
	+" and message_locale= ?";
	T t = session.get(entityClass, sql, 
	new String[]{messageId.toString(),locale.toString()});
	session.close();
	return t;
 }
 /**
 * implement by JDBC
 */
 @Override
 public String query(String tableName, 
 		Serializable messageId, Locale locale){
	String content = null;
	Configurator configurator = 
	  ConfiguratorFactory.getDefaultInstance(getClass());
	try {
	 Class.forName(configurator.getDriver());
	 Connection conn = DriverManager.getConnection(
	 	configurator.getUrl(), 
	 	configurator.getUserName(),
	 	configurator.getUserPwd());
	 String sql = "SELECT * FROM " + tableName 
	 + " WHERE message_id=? and message_locale= ?";
	 PreparedStatement ps = conn.prepareStatement(sql);
	 ps.setString(1, (String) messageId);
	 ps.setString(2, locale.toString());
	 ResultSet rs = ps.executeQuery();
	 while (rs.next()) {
	 content = rs.getString("message_content");
	 }
	 rs.close();
	 ps.close();
	 conn.close();
	}catch (Exception e){
	 e.printStackTrace();
	}
	return content;
  }
 }
}
Define customized IPersistMessageType(option)
public enum MyPersistMessageType implements IPersistMessageType{
 ALL("message", MessageEntity.class);
 private MyPersistMessageType(String tableName,
 		Class<? extends IMessage> entityClass){
	this.tableName = tableName;
	this.entityClass = entityClass;
 }
 private String tableName;
 private Class<? extends IMessage> entityClass;
 @Override
 public String value(){
	return toString();
 }
 @SuppressWarnings("unchecked")
 @Override
 public <T extends IMessage> Class<T> getMessageEntityClass(){
	return (Class<T>) entityClass;
 }
 @Override
 public String getPersistName(){
	return tableName;
 }
 @Override
 public String getMessageType(){
	return toString();
 }
}
JUnit test case
public class I18n3TestForDB{
 @Before
 public void setUp() throws ClassNotFoundException{
	//configure method1:
	I18n.configurePackContext(
		new PersistMessageContext(
			new QueryEngineJDBC()));
	//configure method2:
	Class.forName(
		"openthinks.libs.i18n.database.QueryEngineJDBC");
	I18n.configurePackContext(new PersistMessageContext());
 }

 @Test
 public void testForQueryFromDB(){
	String actual = I18n.getMessage("message", 
		Locale.US,"1000");
	String expected = "Hello";
	Assert.assertEquals(expected, actual);

	actual = I18n.getMessage("message", 
		Locale.CHINA,"1000");
	expected = "你好";
	Assert.assertEquals(expected, actual);

	actual = I18n.getMessage("message", "1000");
	expected = "Hello";
	if (LocaleUtils.isSame(Locale.CHINA, 
		I18nApplicationLocale
			.getInstance().getCurrentLocale())){
			expected = "你好";
	}
	Assert.assertEquals(expected, actual);

	actual = I18n.getMessage("message", "XXXX");
	Assert.assertNull(actual);

	actual = I18n.getMessage("xxx", "XXXX");
	Assert.assertNull(actual);
 }

 @Test
 public void testForQueryEntityClass(){
	String actual = I18n.getMessage(MessageEntity.class, 
		Locale.US,"1000");
	String expected = "Hello";
	Assert.assertEquals(expected, actual);

	actual = I18n.getMessage(MessageEntity.class,
		Locale.CHINA,"1000");
	expected = "你好";
	Assert.assertEquals(expected, actual);

	actual = I18n.getMessage(MessageEntity.class,"1000");
	expected = "Hello";
	if (LocaleUtils.isSame(Locale.CHINA, 
		I18nApplicationLocale.
			getInstance().getCurrentLocale())){
		expected = "你好";
	}
	Assert.assertEquals(expected, actual);

	actual = I18n.getMessage(MessageEntity.class, "XXXX");
	Assert.assertNull(actual);

	actual = I18n.getMessage(MessageEntity.class, "XXXX");
	Assert.assertNull(actual);
 }

 @Test
 public void testForQueryByType(){
	String actual = I18n.getMessage(MyPersistMessageType.ALL,
		Locale.US,"1000");
	String expected = "Hello";
	Assert.assertEquals(expected, actual);
 }
}

Class Structure

Documentation API

Welcome to check the Java API for this library.
Click here.

Contact

Mailto: Dailey Dai