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;
}
}