]> WPIA git - gigi.git/commitdiff
ADD: Enable Language selection.
authorFelix Dörre <felix@dogcraft.de>
Sun, 31 Aug 2014 13:20:55 +0000 (15:20 +0200)
committerFelix Dörre <felix@dogcraft.de>
Sun, 31 Aug 2014 15:21:51 +0000 (17:21 +0200)
12 files changed:
src/org/cacert/gigi/Gigi.java
src/org/cacert/gigi/Gigi.templ
src/org/cacert/gigi/Launcher.java
src/org/cacert/gigi/User.java
src/org/cacert/gigi/localisation/Language.java
src/org/cacert/gigi/pages/LoginPage.java
src/org/cacert/gigi/pages/Page.java
src/org/cacert/gigi/pages/main/Signup.java
src/org/cacert/gigi/ping/EmailPinger.java
tests/org/cacert/gigi/TestUser.java
tests/org/cacert/gigi/pages/account/TestMailManagement.java
tests/org/cacert/gigi/testUtils/ManagedTest.java

index 148556e83ef86d2ad4cef659a771c993e3c77056..9b3023b25f0626eb87562106b13601cc6c1860b0 100644 (file)
@@ -6,6 +6,7 @@ import java.security.KeyStore;
 import java.util.Calendar;
 import java.util.HashMap;
 import java.util.LinkedList;
+import java.util.Locale;
 import java.util.Map;
 import java.util.Properties;
 
