Revision 5868

View differences:

trunk/libraries/libInternationalization/src-utils/org/gvsig/i18n/utils/ConfigOptions.java
4 4
import java.io.FileNotFoundException;
5 5
import java.io.IOException;
6 6
import java.util.ArrayList;
7
import java.util.HashMap;
7 8

  
8 9
import org.kxml2.io.KXmlParser;
9 10
import org.xmlpull.v1.XmlPullParserException;
......
140 141
	private void parseProjects(KXmlParser parser) throws XmlPullParserException, IOException {
141 142
		// recorremos todos los proyectos dentro de 'projects'
142 143
		int state;
143
		String dir;
144
		String dir, basename;
145
		String project[] = new String[2];
144 146
		
145 147
		for (state = parser.next(); state!=KXmlParser.END_TAG || !parser.getName().equals("projects") ; state=parser.next()) {
146 148
			if (state==KXmlParser.START_TAG) {
147 149
				if (parser.getName().equals("project")) {
148 150
					if (parser.getAttributeValue(null, "dir")!=null) {
149 151
						dir = parser.getAttributeValue(null,  "dir");
150
						if (dir!=null)
151
							projects.add(dir);
152
						if (dir!=null) {
153
							project[0] = dir;
154
							project[1] = parser.getAttributeValue(null, "basename");
155
							if (project[1]==null)
156
								project[1] = defaultBaseName;
157
							projects.add(project);
158
						}
152 159
						else
153 160
							System.err.println("Error leyendo el fichero de configuraci?n. No se encontr? el atributo 'dir'\nrequerido en la etiqueta <project>. La etiqueta ser? ignorada.");
154 161
					}
trunk/libraries/libInternationalization/src-utils/org/gvsig/i18n/utils/TranslationDatabase.java
1
/**
2
 * 
3
 */
4
package org.gvsig.i18n.utils;
5

  
6
import java.io.File;
7
import java.net.MalformedURLException;
8
import java.net.URL;
9
import java.util.Enumeration;
10
import java.util.HashMap;
11
import java.util.Locale;
12
import java.util.ResourceBundle;
13

  
14
import org.gvsig.i18n.MessagesClassLoader;
15

  
16
/**
17
 * @author cesar
18
 *
19
 */
20
public class TranslationDatabase {
21
	
22
	public TranslationDatabase(ConfigOptions config){
23
		this.config = config; 
24
	}
25
	
26
	private ConfigOptions config;
27
	private HashMap dictionaries = new HashMap();
28
	
29
	public void load() {
30
		String lang;
31
		ResourceBundle bundle;
32
		HashMap dictionary;
33
		
34
		Enumeration keys;
35
		String currentKey;
36
		
37
		String dir, basename;
38
		for (int currentLang=0; currentLang<config.languages.length; currentLang++) {
39
			lang = config.languages[currentLang];
40
			dictionary = new HashMap();
41
			for (int currentProject=0; currentProject<config.projects.size(); currentProject++) {
42
				dir = ((String[])config.projects.get(currentProject))[0]; // dir
43
				basename = ((String[])config.projects.get(currentProject))[1]; // basename
44
				
45
				// we need an url array to create the classloader
46
				URL[] urls = new URL[1];
47
				try {
48
					urls[0] = (new File(dir)).toURL();
49
				} catch (MalformedURLException e) {
50
					// TODO Auto-generated catch block
51
					e.printStackTrace();
52
				}
53
				bundle = ResourceBundle.getBundle(basename, new Locale(lang), new MessagesClassLoader(urls));
54
				keys = bundle.getKeys();
55
				while (keys.hasMoreElements()) {
56
					currentKey = (String) keys.nextElement();
57
					if (! ((HashMap)dictionary).containsKey(currentKey)) {
58
						((HashMap)dictionary).put(currentKey, bundle.getString(currentKey));
59
					}
60
					else {
61
						if (bundle.getString(currentKey).equals((HashMap)dictionary.get(currentKey))) {
62
							System.err.println("Alerta: dos claves iguales con distinto mensaje:");
63
							System.err.println(currentKey+"="+(HashMap)dictionary.get(currentKey));
64
							System.err.println(currentKey+"="+bundle.getString(currentKey) + " -- Proyecto: "+dir);
65
						}
66
					}
67
				}
68
			}
69
		dictionaries.put(lang, dictionary);
70
		}
71
	}
72
	
73
	public void save() {
74
		
75
	}
76
}
0 77

  
trunk/libraries/libInternationalization/src/org/gvsig/i18n/MessagesClassLoader.java
1
/**
2
 * 
3
 */
4
package org.gvsig.i18n;
5

  
6
import java.io.File;
7
import java.net.MalformedURLException;
8
import java.net.URL;
9
import java.net.URLClassLoader;
10
import java.util.ArrayList;
11
import java.util.List;
12
import java.util.StringTokenizer;
13

  
14
/**
15
 * <p>This class offers a class loader which is able to load files from the specified
16
 * directories.</p>
17
 * 
18
 * @author C?sar Mart?nez Izquierdo (cesar.martinez@iver.es)
19
 *
20
 */
21
public class MessagesClassLoader extends URLClassLoader {
22
	
23
	/**
24
	 * <p>Creates a new class loader, which is able to load files from the directories
25
	 * specified as parameter.</p>
26
	 * 
27
	 * @param urls The list of directories which will be used to load files.
28
	 */
29
	public MessagesClassLoader(URL[] urls) {
30
		super(urls);
31
	}
32
	
33
	/**
34
	 * Loads a resource using the specified file name.
35
	 * 
36
	 * @param res The name of the resource to be loaded.
37
	 */
38
	public URL getResource(String res) {
39
		try {
40
			ArrayList resource = new ArrayList();
41
			StringTokenizer st = new StringTokenizer(res, "\\/");
42
			
43
			while (st.hasMoreTokens()) {
44
				String token = st.nextToken();
45
				resource.add(token);
46
			}
47
			URL ret = null;
48
			int currentUrl;
49
			URL[] urls = getURLs();
50
		
51
			for (currentUrl=0; currentUrl< urls.length; currentUrl++) {
52
				URL url = urls[currentUrl];
53
				File file = new File(url.getFile());
54
				if (url.getFile().endsWith("/"))
55
					ret = getResource(file, resource);
56
			}
57
			
58
			if (ret != null) {
59
				return ret;
60
			}
61
		} catch (Exception e) {
62
			e.printStackTrace();
63
		}
64
		
65
		return super.getResource(res);
66
	}
67
	
68
	/**
69
	 * Busca recursivamente el recurso res en el directorio base. res es una
70
	 * lista de String's con los directorios del path y base es el directorio
71
	 * a partir del cual se busca dicho recurso. En cada ejecuci?n del m?todo
72
	 * se toma el primer elemento de res y se busca dicho directorio en el
73
	 * directorio base. Si se encuentra, ser? el directorio base para una
74
	 * nueva llamada.
75
	 *
76
	 * @param base Directorio desde donde parte la b?squeda del recurso.
77
	 * @param res Lista de strings con el path del recurso que se quiere
78
	 *        encontrar
79
	 *
80
	 * @return URL con el recurso
81
	 */
82
	private URL getResource(File base, List res) {
83
		File[] files = base.listFiles();
84
		
85
		String parte = (String) res.get(0);
86
		
87
		for (int i = 0; i < files.length; i++) {
88
			if (files[i].getName().compareTo(parte) == 0) {
89
				if (res.size() == 1) {
90
					try {
91
						return new URL("file:" + files[i].toString());
92
					} catch (MalformedURLException e) {
93
						return null;
94
					}
95
				} else {
96
					return getResource(files[i], res.subList(1, res.size()));
97
				}
98
			}
99
		}
100
		
101
		return null;
102
	}
103
}
104

  
105

  
0 106

  
trunk/libraries/libInternationalization/src/org/gvsig/i18n/Messages.java
245 245
				urls[i] = dirList[i].toURL();
246 246
			}
247 247
	
248
		ClassLoader loader = new PrivateClassLoader(urls);
248
		ClassLoader loader = new MessagesClassLoader(urls);
249 249
		addResourceFamily(family, loader, "");
250 250
	}
251 251

  
......
270 270
		// use our own classloader
271 271
		URL[] urls = new URL[1];		
272 272
		urls[0] = dir.toURL();
273
		ClassLoader loader = new PrivateClassLoader(urls);
273
		ClassLoader loader = new MessagesClassLoader(urls);
274 274
		addResourceFamily(family, loader, "");
275 275
	}
276 276

  
......
524 524
		}
