Author: nextgens Date: 2007-04-01 19:39:00 +0000 (Sun, 01 Apr 2007) New Revision: 12517
Added: trunk/plugins/TranslationHelper/ trunk/plugins/TranslationHelper/TranslationHelper.java Modified: trunk/freenet/src/freenet/l10n/L10n.java Log: new plugin : TranslationHelper... it provides only basic stuffs... and ought to be improved (the CSS hasn't been touched and I'm not a XHTML expert ;)) see http://archives.freenetproject.org/message/20070401.001318.cbb0ddd3.en.html Modified: trunk/freenet/src/freenet/l10n/L10n.java =================================================================== --- trunk/freenet/src/freenet/l10n/L10n.java 2007-04-01 19:15:52 UTC (rev 12516) +++ trunk/freenet/src/freenet/l10n/L10n.java 2007-04-01 19:39:00 UTC (rev 12517) @@ -4,6 +4,7 @@ package freenet.l10n; import java.io.InputStream; +import java.util.Enumeration; import java.util.MissingResourceException; import java.util.Properties; @@ -69,11 +70,19 @@ */ public static String getString(String key) { String result = currentProperties.getProperty(key); - if(result != null) return result; - + if(result != null) + return result; + else + return getDefaultString(key); + } + + public static String getDefaultString(String key) { + String result = null; // We instanciate it only if necessary if(fallbackProperties == null) fallbackProperties = loadProperties(availableLanguages[0]); + result = fallbackProperties.getProperty(key); + if(result != null) { Logger.normal(CLASS_NAME, "The translation for " + key + " hasn't been found! please tell the maintainer."); return result; @@ -107,7 +116,7 @@ * @param name * @return the Properties object or null if not found */ - private static Properties loadProperties (String name) { + public static Properties loadProperties (String name) { name = prefix.replace ('.', '/').concat(prefix.concat(name.concat(".properties"))); Properties result = null; @@ -134,6 +143,10 @@ return currentClass.selectedLanguage; } + public static Enumeration getKeys() { + return currentProperties.propertyNames(); + } + public static void main(String[] args) { L10n.setLanguage("en"); System.out.println(L10n.getString("testing.test")); Added: trunk/plugins/TranslationHelper/TranslationHelper.java =================================================================== --- trunk/plugins/TranslationHelper/TranslationHelper.java (rev 0) +++ trunk/plugins/TranslationHelper/TranslationHelper.java 2007-04-01 19:39:00 UTC (rev 12517) @@ -0,0 +1,203 @@ +/* This code is part of Freenet. It is distributed under the GNU General + * Public License, version 2 (or at your option any later version). See + * http://www.gnu.org/ for further details of the GPL. */ +package plugins.TranslationHelper; + +import java.io.IOException; +import java.io.StringWriter; +import java.util.Enumeration; +import java.util.Properties; + +import freenet.l10n.L10n; +import freenet.pluginmanager.FredPlugin; +import freenet.pluginmanager.FredPluginHTTP; +import freenet.pluginmanager.FredPluginThreadless; +import freenet.pluginmanager.PluginHTTPException; +import freenet.pluginmanager.PluginRespirator; +import freenet.support.HTMLNode; +import freenet.support.api.HTTPRequest; + +/** + * This plugin is a helper to manage freenet translation files. + * + * @author Florent Daignière <nextgens at freenetproject.org> + */ +public class TranslationHelper implements FredPlugin, FredPluginHTTP, FredPluginThreadless { + public static String PLUGIN_NAME = "TranslationHelper"; + public static String PLUGIN_BASE_URL = "/plugins/plugins." + PLUGIN_NAME + '.' + PLUGIN_NAME + '/'; + private PluginRespirator pr; + private Properties editedProperties; + private String editedLang; + + public void runPlugin(PluginRespirator pr) { + this.pr = pr; + editedLang = L10n.availableLanguages[0]; + editedProperties = L10n.loadProperties(editedLang); + } + + public void terminate() { + // TODO Auto-generated method stub + + } + + public String handleHTTPGet(HTTPRequest request) throws PluginHTTPException { + if(request.isParameterSet("reload")) { + editedLang = request.getParam("reload"); + HTMLNode pageNode = pr.getPageMaker().getPageNode(PLUGIN_NAME+" page : warning", false, null); + HTMLNode contentNode = pr.getPageMaker().getContentNode(pageNode); + + HTMLNode availableLanguagesInfobox = contentNode.addChild("div", "class", "infobox infobox-warning"); + HTMLNode availableLanguagesInfoboxHeader = availableLanguagesInfobox.addChild("div", "class", "infobox-header"); + HTMLNode availableLanguagesInfoboxContent = availableLanguagesInfobox.addChild("div", "class", "infobox-content"); + + availableLanguagesInfoboxHeader.addChild("#", "Please confirm!"); + + availableLanguagesInfoboxContent.addChild("#", "Please confirm that you want to reload the default translations from " + editedLang); + HTMLNode updateForm = pr.addFormChild(availableLanguagesInfoboxContent, PLUGIN_BASE_URL, "reload"); + + updateForm.addChild("input", + new String[] { "type", "name", "value" }, + new String[] { "hidden", "reload", request.getParam("lang") + }); + updateForm.addChild("input", + new String[] { "type", "name", "value" }, + new String[] { "submit", "confirm", "Confirm and reload!" + }); + + return pageNode.generate(); + }else if(request.isParameterSet("lang")) { + editedLang = request.getParam("lang"); + HTMLNode pageNode = pr.getPageMaker().getPageNode(PLUGIN_NAME+" page for "+editedLang, false, null); + HTMLNode contentNode = pr.getPageMaker().getContentNode(pageNode); + + HTMLNode translationNode = contentNode.addChild("div", "class", "translation"); + HTMLNode updateForm = pr.addFormChild(translationNode, PLUGIN_BASE_URL, "update"); + HTMLNode legendTable = updateForm.addChild("table", "class", "translation"); + + HTMLNode legendRow = legendTable.addChild("tr"); + legendRow.addChild("td", "class", "translation-key", "Translation key"); + legendRow.addChild("td", "class", "translation-key", "Original translation"); + legendRow.addChild("td", "class", "translation-key", "Current translation"); + + final Enumeration keys = L10n.getKeys(); + + while(keys.hasMoreElements()){ + String key = (String)keys.nextElement(); + HTMLNode contentRow = legendTable.addChild("tr"); + contentRow.addChild("td", "class", "translation-key", + key + ); + contentRow.addChild("td", "class", "translation-orig", + L10n.getDefaultString(key) + ); + contentRow.addChild("td", "class", "translation-new").addChild( + "input", + new String[] { "type", "name", "value" }, + new String[] { "text", key, editedProperties.getProperty(key) + }); + } + HTMLNode contentRow = legendTable.addChild("tr"); + contentRow.addChild("input", + new String[] { "type", "name", "value" }, + new String[] { "hidden", "lang", request.getParam("lang") + }); + contentRow.addChild("input", + new String[] { "type", "name", "value" }, + new String[] { "submit", "update", "Update the translation!" + }); + contentRow.addChild("%", " "); + contentRow.addChild("a", "href", PLUGIN_BASE_URL+"?getTranlationFile").addChild("#", "Download the translation file"); + + contentRow.addChild("%", " "); + contentRow.addChild("a", "href", PLUGIN_BASE_URL).addChild("#", "Return to the plugin's main page"); + + return pageNode.generate(); + } else if(request.isParameterSet("getTranlationFile")) { + StringWriter out = new StringWriter(); + try { + editedProperties.store(out, "Translation file for "+editedLang); + } catch (IOException e) {} // huh ? + return out.toString(); + } + + HTMLNode pageNode = pr.getPageMaker().getPageNode(PLUGIN_NAME+" page", false, null); + HTMLNode contentNode = pr.getPageMaker().getContentNode(pageNode); + + HTMLNode availableLanguagesInfobox = contentNode.addChild("div", "class", "infobox infobox-normal"); + HTMLNode availableLanguagesInfoboxHeader = availableLanguagesInfobox.addChild("div", "class", "infobox-header"); + HTMLNode availableLanguagesInfoboxContent = availableLanguagesInfobox.addChild("div", "class", "infobox-content"); + + availableLanguagesInfoboxHeader.addChild("#", "Available languages"); + + availableLanguagesInfoboxContent.addChild("#", "Here is the list of available languages on this freenet node :"); + HTMLNode availableLanguagesList = availableLanguagesInfoboxContent.addChild("ul"); + for(int i=0; i<L10n.availableLanguages.length; i++){ + availableLanguagesList.addChild("li").addChild("ul"); + availableLanguagesList.addChild("a", "href", PLUGIN_BASE_URL + "?lang="+L10n.availableLanguages[i]).addChild("#", L10n.availableLanguages[i]); + availableLanguagesList.addChild("%", " "); + availableLanguagesList.addChild("#", "erase the current translation with the "); + availableLanguagesList.addChild("a", "href", PLUGIN_BASE_URL + "?reload=" + L10n.availableLanguages[i] + "&lang="+L10n.availableLanguages[i]).addChild("#", "default template"); + } + + availableLanguagesInfoboxContent.addChild("a", "href", PLUGIN_BASE_URL+"?getTranlationFile").addChild("#", "Download the translation file"); +// availableLanguagesInfoboxContent.addChild( +// "#", +// "Or create ").addChild( +// "a", +// "href", +// PLUGIN_BASE_URL + "?new").addChild( +// "#", +// "a new one" +// ); + + + return pageNode.generate(); + } + + public String handleHTTPPost(HTTPRequest request) throws PluginHTTPException { + if(request.isPartSet("update")){ + Enumeration keys = editedProperties.keys(); + while(keys.hasMoreElements()) { + String key = (String)keys.nextElement(); + editedProperties.setProperty(key, request.getPartAsString(key, 256)); + } + + HTMLNode pageNode = pr.getPageMaker().getPageNode(PLUGIN_NAME+" page", false, null); + HTMLNode contentNode = pr.getPageMaker().getContentNode(pageNode); + + HTMLNode returnToPluginInfobox = contentNode.addChild("div", "class", "infobox infobox-normal"); + HTMLNode returnToPluginInfoboxHeader = returnToPluginInfobox.addChild("div", "class", "infobox-header"); + HTMLNode returnToPluginInfoboxContent = returnToPluginInfobox.addChild("div", "class", "infobox-content"); + + returnToPluginInfoboxHeader.addChild("#", "Changes have been taken into account"); + + returnToPluginInfoboxContent.addChild("#","Your changes have been taken into account. Please "); + returnToPluginInfoboxContent.addChild("a", "href", PLUGIN_BASE_URL+"?lang="+editedLang).addChild("#", "click here to continue."); + returnToPluginInfoboxContent.addChild("%", " "); + returnToPluginInfoboxContent.addChild("a", "href", PLUGIN_BASE_URL).addChild("#", "Return to the plugin's main page"); + return pageNode.generate(); + }else if(request.isPartSet("reload")) { + editedProperties = L10n.loadProperties(editedLang); + HTMLNode pageNode = pr.getPageMaker().getPageNode(PLUGIN_NAME+" page", false, null); + HTMLNode contentNode = pr.getPageMaker().getContentNode(pageNode); + + HTMLNode returnToPluginInfobox = contentNode.addChild("div", "class", "infobox infobox-normal"); + HTMLNode returnToPluginInfoboxHeader = returnToPluginInfobox.addChild("div", "class", "infobox-header"); + HTMLNode returnToPluginInfoboxContent = returnToPluginInfobox.addChild("div", "class", "infobox-content"); + + returnToPluginInfoboxHeader.addChild("#", "Changes have been taken into account"); + + returnToPluginInfoboxContent.addChild("#","Your changes have been taken into account. Please "); + returnToPluginInfoboxContent.addChild("a", "href", PLUGIN_BASE_URL+"?lang="+editedLang).addChild("#", "click here to continue."); + returnToPluginInfoboxContent.addChild("%", " "); + returnToPluginInfoboxContent.addChild("a", "href", PLUGIN_BASE_URL).addChild("#", "Return to the plugin's main page"); + return pageNode.generate(); + } + return null; + } + + public String handleHTTPPut(HTTPRequest request) throws PluginHTTPException { + return null; + } + +}
