Currently showing src/net/jtank/protocol/MultiLingual.java
package net.jtank.protocol;

import net.jtank.io.FileUtil;

import java.io.IOException;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.File;
import java.util.List;
import java.util.LinkedList;
import java.util.ArrayList;
import java.util.StringTokenizer;
import java.util.HashMap;
import java.awt.*;
import javax.swing.*;


/**
 * Translates pre-determined English phrases into their equivalents  in other languages.
 *
 *@version 2.0, shipped with juk 2.4
 */

public class MultiLingual {

	private ProgramLanPack currentProgram;
	private String currentLanguageCode;
	private List registeredComponents = new LinkedList ();
	
	public MultiLingual (String program, String baseLan, String directory) {
		loadProgramPack(program, baseLan, directory);
	}
	
	public void setCurrentLanguageCode (String newLanguageCode) {
		currentLanguageCode = newLanguageCode;
		
		for (int i = 0; i < registeredComponents.size(); i++) {
			LingualComponent current = (LingualComponent) registeredComponents.get(i);
			
			current.setText(translateWord(current.getDefaultText()));
			
		}
	}
	
	public String getCurrentLanguageCode () {
		return  currentLanguageCode;  
	}
	
	public String translateWord (String englishWord) {
		return translateWord (englishWord, currentLanguageCode);
	}

	public String translateWord (String englishWord, String languageCode) {
		return currentProgram.translateWord(englishWord, languageCode);
	}

	private void loadProgramPack (String program, String baseLan, String directory) {
		currentProgram = new ProgramLanPack( program, baseLan, directory);
	}
	
	public JMenu constructMenu () {
		return currentProgram.constructMenu();
	}
	
	public void register(JComponent c) {
		registeredComponents.add(new LingualComponent(c));
	}
	
	public void dumpRegisteredComponents() {
		System.out.println("Dumping registered components...");
		for (int i = 0; i < registeredComponents.size(); i++) {
			LingualComponent current = (LingualComponent) registeredComponents.get(i);
			
			System.out.println(current.getDefaultText());
		}
		System.out.println("... dump finished.");
	}
}


class ProgramLanPack {
	
	private String program;
	private LanPack baseLan;
	private HashMap lanPacks;
	private List langPacksList;
	
	public ProgramLanPack (String program, String baseLan, List langPacksList) {
		this.program = program;
		this.langPacksList = langPacksList;
		this.baseLan = getLanPack(baseLan);
		lanPacks = new HashMap();
		
		for (int i = 0; i < langPacksList.size(); i++) {
			LanPack current = (LanPack) langPacksList.get(i);
			lanPacks.put(current.getName(), current);
		}
	}
	
	public ProgramLanPack (String program, String baseLan, String directory) {
		this.program = program;
		
		File dir = new File (directory);
		File [] files = dir.listFiles();
			
		System.out.println(directory);
			
		String [] validFiles = new String [files.length];
		for (int i = 0; i < validFiles.length; i++) {
			validFiles[i] = files[i].getName();
		}
		
		lanPacks = new HashMap ();
		langPacksList = new LinkedList();
		
		for (int i = 0; i < validFiles.length; i++) {
			
			try {
				StringTokenizer st = new StringTokenizer (validFiles[i], "-");
				String fprogram = st.nextToken();
				StringTokenizer st2 = new StringTokenizer (st.nextToken(), ".");
				String lan = st2.nextToken();
				String ext = st2.nextToken();
				
				if (program.equals(fprogram) && ext.equals("lpak")) {
					LanPack lp = new LanPack(directory + validFiles[i], lan, fprogram);
					lanPacks.put(lan, lp);
					langPacksList.add(lp);
				}
				
			} catch (Exception e) {
				//e.printStackTrace();
			}
		}
		
		this.baseLan = getLanPack(baseLan);
		
	}
	
	public String translateWord(String word, String lan) {
		if (baseLan == null)
			return word;
	
		int index = baseLan.indexWord(word);
		if (index == -1)
			return word;
			
		if (getLanPack(lan) == null)
			return word;
			
		String translation = getLanPack(lan).getWord(index);
		if (translation == null)
			return word;

		if (translation.equals(""))
			return word;
		
		return translation;
	}
	
	public LanPack getLanPack (String name) {
		return (LanPack) lanPacks.get(name);
	}
	
	public JMenu constructMenu () {
		if (baseLan == null)
			return null;
			
		JMenu menuLanguages = new JMenu ("Language");
		menuLanguages.setIcon(new ImageIcon ("data/images/language.png"));
		
		JRadioButtonMenuItem currentMenuItem = new JRadioButtonMenuItem(baseLan.getName(), true);
		menuLanguages.add(currentMenuItem);
		currentMenuItem.setIcon(new ImageIcon ("data/images/flags/" + baseLan.getName().toLowerCase() + ".gif"));
	
		
		for (int i = 0; i < langPacksList.size(); i++) {
			LanPack current = (LanPack) langPacksList.get(i);
			if (current != baseLan) {
				currentMenuItem =  new JRadioButtonMenuItem(current.getName(), false);
				menuLanguages.add(currentMenuItem);
				currentMenuItem.setIcon(new ImageIcon ("data/images/flags/" + current.getName().toLowerCase() + ".gif"));
			}
		}
		
		if (menuLanguages.getItemCount() == 0)
			return null;
		
		return menuLanguages;
	}
	
	public String getProgram () { return program; }
}
	
class LanPack {
	
	private String name;
	private String [] words;
	private String program;
	
	public LanPack (String file, String name, String program) throws IOException {
		this.program = program;
		this.name = name;
		
		BufferedReader br = FileUtil.getFileSpecificBufferedReader(file);
		
		String line = br.readLine();
		while (!line.equals("---"))
			line = br.readLine();
			
		List wordsL = new LinkedList ();
		
		line = br.readLine();
		while (line != null) {
			wordsL.add(line);
			
			line = br.readLine();
		}
		
		
		//copy into array
		words = new String [wordsL.size()];
		for (int i = 0; i < wordsL.size(); i++) {
			words[i] = (String) wordsL.get(i);
		}
		

	}
	
	public int indexWord (String word) {
		for (int i = 0; i < words.length; i++) {
			if (words[i].equals(word))
				return i;
		}
		return -1;
	}
	
	public String getName () { return name; }
	
	public String getWord (int index) { 
		try {
			return words[index];
		} catch (ArrayIndexOutOfBoundsException e) {
			return null;
		}
	}


}


class LingualComponent {
	
	private JComponent component;
	private String defaultText;
	
	public LingualComponent (JComponent component) {
		this.component = component;
		defaultText = getText();
	}
	
	public String getDefaultText () {
		return defaultText;
	}
	
	public String getText () {
		
		if (component instanceof JLabel) {
			return ((JLabel) component).getText();
		} else if (component instanceof JButton) {
			return ((JButton) component).getText();
		} else if (component instanceof JMenuItem) {
			return ((JMenuItem) component).getText();
		} else if (component instanceof JMenu) {
			return ((JMenu) component).getText();
		}
		
		return null;
	}
	
	public void setText(String newText) {
		
		if (component instanceof JLabel) {
	((JLabel) component).setText(newText);
		} else if (component instanceof JButton) {
	((JButton) component).setText(newText);
		} else if (component instanceof JMenuItem) {
	((JMenuItem) component).setText(newText);
		} else if (component instanceof JMenu) {
	((JMenu) component).setText(newText);
		}
		
	}
	
}
     

Total 295 Lines of Code.
Source code formatted using showsrc by William Denniss