@@ -116,6 +117,11 @@ public class Gigi extends HttpServlet {
             about.addItem(new SimpleMenuItem("//lists.cacert.org/wws", "Mailing Lists"));
             about.addItem(new SimpleMenuItem("//blog.CAcert.org/feed", "RSS News Feed"));
 
+            Menu languages = new Menu("Translations");
+            for (Locale l : Language.getSupportedLocales()) {
+                languages.addItem(new SimpleMenuItem("?lang=" + l.toString(), l.getDisplayName(l)));
+            }
+            categories.add(languages);
             for (Menu menu : categories) {
                 menu.prepare();
                 rootMenu.addItem(menu);
@@ -175,6 +181,11 @@ public class Gigi extends HttpServlet {
         // return;
         // }
         HttpSession hs = req.getSession();
+        if (req.getParameter("lang") != null) {
+            Locale l = Language.getLocaleFromString(req.getParameter("lang"));
+            Language lu = Language.getInstance(l);
+            req.getSession().setAttribute(Language.SESSION_ATTRIB_NAME, lu.getLocale());
+        }
         final Page p = getPage(req.getPathInfo());
 
         if (p != null) {
index 2cb3d90f6fc53e098252c1a08d5989cb3cffa58b..f755b2c520e9eb7488126660df9b2676c7ca21d9 100644 (file)
                </div>
                <div id="pageNav">
                        <?=$menu?>
-                       <div>
-                               <h3 class="pointer">+ <?=_Translations?></h3>
-                               <ul class="menu hidden" id="trans">
-                                       <li><a href="/index.php?id=0&amp;lang=ar">العربية</a></li>
-                                       <li><a href="/index.php?id=0&amp;lang=bg">Български</a></li>
-                                       <li><a href="/index.php?id=0&amp;lang=cs">Čeština</a></li>
-                                       <li><a href="/index.php?id=0&amp;lang=da">Dansk</a></li>
-                                       <li><a href="/index.php?id=0&amp;lang=de">Deutsch</a></li>
-                                       <li><a href="/index.php?id=0&amp;lang=el">Ελληνικά</a></li>
-                                       <li><a href="/index.php?id=0&amp;lang=en">English</a></li>
-                                       <li><a href="/index.php?id=0&amp;lang=es">Español</a></li>
-                                       <li><a href="/index.php?id=0&amp;lang=fi">Suomi</a></li>
-                                       <li><a href="/index.php?id=0&amp;lang=fr">Français</a></li>
-                                       <li><a href="/index.php?id=0&amp;lang=hu">Magyar</a></li>
-                                       <li><a href="/index.php?id=0&amp;lang=it">Italiano</a></li>
-                                       <li><a href="/index.php?id=0&amp;lang=ja">日本語</a></li>
-                                       <li><a href="/index.php?id=0&amp;lang=lv">Latviešu</a></li>
-                                       <li><a href="/index.php?id=0&amp;lang=nl">Nederlands</a></li>
-                                       <li><a href="/index.php?id=0&amp;lang=pl">Polski</a></li>
-                                       <li><a href="/index.php?id=0&amp;lang=pt">Português</a></li>
-                                       <li><a href="/index.php?id=0&amp;lang=pt-br">Português
-                                                       Brasileiro</a></li>
-                                       <li><a href="/index.php?id=0&amp;lang=ru">Русский</a></li>
-                                       <li><a href="/index.php?id=0&amp;lang=sv">Svenska</a></li>
-                                       <li><a href="/index.php?id=0&amp;lang=tr">Türkçe</a></li>
-                                       <li><a href="/index.php?id=0&amp;lang=zh-cn">中文(简体)</a></li>
-                                       <li><a href="/index.php?id=0&amp;lang=zh-tw">中文(臺灣)</a></li>
-                               </ul>
-                       </div>
                        <div>
                                <h3 class="pointer"><?=_Advertising?></h3>
                                <ul class="menu hidden" id="recom"></ul>
index 58758ffad99d1f9bfad4cbf810f42ae7d39ed900..a7a32dcc008bf767fc3fb66006309df29ba255a5 100644 (file)
@@ -9,6 +9,7 @@ import java.security.NoSuchAlgorithmException;
 import java.security.UnrecoverableKeyException;
 import java.security.cert.Certificate;
 import java.util.List;
+import java.util.Locale;
 import java.util.Properties;
 import java.util.TimeZone;
 
@@ -47,6 +48,7 @@ import org.eclipse.jetty.util.ssl.SslContextFactory;
 public class Launcher {
 
     public static void main(String[] args) throws Exception {
+        Locale.setDefault(Locale.ENGLISH);
         TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
         GigiConfig conf = GigiConfig.parse(System.in);
         ServerConstants.init(conf.getMainProps());
index be8a6ec6202de813442dc7752dcc80405feeec59..764873812d29b4ae3c7e89e4d3a44af67fa3a5fd 100644 (file)
@@ -5,6 +5,7 @@ import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.util.Calendar;
+import java.util.Locale;
 
 import org.cacert.gigi.database.DatabaseConnection;
 import org.cacert.gigi.localisation.Language;
@@ -24,6 +25,8 @@ public class User {
 
     private Assurance[] receivedAssurances, madeAssurances;
 
+    private Locale locale;
+
     public User(int id) {
         this.id = id;
         updateName(id);
@@ -31,13 +34,19 @@ public class User {
 
     private void updateName(int id) {
         try {
-            PreparedStatement ps = DatabaseConnection.getInstance().prepare("SELECT `fname`, `lname`,`mname`, `suffix`, `dob`, `email` FROM `users` WHERE id=?");
+            PreparedStatement ps = DatabaseConnection.getInstance().prepare("SELECT `fname`, `lname`,`mname`, `suffix`, `dob`, `email`, `language` FROM `users` WHERE id=?");
             ps.setInt(1, id);
             ResultSet rs = ps.executeQuery();
             if (rs.next()) {
                 name = new Name(rs.getString(1), rs.getString(2), rs.getString(3), rs.getString(4));
                 dob = rs.getDate(5);
                 email = rs.getString(6);
+                String localeStr = rs.getString(7);
+                if (localeStr == null || localeStr.equals("")) {
+                    locale = Locale.getDefault();
+                } else {
+                    locale = Language.getLocaleFromString(localeStr);
+                }
             }
             rs.close();
         } catch (SQLException e) {
@@ -111,7 +120,7 @@ public class User {
         if (id != 0) {
             throw new Error("refusing to insert");
         }
-        PreparedStatement query = DatabaseConnection.getInstance().prepare("insert into `users` set `email`=?, `password`=?, " + "`fname`=?, `mname`=?, `lname`=?, " + "`suffix`=?, `dob`=?, `created`=NOW(), locked=0");
+        PreparedStatement query = DatabaseConnection.getInstance().prepare("insert into `users` set `email`=?, `password`=?, " + "`fname`=?, `mname`=?, `lname`=?, " + "`suffix`=?, `dob`=?, `created`=NOW(), locked=0, `language`=?");
         query.setString(1, email);
         query.setString(2, PasswordHash.hash(password));
         query.setString(3, name.fname);
@@ -119,6 +128,7 @@ public class User {
         query.setString(5, name.lname);
         query.setString(6, name.suffix);
         query.setDate(7, new java.sql.Date(dob.getTime()));
+        query.setString(8, locale.toString());
         query.execute();
         id = DatabaseConnection.lastInsertId(query);
     }
@@ -447,8 +457,13 @@ public class User {
         }
     }
 
-    public Language getPrefferedLanguage() {
-        return Language.getInstance("de");
+    public Locale getPreferredLocale() {
+        return locale;
+    }
+
+    public void setPreferredLocale(Locale locale) {
+        this.locale = locale;
+
     }
 
     public boolean wantsDirectoryListing() throws SQLException {
@@ -480,4 +495,5 @@ public class User {
         update.setInt(2, getId());
         update.executeUpdate();
     }
+
 }
index 4f7cd17a807bb0d9b33a8b654fbd532f4aefd36a..3d8ee0b6d36db04a1e4ce4554b30e2dd2fd0fff5 100644 (file)
@@ -4,6 +4,7 @@ import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.util.HashMap;
+import java.util.LinkedList;
 import java.util.Locale;
 
 import javax.xml.parsers.DocumentBuilder;
@@ -17,23 +18,60 @@ import org.xml.sax.SAXException;
 
 public class Language {
 
+    public static final String SESSION_ATTRIB_NAME = "lang";
+
+    private static Locale[] supportedLocales;
+
+    static {
+        LinkedList<Locale> supported = new LinkedList<>();
+        File locales = new File("locale");
+        for (File f : locales.listFiles()) {
+            if ( !f.getName().endsWith(".xml")) {
+                continue;
+            }
+            String language = f.getName().split("\\.", 2)[0];
+            supported.add(getLocaleFromString(language));
+        }
+        supportedLocales = supported.toArray(new Locale[supported.size()]);
+    }
+
+    public static Locale getLocaleFromString(String language) {
+        if (language.contains("_")) {
+            String[] parts = language.split("_", 2);
+            return new Locale(parts[0], parts[1]);
+
+        } else {
+            return new Locale(language);
+        }
+    }
+
+    public static Locale[] getSupportedLocales() {
+        return supportedLocales;
+    }
+
     private static HashMap<String, Language> langs = new HashMap<String, Language>();
 
     private HashMap<String, String> translations = new HashMap<String, String>();
 
     private Locale l;
 
-    protected Language(String language) throws ParserConfigurationException, IOException, SAXException {
-        if (language.contains("_")) {
-            String[] parts = language.split("_");
-            l = new Locale(parts[0], parts[1]);
-        } else {
-            l = new Locale(language);
+    private static Locale project(Locale l) {
+        if (l == null) {
+            return Locale.getDefault();
+        }
+        File file = new File("locale", l.toString() + ".xml");
+        if ( !file.exists()) {
+            return new Locale(l.getLanguage());
         }
+        return l;
+    }
 
+    protected Language(Locale loc) throws ParserConfigurationException, IOException, SAXException {
+        File file = new File("locale", loc.toString() + ".xml");
+        l = loc;
         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 +93,17 @@ public class Language {
         return string;
     }
 
-    public static Language getInstance(String language) {
-        Language l = langs.get(language);
+    public static Language getInstance(Locale language) {
+        language = project(language);
+        File file = new File("locale", language.toString() + ".xml");
+        if ( !file.exists()) {
+            return null;
+        }
+        Language l = langs.get(language.toString());
         if (l == null) {
             try {
                 l = new Language(language);
-                langs.put(language, l);
+                langs.put(language.toString(), l);
             } catch (ParserConfigurationException e) {
                 e.printStackTrace();
             } catch (IOException e) {
index 2dde41299251b9c0a9a35e704fbf58302896377f..4abe3950d4debb737275f6b2a83d68be5d364cd5 100644 (file)
@@ -14,6 +14,7 @@ import javax.servlet.http.HttpSession;
 
 import org.cacert.gigi.User;
 import org.cacert.gigi.database.DatabaseConnection;
+import org.cacert.gigi.localisation.Language;
 import org.cacert.gigi.util.PasswordHash;
 
 public class LoginPage extends Page {
@@ -71,10 +72,7 @@ public class LoginPage extends Page {
             ResultSet rs = ps.executeQuery();
             if (rs.next()) {
                 if (PasswordHash.verifyHash(pw, rs.getString(1))) {
-                    req.getSession().invalidate();
-                    HttpSession hs = req.getSession();
-                    hs.setAttribute(LOGGEDIN, true);
-                    hs.setAttribute(USER, new User(rs.getInt(2)));
+                    loginSession(req, new User(rs.getInt(2)));
                 }
             }
             rs.close();
@@ -94,10 +92,7 @@ public class LoginPage extends Page {
             ps.setString(1, serial);
             ResultSet rs = ps.executeQuery();
             if (rs.next()) {
-                req.getSession().invalidate();
-                HttpSession hs = req.getSession();
-                hs.setAttribute(LOGGEDIN, true);
-                hs.setAttribute(USER, new User(rs.getInt(1)));
+                loginSession(req, new User(rs.getInt(1)));
             }
             rs.close();
         } catch (SQLException e) {
@@ -105,6 +100,14 @@ public class LoginPage extends Page {
         }
     }
 
+    private void loginSession(HttpServletRequest req, User user) {
+        req.getSession().invalidate();
+        HttpSession hs = req.getSession();
+        hs.setAttribute(LOGGEDIN, true);
+        hs.setAttribute(Language.SESSION_ATTRIB_NAME, user.getPreferredLocale());
+        hs.setAttribute(USER, user);
+    }
+
     @Override
     public boolean isPermitted(User u) {
         return u == null;
index 54d7d45d72e32b22be1b15dfecd8980bb63ad624..0497dae28b1722323d30fe0d8d33a4c2e0ebf8d8 100644 (file)
@@ -2,10 +2,13 @@ package org.cacert.gigi.pages;
 
 import java.io.IOException;
 import java.net.URL;
+import java.util.Enumeration;
+import java.util.Locale;
 
 import javax.servlet.ServletRequest;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
 
 import org.cacert.gigi.PermissionCheckable;
 import org.cacert.gigi.User;
@@ -104,7 +107,25 @@ public abstract class Page implements PermissionCheckable {
     }
 
     public static Language getLanguage(ServletRequest req) {
-        return Language.getInstance("de");
+        HttpSession session = ((HttpServletRequest) req).getSession();
+        Locale sessval = (Locale) session.getAttribute(Language.SESSION_ATTRIB_NAME);
+        if (sessval != null) {
+            Language l = Language.getInstance(sessval);
+            if (l != null) {
+                return l;
+            }
+        }
+        Enumeration<Locale> langs = req.getLocales();
+        while (langs.hasMoreElements()) {
+            Locale c = langs.nextElement();
+            Language l = Language.getInstance(c);
+            if (l != null) {
+                session.setAttribute(Language.SESSION_ATTRIB_NAME, l.getLocale());
+                return l;
+            }
+        }
+        session.setAttribute(Language.SESSION_ATTRIB_NAME, Locale.ENGLISH);
+        return Language.getInstance(Locale.ENGLISH);
     }
 
     public static String translate(ServletRequest req, String string) {
index a7a1a88a9c1681a9a32483a42bc18eca1e99851b..35b8344b797485ced366b6d74cef3cdd4f07562e 100644 (file)
@@ -6,7 +6,9 @@ import java.sql.Date;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
+import java.util.Enumeration;
 import java.util.HashMap;
+import java.util.Locale;
 import java.util.Map;
 
 import javax.servlet.http.HttpServletRequest;
@@ -172,7 +174,8 @@ public class Signup extends Form {
     private void run(HttpServletRequest req, String password) throws SQLException {
         try {
             DatabaseConnection.getInstance().beginTransaction();
-
+            Enumeration<Locale> locales = req.getLocales();
+            buildup.setPreferredLocale(Page.getLanguage(req).getLocale());
             buildup.setDob(myDoB.getDate());
             buildup.insert(password);
             int memid = buildup.getId();
index ea63c0b6a8eeeb3daaf17f3b8bf14d594a36fb8f..9dfa29587b55454630ecc2c1ae325f2c67c23572 100644 (file)
@@ -1,9 +1,11 @@
 package org.cacert.gigi.ping;
 
 import java.io.IOException;
+
 import org.cacert.gigi.Domain;
 import org.cacert.gigi.User;
 import org.cacert.gigi.email.MailProbe;
+import org.cacert.gigi.localisation.Language;
 
 public class EmailPinger extends DomainPinger {
 
@@ -12,7 +14,7 @@ public class EmailPinger extends DomainPinger {
         String[] parts = configuration.split(":", 2);
         String mail = parts[0] + "@" + domain.getSuffix();
         try {
-            MailProbe.sendMailProbe(u.getPrefferedLanguage(), "domain", domain.getId(), parts[1], mail);
+            MailProbe.sendMailProbe(Language.getInstance(u.getPreferredLocale()), "domain", domain.getId(), parts[1], mail);
         } catch (IOException e) {
             e.printStackTrace();
             return "Mail connection interrupted";
index 4bc38e5e37bc4cf81a9dd5b7e4ec2b359ace50fa..5831da1f9a5310616eaac9df15515ae009cf65fa 100644 (file)
@@ -1,6 +1,7 @@
 package org.cacert.gigi;
 
 import java.sql.SQLException;
+import java.util.Locale;
 
 import org.cacert.gigi.localisation.Language;
 import org.cacert.gigi.testUtils.ManagedTest;
@@ -17,6 +18,7 @@ public class TestUser extends ManagedTest {
         u.setLname("last");
         u.setMname("");
         u.setSuffix("");
+        u.setPreferredLocale(Locale.ENGLISH);
         long dob = System.currentTimeMillis();
         dob -= dob % (1000 * 60 * 60 * 24);
         u.setDob(new java.sql.Date(dob));
@@ -61,8 +63,8 @@ public class TestUser extends ManagedTest {
         int id = createVerifiedUser("aä", "b", uq + "a@email.org", TEST_PASSWORD);
 
         User u = new User(id);
-        new EmailAddress(uq + "b@email.org", u).insert(Language.getInstance("de"));
-        new EmailAddress(uq + "c@email.org", u).insert(Language.getInstance("de"));
+        new EmailAddress(uq + "b@email.org", u).insert(Language.getInstance(Locale.ENGLISH));
+        new EmailAddress(uq + "c@email.org", u).insert(Language.getInstance(Locale.ENGLISH));
         new Domain(u, uq + "a.testdomain.org").insert();
         new Domain(u, uq + "b.testdomain.org").insert();
         new Domain(u, uq + "c.testdomain.org").insert();
index 09bd98cee5c838976468bfd508531d1cfa037bcb..56ae01a0640d72fba4a76f314c492cfdb5f5a577 100644 (file)
@@ -6,6 +6,7 @@ import java.io.IOException;
 import java.io.UnsupportedEncodingException;
 import java.net.MalformedURLException;
 import java.net.URLEncoder;
+import java.util.Locale;
 
 import org.cacert.gigi.EmailAddress;
 import org.cacert.gigi.GigiApiException;
@@ -77,7 +78,7 @@ public class TestMailManagement extends ManagedTest {
     @Test
     public void testMailSetDefaultWebUnverified() throws MalformedURLException, UnsupportedEncodingException, IOException, InterruptedException, GigiApiException {
         EmailAddress adrr = new EmailAddress(createUniqueName() + "test@test.tld", u);
-        adrr.insert(Language.getInstance("en"));
+        adrr.insert(Language.getInstance(Locale.ENGLISH));
         assertNotNull(executeBasicWebInteraction(cookie, path, "makedefault&emailid=" + adrr.getId()));
         assertNotEquals(User.getById(u.getId()).getEmail(), adrr.getAddress());
         getMailReciever().clearMails();
index e9b23e28a082e7fa443f511a413c710a3b0d07da..da1aca399418d92e99b2105228a5c0a7bd2d0a1c 100644 (file)
@@ -34,6 +34,7 @@ import java.security.cert.X509Certificate;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
+import java.util.Locale;
 import java.util.Properties;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -491,7 +492,7 @@ public class ManagedTest {
 
     public static EmailAddress createVerifiedEmail(User u) throws InterruptedException, GigiApiException {
         EmailAddress adrr = new EmailAddress(createUniqueName() + "test@test.tld", u);
-        adrr.insert(Language.getInstance("en"));
+        adrr.insert(Language.getInstance(Locale.ENGLISH));
         TestMail testMail = getMailReciever().recieve();
         assertTrue(adrr.getAddress().equals(testMail.getTo()));
         String hash = testMail.extractLink().substring(testMail.extractLink().lastIndexOf('=') + 1);