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); } } }