Revision 5868
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