Author: nextgens
Date: 2007-04-22 00:09:35 +0000 (Sun, 22 Apr 2007)
New Revision: 12850

Modified:
   trunk/freenet/src/freenet/clients/http/StatisticsToadlet.java
   trunk/freenet/src/freenet/clients/http/WelcomeToadlet.java
   trunk/freenet/src/freenet/l10n/L10n.java
   trunk/freenet/src/freenet/node/Node.java
Log:
The l10n framework is now almost feature complete \o/ translations are backed 
up upon reboots...
Maybe we should base64 encode the file to prevent people from messing up with 
encodings though.

Modified: trunk/freenet/src/freenet/clients/http/StatisticsToadlet.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/StatisticsToadlet.java       
2007-04-21 22:10:53 UTC (rev 12849)
+++ trunk/freenet/src/freenet/clients/http/StatisticsToadlet.java       
2007-04-22 00:09:35 UTC (rev 12850)
@@ -176,7 +176,8 @@
                HTMLNode logsList = statGatheringBox.addChild("ul");
                if(nodeConfig.config.get("logger").getBoolean("enabled"))
                        logsList.addChild("li").addChild("a", new String[]{ 
"href", "target"}, new String[]{ "/?latestlog", "_new"}, "Get latest node's 
logfile");
-               logsList.addChild("li").addChild("a", "href", 
"/?getTranlationFile").addChild("#", "Download the current translation file");
+               logsList.addChild("li").addChild("a", "href", 
"/?getOverrideTranlationFile").addChild("#", "Download the override translation 
file");
+               logsList.addChild("li").addChild("a", "href", 
"/?getTranlationFile").addChild("#", "Download the full translation file");

                if(advancedModeEnabled) {
                        // store size box

Modified: trunk/freenet/src/freenet/clients/http/WelcomeToadlet.java
===================================================================
--- trunk/freenet/src/freenet/clients/http/WelcomeToadlet.java  2007-04-21 
22:10:53 UTC (rev 12849)
+++ trunk/freenet/src/freenet/clients/http/WelcomeToadlet.java  2007-04-22 
00:09:35 UTC (rev 12850)
@@ -86,7 +86,7 @@
                                return;
                        }
                        String key = request.getPartAsString("key", 256);
-                       L10n.getLanguage().putOverwrite(key, 
request.getPartAsString("trans", 256));
+                       L10n.setOverride(key, request.getPartAsString("trans", 
256));

                        MultiValueTable headers = new MultiValueTable();
                        headers.put("Location", "/?transupdated="+key);
@@ -464,12 +464,20 @@
                                this.writeReply(ctx, 200, "text/plain", "OK", 
sw.toString());
                                return;
                        } else if (request.isParameterSet("getTranlationFile")) 
{
-                               byte[] data = 
L10n.getLanguage().toOrderedString().getBytes("UTF-8");
+                               byte[] data = 
L10n.getCurrentLanguageTranslation().toOrderedString().getBytes("UTF-8");
                                MultiValueTable head = new MultiValueTable();
-                               head.put("Content-Disposition", "attachment; 
filename=\"freenet.l10n."+L10n.getSelectedLanguage()+".properties");
+                               head.put("Content-Disposition", "attachment; 
filename=\"" + L10n.PREFIX +L10n.getSelectedLanguage()+ L10n.SUFFIX + '"');
                                ctx.sendReplyHeaders(200, "Found", head, 
"text/plain", data.length);
                                ctx.writeData(data);
                                return;
+                       } else if 
(request.isParameterSet("getOverrideTranlationFile")) {
+                               byte[] data = 
L10n.getOverrideForCurrentLanguageTranslation().toOrderedString().getBytes("UTF-8");
+                               MultiValueTable head = new MultiValueTable();
+                               head.put("Content-Disposition", "attachment; 
filename=\"" + L10n.PREFIX +L10n.getSelectedLanguage()+ L10n.OVERRIDE_SUFFIX + 
'"');
+                               ctx.sendReplyHeaders(200, "Found", head, 
"text/plain", data.length);
+                               ctx.writeData(data);
+                               return;
+                               
                        } else if (request.isParameterSet("transupdated")) {
                                String key = request.getParam("transupdated");
                                HTMLNode pageNode = 
ctx.getPageMaker().getPageNode("Translation updated!", true, ctx);
@@ -495,9 +503,10 @@
                                );

                                HTMLNode footer = 
translationNode.addChild("div", "class", "warning");
-                               footer.addChild("#", "Be careful: all your 
changes will be lost on reboot: donwload, backup and send us the translation 
file!");
-                               footer.addChild("a", "href", 
"/?getTranlationFile").addChild("#", "Download the translation file");
-                               footer.addChild("%", "  ");           
        
+                               footer.addChild("a", "href", 
"/?getOverrideTranlationFile").addChild("#", "Download the override translation 
file");
+                               footer.addChild("%", "  ");
+                               footer.addChild("a", "href", 
"/?getTranlationFile").addChild("#", "Download the full translation file");
+                               footer.addChild("%", "  ");
                                footer.addChild("a", "href", "/").addChild("#", 
"Return to the main page");

                                this.writeReply(ctx, 200, "text/html; 
charset=utf-8", "OK", pageNode.generate());

Modified: trunk/freenet/src/freenet/l10n/L10n.java
===================================================================
--- trunk/freenet/src/freenet/l10n/L10n.java    2007-04-21 22:10:53 UTC (rev 
12849)
+++ trunk/freenet/src/freenet/l10n/L10n.java    2007-04-22 00:09:35 UTC (rev 
12850)
@@ -3,6 +3,10 @@
  * http://www.gnu.org/ for further details of the GPL. */
 package freenet.l10n;

+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
 import java.io.InputStream;
 import java.util.MissingResourceException;

@@ -16,6 +20,7 @@
  * @author Florent Daignière <nextgens at freenetproject.org>
  * 
  * TODO: Maybe we ought to use the locale to set the default language.
+ * TODO: Maybe base64 the override file ?
  * 
  * comment(mario): for www interface we might detect locale from http requests?
  * for other access (telnet) using system locale would probably be good, but
@@ -23,19 +28,34 @@
  */

 public class L10n {
-       private static final String CLASS_NAME = "L10n";
-       private static String prefix = "freenet.l10n.";
+       public static final String CLASS_NAME = "L10n";
+       public static final String PREFIX = "freenet.l10n.";
+       public static final String SUFFIX = ".properties";
+       public static final String OVERRIDE_SUFFIX = ".override" + SUFFIX;

        // English has to remain the first one!
-       public static final String[] availableLanguages = { "en", "fr", "pl"};
-       private String selectedLanguage = availableLanguages[0];
+       public static final String[] AVAILABLE_LANGUAGES = { "en", "fr", "pl"};
+       private String selectedLanguage = AVAILABLE_LANGUAGES[0];

        private static SimpleFieldSet currentTranslation = null;
        private static SimpleFieldSet fallbackTranslation = null;
        private static L10n currentClass = null;
+       
+       private static SimpleFieldSet translationOverride = null;

        L10n(String selected) {
                selectedLanguage = selected;
+               File tmpFile = new File(L10n.PREFIX + selected + 
L10n.OVERRIDE_SUFFIX);
+               
+               try {
+                       if(tmpFile.exists() && tmpFile.canRead()) {
+                               Logger.normal(this, "Override file detected : 
let's try to load it");
+                               translationOverride = 
SimpleFieldSet.readFrom(tmpFile, true, false);
+                       }
+               } catch (IOException e) {
+                       translationOverride = null;
+                       Logger.error(this, "IOError while accessing the file!" 
+ e.getMessage(), e);
+               }
                currentTranslation = loadTranslation(selectedLanguage);
        }

@@ -46,37 +66,64 @@
         * @throws MissingResourceException
         */
        public static void setLanguage(String selectedLanguage) throws 
MissingResourceException {
-               for(int i=0; i<availableLanguages.length; i++){
-                       
if(selectedLanguage.equalsIgnoreCase(availableLanguages[i])){
-                               selectedLanguage = availableLanguages[i];
+               for(int i=0; i<AVAILABLE_LANGUAGES.length; i++){
+                       
if(selectedLanguage.equalsIgnoreCase(AVAILABLE_LANGUAGES[i])){
+                               selectedLanguage = AVAILABLE_LANGUAGES[i];
                                Logger.normal(CLASS_NAME, "Changing the current 
language to : " + selectedLanguage);
                                currentClass = new L10n(selectedLanguage);
                                if(currentTranslation == null) {
-                                       currentClass = new 
L10n(availableLanguages[0]);
+                                       currentClass = new 
L10n(AVAILABLE_LANGUAGES[0]);
                                        throw new 
MissingResourceException("Unable to load the translation file for 
"+selectedLanguage, "l10n", selectedLanguage);
                                }
                                return;
                        }
                }

-               currentClass = new L10n(availableLanguages[0]);
+               currentClass = new L10n(AVAILABLE_LANGUAGES[0]);
                Logger.error(CLASS_NAME, "The requested translation is not 
available!" + selectedLanguage);
                throw new MissingResourceException("The requested translation 
("+selectedLanguage+") hasn't been found!", CLASS_NAME, selectedLanguage);
        }

-       /**
-        * Set the default language used by the framework. (called from the 
TranslationHelper plugin)
-        * 
-        * @param a property file
-        */
-       public static void setLanguage(SimpleFieldSet customLanguage) {
-               currentTranslation = customLanguage;
+       public static void setOverride(String key, String value) {
+               if(L10n.getString(key).equals(value)) {
+                       translationOverride.removeValue(key);
+                       return;
+               } else if(translationOverride == null) 
+                       translationOverride = new SimpleFieldSet(false);
+               
+               translationOverride.putOverwrite(key, value);
+               Logger.normal("L10n", "Got a new translation key: set the 
Override!");
+               _saveTranslationFile();
        }

-       public static SimpleFieldSet getLanguage() {
+       private synchronized static void _saveTranslationFile() {
+               FileOutputStream fos = null;
+               BufferedOutputStream bos = null;
+               
+               try {
+                       fos = new FileOutputStream(new File(L10n.PREFIX + 
L10n.getSelectedLanguage() + L10n.OVERRIDE_SUFFIX));
+                       bos = new BufferedOutputStream(fos);                    
+                       
+                       
bos.write(L10n.translationOverride.toOrderedString().getBytes("UTF-8"));
+                       Logger.normal("L10n", "Override file saved 
successfully!");
+               } catch (IOException e) {
+                       Logger.error("L10n", "Error while saving the 
translation override: "+ e.getMessage(), e);
+               } finally {
+                       try {
+                               if(bos != null) bos.close();
+                               if(fos != null) fos.close();
+                       } catch (IOException e) {}
+               }
+       }
+       
+       public static SimpleFieldSet getCurrentLanguageTranslation() {
                return currentTranslation;
        }

+       public static SimpleFieldSet getOverrideForCurrentLanguageTranslation() 
{
+               return translationOverride;
+       }
+       
        /**
         * The real meat
         * 
@@ -95,7 +142,10 @@
         * @see getString(String)
         */
        public static String getString(String key, boolean 
returnNullIfNotFound) {
-               String result = currentTranslation.get(key);
+               String result = (translationOverride == null ? null : 
translationOverride.get(key));
+               if(result != null) return result;
+               
+               result = currentTranslation.get(key);
                if(result != null)
                        return result;
                else
@@ -121,7 +171,7 @@
        public static String getDefaultString(String key) {
                String result = null;
                // We instanciate it only if necessary
-               if(fallbackTranslation == null) fallbackTranslation = 
loadTranslation(availableLanguages[0]);
+               if(fallbackTranslation == null) fallbackTranslation = 
loadTranslation(AVAILABLE_LANGUAGES[0]);

                result = fallbackTranslation.get(key);

@@ -182,7 +232,7 @@
         * @return the Properties object or null if not found
         */
        public static SimpleFieldSet loadTranslation(String name) {
-        name = prefix.replace ('.', 
'/').concat(prefix.concat(name.concat(".properties")));
+        name = PREFIX.replace ('.', 
'/').concat(PREFIX.concat(name.concat(SUFFIX)));

         SimpleFieldSet result = null;
         InputStream in = null;

Modified: trunk/freenet/src/freenet/node/Node.java
===================================================================
--- trunk/freenet/src/freenet/node/Node.java    2007-04-21 22:10:53 UTC (rev 
12849)
+++ trunk/freenet/src/freenet/node/Node.java    2007-04-22 00:09:35 UTC (rev 
12850)
@@ -187,7 +187,7 @@
                }

                public String[] getPossibleValues() {
-                       return L10n.availableLanguages;
+                       return L10n.AVAILABLE_LANGUAGES;
                }
        }



Reply via email to