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?
#UI_en.properties
#About
about.alert.header=About
about.alert.content=Version: {0}\nAuthor: {1}\nWebsite: {2}
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 ? >>
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");
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;
}
}
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;
}
}
}
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();
}
}
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