Não, não precisa recompilar em outra linguagem, mas precisa ser configurável pra poder alterar o idioma.
Também não é trocado linha por linha (em partes), mas usa o recurso de i18n (Internacionalization), main informações em: http://docs.oracle.com/javase/tutorial/i18n/index.html
Basicamente o programa chama um arquivo .properties dependendo da linguagem definida,
por exemplo, ao inves de chamar assim:
static public void main(String[] args) {
System.out.println("Hello.");
System.out.println("How are you?");
System.out.println("Goodbye.");
}
fica mais ou menos assim:
static public void main(String[] args) {
String language;
String country;
if (args.length != 2) {
language = new String("en");
country = new String("US");
} else {
language = new String(args[0]);
country = new String(args[1]);
}
Locale currentLocale;
ResourceBundle messages;
currentLocale = new Locale(language, country);
messages = ResourceBundle.getBundle("MessagesBundle", currentLocale);
System.out.println(messages.getString("greetings"));
System.out.println(messages.getString("inquiry"));
System.out.println(messages.getString("farewell"));
}
Só para curiosidade, essa sigla i18n tem por causa que 18 letras entre o “I” inicial e o “N” final da palavra internacionalization, rs…
PS: Não escreva td em maiúculo