X-Git-Url: https://code.wpia.club/?a=blobdiff_plain;f=src%2Forg%2Fcacert%2Fgigi%2Flocalisation%2FLanguage.java;h=95971120f39df4151e997ff2af1d4694cd1bfcee;hb=6dead7e5168ecbc56fd52c6af24521d01425a113;hp=dc99d9a8a6ace810037a99881f8a28a26436e55c;hpb=480cb29387c76ccc19f8fa8fb0abe8ae1b069730;p=gigi.git diff --git a/src/org/cacert/gigi/localisation/Language.java b/src/org/cacert/gigi/localisation/Language.java index dc99d9a8..95971120 100644 --- a/src/org/cacert/gigi/localisation/Language.java +++ b/src/org/cacert/gigi/localisation/Language.java @@ -3,7 +3,10 @@ package org.cacert.gigi.localisation; import java.io.File; import java.io.FileInputStream; import java.io.IOException; +import java.util.Collections; +import java.util.Comparator; import java.util.HashMap; +import java.util.LinkedList; import java.util.Locale; import javax.xml.parsers.DocumentBuilder; @@ -17,23 +20,71 @@ import org.xml.sax.SAXException; public class Language { - private static HashMap langs = new HashMap(); + public static final String SESSION_ATTRIB_NAME = "lang"; + + private static Locale[] supportedLocales; - HashMap translations = new HashMap(); + static { + LinkedList supported = new LinkedList<>(); + File locales = new File("locale"); + File[] listFiles = locales.listFiles(); + if (listFiles != null) { + for (File f : listFiles) { + if ( !f.getName().endsWith(".xml")) { + continue; + } + String language = f.getName().split("\\.", 2)[0]; + supported.add(getLocaleFromString(language)); + } + } + Collections.sort(supported, new Comparator() { - Locale l; + @Override + public int compare(Locale o1, Locale o2) { + return o1.toString().compareTo(o2.toString()); + } - protected Language(String language) throws ParserConfigurationException, IOException, SAXException { + }); + supportedLocales = supported.toArray(new Locale[supported.size()]); + } + + public static Locale getLocaleFromString(String language) { if (language.contains("_")) { - String[] parts = language.split("_"); - l = new Locale(parts[0], parts[1]); + String[] parts = language.split("_", 2); + return new Locale(parts[0], parts[1]); + } else { - l = new Locale(language); + return new Locale(language); } + } + + public static Locale[] getSupportedLocales() { + return supportedLocales; + } + private static HashMap langs = new HashMap(); + + private HashMap translations = new HashMap(); + + private Locale locale; + + private static Locale project(Locale locale) { + if (locale == null) { + return Locale.getDefault(); + } + File file = new File("locale", locale.toString() + ".xml"); + if ( !file.exists()) { + return new Locale(locale.getLanguage()); + } + return locale; + } + + protected Language(Locale locale) throws ParserConfigurationException, IOException, SAXException { + File file = new File("locale", locale.toString() + ".xml"); + this.locale = locale; DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); - Document d = db.parse(new FileInputStream(new File("locale", language + ".xml"))); + Document d = db.parse(new FileInputStream(file)); NodeList nl = d.getDocumentElement().getChildNodes(); for (int i = 0; i < nl.getLength(); i++) { if ( !(nl.item(i) instanceof Element)) { @@ -55,12 +106,20 @@ public class Language { return string; } - public static Language getInstance(String language) { - Language l = langs.get(language); - if (l == null) { + public static Language getInstance(Locale locale) { + locale = project(locale); + File file = new File("locale", locale.toString() + ".xml"); + if ( !file.exists()) { + return null; + } + synchronized (Language.class) { + Language lang = langs.get(locale.toString()); + if (lang != null) { + return lang; + } try { - l = new Language(language); - langs.put(language, l); + lang = new Language(locale); + langs.put(locale.toString(), lang); } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (IOException e) { @@ -68,12 +127,12 @@ public class Language { } catch (SAXException e) { e.printStackTrace(); } + return lang; } - return l; } public Locale getLocale() { - return l; + return locale; } }