525 525
		return availableLanguages;
526 526
	}*/
527

  
528

  
529
	private static class PrivateClassLoader extends URLClassLoader {
530
		
531
		public PrivateClassLoader(URL[] urls) {
532
			super(urls);
533
		}
534
		
535
		public URL getResource(String res) {
536
			try {
537
				ArrayList resource = new ArrayList();
538
				StringTokenizer st = new StringTokenizer(res, "\\/");
539
				
540
				while (st.hasMoreTokens()) {
541
					String token = st.nextToken();
542
					resource.add(token);
543
				}
544
				URL ret = null;
545
				int currentUrl;
546
				URL[] urls = getURLs();
547
			
548
				for (currentUrl=0; currentUrl< urls.length; currentUrl++) {
549
					URL url = urls[currentUrl];
550
					File file = new File(url.getFile());
551
					if (url.getFile().endsWith("/"))
552
						ret = getResource(file, resource);
553
				}
554
				
555
				if (ret != null) {
556
					return ret;
557
				}
558
			} catch (Exception e) {
559
				e.printStackTrace();
560
			}
561
			
562
			return super.getResource(res);
563
		}
564
		
565
		/**
566
		 * Busca recursivamente el recurso res en el directorio base. res es una
567
		 * lista de String's con los directorios del path y base es el directorio
568
		 * a partir del cual se busca dicho recurso. En cada ejecuci?n del m?todo
569
		 * se toma el primer elemento de res y se busca dicho directorio en el
570
		 * directorio base. Si se encuentra, ser? el directorio base para una
571
		 * nueva llamada.
572
		 *
573
		 * @param base Directorio desde donde parte la b?squeda del recurso.
574
		 * @param res Lista de strings con el path del recurso que se quiere
575
		 *        encontrar
576
		 *
577
		 * @return URL con el recurso
578
		 */
579
		private URL getResource(File base, List res) {
580
			File[] files = base.listFiles();
581
			
582
			String parte = (String) res.get(0);
583
			
584
			for (int i = 0; i < files.length; i++) {
585
				if (files[i].getName().compareTo(parte) == 0) {
586
					if (res.size() == 1) {
587
						try {
588
							return new URL("file:" + files[i].toString());
589
						} catch (MalformedURLException e) {
590
							return null;
591
						}
592
					} else {
593
						return getResource(files[i], res.subList(1, res.size()));
594
					}
595
				}
596
			}
597
			
598
			return null;
599
		}
600
	}
601
	
602
	
603
	/*private static class PrivateResourceBundle extends ResourceBundle {
604
		
605
		
606
		
607
		
608
	}*/
609

  
610 527
}

Also available in: Unified diff