Go AVDN
For Programmers

Set free from resource bundle classes and property files. The only files they need to work with are Java source files.

In a standard Java internationalisation procedure by now, you have to perpare separated ResourceBundle objects, by defining your own classes extending ResourceBundle , or writing properties files for text ResourceBundles. Anyway, these all require you work out of your program source files, and keep the key values consistent between your source code and those ResourceBundles, with your brain.

However, with Message Facility, things are much simpler, and less burdensome. You define String variables with constant values, and write comment on them as the internationalizable text pieces, finally you reference these pieces through variable names, so Java compiler will check and report your typos.

Easy and effective directions on the translation.

With Message Facility's message definition, you can declare how a piece of text will be used in your program, and translation issues may occur in your predication. All are just inplace! Besides the argument descriptions, a @usage can be used to speak your intention to all translators on your program.

More powerful dynamic formats support.

You use ChoiceFormat in ResourceBundle based internationalisation, to handle plurals. Plural handling is just as easy with JavaScript in Message Facility, as you have seen in the simple example. While js can handle more complex situations where ChoiceFormat can't. For this example:

/**
 * Logging in as {user} (this is your {num}{! 
 * var d = num%10; 
 * (num > 10 && num <= 20) ? "th" :
 * d == 1 ? "st" : d == 2 ? "nd" : d == 3 ? "rd" : "th"} login)...
 * 
 * @arg user : user named being logged in
 * @arg num = 1 : which time is this login
 */
@Msg(location = "..")
protected final static String LOGIN_NUM = "login-num";

public static void main(String[] args)
{
    Messager msgr = Messager.get();

    for (int i = 1; i < 26; i++)
        System.out.println(msgr
                .format(LOGIN_NUM, "user", "Peter", "num", i));
}

This snippet is from tutor/msg/Dynamic.java

That will output:
Logging in as Peter (this is your 1st login)...
Logging in as Peter (this is your 2nd login)...
Logging in as Peter (this is your 3rd login)...
Logging in as Peter (this is your 4th login)...
Logging in as Peter (this is your 5th login)...
Logging in as Peter (this is your 6th login)...
Logging in as Peter (this is your 7th login)...
Logging in as Peter (this is your 8th login)...
Logging in as Peter (this is your 9th login)...
Logging in as Peter (this is your 10th login)...
Logging in as Peter (this is your 11th login)...
Logging in as Peter (this is your 12th login)...
Logging in as Peter (this is your 13th login)...
Logging in as Peter (this is your 14th login)...
Logging in as Peter (this is your 15th login)...
Logging in as Peter (this is your 16th login)...
Logging in as Peter (this is your 17th login)...
Logging in as Peter (this is your 18th login)...
Logging in as Peter (this is your 19th login)...
Logging in as Peter (this is your 20th login)...
Logging in as Peter (this is your 21st login)...
Logging in as Peter (this is your 22nd login)...
Logging in as Peter (this is your 23rd login)...
Logging in as Peter (this is your 24th login)...
Logging in as Peter (this is your 25th login)...