On Wed, Aug 20, 2008 at 3:11 AM, <nextgens at freenetproject.org> wrote:
> Author: nextgens
> Date: 2008-08-19 19:11:49 +0000 (Tue, 19 Aug 2008)
> New Revision: 22032
>
> Modified:
> trunk/freenet/src/freenet/clients/http/PageMaker.java
> trunk/freenet/src/freenet/clients/http/TranslationToadlet.java
> trunk/freenet/src/freenet/l10n/L10n.java
> trunk/freenet/src/freenet/node/Node.java
> trunk/freenet/src/freenet/node/fcp/NodeHelloMessage.java
> Log:
> Use an enum in the L10n framework; needs testing.
>
> Modified: trunk/freenet/src/freenet/clients/http/PageMaker.java
> ===================================================================
> --- trunk/freenet/src/freenet/clients/http/PageMaker.java 2008-08-19
> 18:50:57 UTC (rev 22031)
> +++ trunk/freenet/src/freenet/clients/http/PageMaker.java 2008-08-19
> 19:11:49 UTC (rev 22032)
> @@ -94,7 +94,7 @@
> public HTMLNode getPageNode(String title, boolean
> renderNavigationLinks, ToadletContext ctx) {
> boolean fullAccess = ctx == null ? false :
> ctx.isAllowedFullAccess();
> HTMLNode pageNode = new HTMLNode.HTMLDoctype("html",
> "-//W3C//DTD XHTML 1.1//EN");
> - HTMLNode htmlNode = pageNode.addChild("html", "xml:lang",
> L10n.getSelectedLanguage());
> + HTMLNode htmlNode = pageNode.addChild("html", "xml:lang",
> L10n.getSelectedLanguage().getISOCode());
> HTMLNode headNode = htmlNode.addChild("head");
> headNode.addChild("meta", new String[] { "http-equiv",
> "content" }, new String[] { "Content-Type", "text/html; charset=utf-8" });
> headNode.addChild("title", title + " - Freenet");
>
> Modified: trunk/freenet/src/freenet/clients/http/TranslationToadlet.java
> ===================================================================
> --- trunk/freenet/src/freenet/clients/http/TranslationToadlet.java
> 2008-08-19 18:50:57 UTC (rev 22031)
> +++ trunk/freenet/src/freenet/clients/http/TranslationToadlet.java
> 2008-08-19 19:11:49 UTC (rev 22032)
> @@ -154,7 +154,7 @@
>
> HTMLNode translationNode = contentNode.addChild("div",
> "class", "translation");
> HTMLNode translationHeaderNode = translationNode.addChild("p");
> - translationHeaderNode.addChild("#",
> l10n("contributingToLabelWithLang", "lang", L10n.getSelectedLanguage()));
> + translationHeaderNode.addChild("#",
> l10n("contributingToLabelWithLang", "lang",
> L10n.getSelectedLanguage().getFullName()));
> translationHeaderNode.addChild("a", "href",
> TOADLET_URL+"?getOverrideTranlationFile").addChild("#",
> l10n("downloadTranslationsFile"));
> translationHeaderNode.addChild("#", " ");
> if(showEverything)
>
> Modified: trunk/freenet/src/freenet/l10n/L10n.java
> ===================================================================
> --- trunk/freenet/src/freenet/l10n/L10n.java 2008-08-19 18:50:57 UTC (rev
> 22031)
> +++ trunk/freenet/src/freenet/l10n/L10n.java 2008-08-19 19:11:49 UTC (rev
> 22032)
> @@ -31,25 +31,83 @@
> public static final String SUFFIX = ".properties";
> public static final String OVERRIDE_SUFFIX = ".override" + SUFFIX;
>
> - public static final String FALLBACK_DEFAULT = "en";
> + public static final LANGUAGE FALLBACK_DEFAULT = LANGUAGE.ENGLISH;
> +
> /** @see http://www.omniglot.com/language/names.htm */
> - public static final String[][] AVAILABLE_LANGUAGES = {
> - new String[] { "en", "English", "eng" },
> - new String[] { "es", "Espa?ol", "spa" },
> - new String[] { "da", "Dansk", "dan" },
> - new String[] { "de", "Deutsch", "deu" },
> - new String[] { "fi", "Suomi", "fin" },
> - new String[] { "fr", "Fran?ais", "fra" },
> - new String[] { "it", "Italiano", "ita" },
> - new String[] { "no", "Norsk", "nor" },
> - new String[] { "pl", "Polski", "pol" },
> - new String[] { "se", "Svenska", "svk" },
> - new String[] { "zh-cn", "??(??)", "chn" },
> - new String[] { "zh-tw", "??(??)", "zh-tw" },
> - new String[] { "unlisted", "unlisted", "unlisted"},
> - };
> - private final String selectedLanguage;
> + public enum LANGUAGE {
> + ENGLISH("en", "English", "eng"),
> + SPANISH("es", "Espa?ol", "spa"),
> + DANISH("da", "Dansk", "dan"),
> + GERMAN("de", "Deutsch", "deu"),
> + FINNISH("fi", "Suomi", "fin"),
> + FRENCH("fr", "Fran?ais", "fra"),
> + ITALIAN("it", "Italiano", "ita"),
> + NORWEGIAN("no", "Norsk", "nor"),
> + POLISH("pl", "Polski", "pol"),
> + SWEDISH("se", "Svenska", "svk"),
> + CHINESE("zh-cn", "??(??)", "chn"),
> + CHINESE_TAIWAN("zh-tw", "??(??)", "zh-tw"),
Why "chn" for zh-cn while keeping zh-tw intract?
What's the "short code" intended for?
"chn" is the ISO-639 code for "Chinook jargon"
"chn" is the ISO 3166-1 code for China (the nation, not the language)
The ISO-639-1 code for Chinese (PRC Mainland or Taiwan) is zho-*
(It's the code for *spoken* language, not *written* language, so there is no
exact mapping)
The IANA standard is even messier:
zh-cmn Mandarin Chinese
zh-cmn-Hans Mandarin Chinese (Simplified)
zh-cmn-Hant Mandarin Chinese (Traditional)
zh-Hans Chinese, in simplified script
zh-Hans-CN PRC Mainland Chinese in simplified script ...[ this is
what our zh-cn use ]
zh-Hans-TW Taiwan Chinese in simplified script ...[which never exist]
[...]
zh-Hant Chinese, in traditional script
zh-Hant-CN PRC Mainland Chinese in traditional script ...[which never exist]
zh-Hant-TW Taiwan Chinese in traditional script ...[ this is what
our zh-tw use ]
The "zh-tw" / "zh-cn" are unix tradition, which is not in any standard
I am awared of.
> + UNLISTED("unlisted", "unlisted", "unlisted");
> +
> + private final String shortCode;
> + private final String fullName;
> + private final String isoCode;
> +
> + LANGUAGE(String shortCode, String fullName, String isoCode) {
> + this.shortCode = shortCode;
> + this.fullName = fullName;
> + this.isoCode = isoCode;
> + }
> +
> + LANGUAGE(LANGUAGE l) {
> + this(l.getShortCode(), l.getFullName(),
> l.getISOCode());
> + }
> +
> + public static LANGUAGE mapToLanguage(String whatever) throws
> MissingResourceException {
> + for(LANGUAGE currentLanguage : LANGUAGE.values()) {
> +
> if(currentLanguage.getShortCode().equalsIgnoreCase(whatever) ||
> +
> currentLanguage.getShortCode().equalsIgnoreCase(whatever) ||
> +
> currentLanguage.getISOCode().equalsIgnoreCase(whatever) ||
> +
> currentLanguage.toString().equalsIgnoreCase(whatever))
> + {
> + return currentLanguage;
> + }
> + }
> + return null;
> + }
> +
> + public String getFullName() {
> + return fullName;
> + }
> +
> + public String getShortCode() {
> + return shortCode;
> + }
> +
> + public String getISOCode() {
> + return isoCode;
> + }
> +
> + protected String getL10nFilename() {
> + return PREFIX.replace ('.',
> '/').concat(PREFIX.concat(shortCode.concat(SUFFIX)));
> + }
> +
> + protected String getL10nOverrideFilename() {
> + return L10n.PREFIX + shortCode + L10n.OVERRIDE_SUFFIX;
> + }
> +
> + public static String[] valuesWithFullNames() {
> + LANGUAGE[] allValues = values();
> + String[] result = new String[allValues.length];
> + for(int i=0; i<allValues.length; i++)
> + result[i] = allValues[i].getFullName();
> +
> + return result;
> + }
> + }
>
> + private final LANGUAGE selectedLanguage;
> +
> private static SimpleFieldSet currentTranslation = null;
> private static SimpleFieldSet fallbackTranslation = null;
> private static L10n currentClass = null;
> @@ -57,11 +115,10 @@
> private static SimpleFieldSet translationOverride;
> private static final Object sync = new Object();
>
> - L10n(String selected) {
> - selectedLanguage = mapLanguageNameToShortCode(selected);
> - File tmpFile = new File(L10n.PREFIX + selectedLanguage +
> L10n.OVERRIDE_SUFFIX);
> -
> + L10n(LANGUAGE selected) {
> + selectedLanguage = selected;
> try {
> + File tmpFile = new
> File(selected.getL10nOverrideFilename());
> if(tmpFile.exists() && tmpFile.canRead() &&
> tmpFile.length() > 0) {
> Logger.normal(this, "Override file detected :
> let's try to load it");
> translationOverride =
> SimpleFieldSet.readFrom(tmpFile, false, false);
> @@ -94,15 +151,17 @@
> * @throws MissingResourceException
> */
> public static void setLanguage(String selectedLanguage) throws
> MissingResourceException {
> - selectedLanguage =
> mapLanguageNameToLongName(selectedLanguage);
> synchronized (sync) {
> Logger.normal(CLASS_NAME, "Changing the current
> language to : " + selectedLanguage);
> - currentClass = new L10n(selectedLanguage);
> + L10n oldClass = currentClass;
> + LANGUAGE lang =
> LANGUAGE.mapToLanguage(selectedLanguage);
> if(currentClass == null) {
> - currentClass = new L10n(FALLBACK_DEFAULT);
> + currentClass = (oldClass != null ? oldClass :
> new L10n(FALLBACK_DEFAULT));
> 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);
> - }
> + } else
> + currentClass = new L10n(lang);
> +
> }
> }
>
> @@ -133,10 +192,11 @@
>
> private static void _saveTranslationFile() {
> FileOutputStream fos = null;
> - File finalFile = new File(L10n.PREFIX +
> L10n.getSelectedLanguage() + L10n.OVERRIDE_SUFFIX);
> + File finalFile = new
> File(getSelectedLanguage().getL10nOverrideFilename());
>
> try {
> // We don't set deleteOnExit on it : if the save
> operation fails, we want a backup
> + // FIXME: REDFLAG: not symlink-race proof!
> File tempFile = new File(finalFile.getParentFile(),
> finalFile.getName()+".bak");
> Logger.minor("L10n", "The temporary filename is : " +
> tempFile);
>
> @@ -270,7 +330,7 @@
>
> /**
> * Allows things like :
> - * L10n.getString("testing.test", new String[]{ "test1", "test2" },
> new String[] { "a", "b" })
> + * L10n.getString("testing.test", new String[]{ "test1", "test2" },
> "a", "b" })
> *
> * @param key
> * @param patterns : a list of patterns wich are matchable from the
> translation
> @@ -311,7 +371,7 @@
> *
> * @return String
> */
> - public static String getSelectedLanguage() {
> + public static LANGUAGE getSelectedLanguage() {
> synchronized (sync) {
> if((currentClass == null) ||
> (currentClass.selectedLanguage == null))
> return FALLBACK_DEFAULT;
> @@ -326,26 +386,18 @@
> * @param name
> * @return the Properties object or null if not found
> */
> - public static SimpleFieldSet loadTranslation(String name) {
> - String shortCountryCode = mapLanguageNameToShortCode(name);
> - if(shortCountryCode == null) {
> - Logger.error("L10n", "Can't map "+name+" to a country
> code!");
> - return null;
> - } else
> - name = shortCountryCode;
> - name = PREFIX.replace ('.',
> '/').concat(PREFIX.concat(name.concat(SUFFIX)));
> -
> + public static SimpleFieldSet loadTranslation(LANGUAGE lang) {
> SimpleFieldSet result = null;
> InputStream in = null;
> try {
> ClassLoader loader =
> ClassLoader.getSystemClassLoader();
>
> // Returns null on lookup failures:
> - in = loader.getResourceAsStream(name);
> + in =
> loader.getResourceAsStream(lang.getL10nFilename());
> if(in != null)
> result = SimpleFieldSet.readFrom(in, false,
> false);
> } catch (Exception e) {
> - Logger.error("L10n", "Error while loading the l10n
> file from " + name + " :" + e.getMessage(), e);
> + Logger.error("L10n", "Error while loading the l10n
> file from " + lang.getL10nFilename() + " :" + e.getMessage(), e);
> result = null;
> } finally {
> Closer.close(in);
> @@ -353,43 +405,7 @@
>
> return result;
> }
> -
> - /**
> - * Map a full string language name to the corresponding country short
> code
> - *
> - * @param The name to look for
> - * @return The two letters short code OR null if not found
> - */
> - public static String mapLanguageNameToShortCode(String name) {
> - for(int i=0; i<AVAILABLE_LANGUAGES.length; i++) {
> - String currentShortCode = AVAILABLE_LANGUAGES[i][0];
> - String currentLongName = AVAILABLE_LANGUAGES[i][1];
> - String currentCountryCodeName =
> AVAILABLE_LANGUAGES[i][2];
> -
> - if(currentShortCode.equalsIgnoreCase(name) ||
> currentLongName.equalsIgnoreCase(name) ||
> currentCountryCodeName.equalsIgnoreCase(name))
> - return currentShortCode;
> - }
> - return null;
> - }
>
> - /**
> - * Map a language identifier to its corresponding long name
> - *
> - * @param The name to look for
> - * @return The full text language name OR null if not found
> - */
> - public static String mapLanguageNameToLongName(String name) {
> - for(int i=0; i<AVAILABLE_LANGUAGES.length; i++) {
> - String currentShortCode = AVAILABLE_LANGUAGES[i][0];
> - String currentLongName = AVAILABLE_LANGUAGES[i][1];
> - String currentCountryCodeName =
> AVAILABLE_LANGUAGES[i][2];
> -
> - if(currentShortCode.equalsIgnoreCase(name) ||
> currentLongName.equalsIgnoreCase(name) ||
> currentCountryCodeName.equalsIgnoreCase(name))
> - return currentLongName;
> - }
> - return null;
> - }
> -
> public static boolean isOverridden(String key) {
> synchronized(sync) {
> if(translationOverride == null) return false;
>
> Modified: trunk/freenet/src/freenet/node/Node.java
> ===================================================================
> --- trunk/freenet/src/freenet/node/Node.java 2008-08-19 18:50:57 UTC (rev
> 22031)
> +++ trunk/freenet/src/freenet/node/Node.java 2008-08-19 19:11:49 UTC (rev
> 22032)
> @@ -207,11 +207,11 @@
> private static class L10nCallback extends StringCallback implements
> EnumerableOptionCallback {
>
> public String get() {
> - return
> L10n.mapLanguageNameToLongName(L10n.getSelectedLanguage());
> + return L10n.getSelectedLanguage().getFullName();
> }
>
> public void set(String val) throws InvalidConfigValueException
> {
> - if(get().equalsIgnoreCase(val)) return;
> + if(val == null || get().equalsIgnoreCase(val)) return;
> try {
> L10n.setLanguage(val);
> } catch (MissingResourceException e) {
> @@ -224,10 +224,7 @@
> }
>
> public String[] getPossibleValues() {
> - String[] result = new
> String[L10n.AVAILABLE_LANGUAGES.length];
> - for(int i=0; i<L10n.AVAILABLE_LANGUAGES.length; i++)
> - result[i] = L10n.AVAILABLE_LANGUAGES[i][1];
> - return result;
> + return L10n.LANGUAGE.valuesWithFullNames();
> }
> }
>
> @@ -656,7 +653,7 @@
> try {
>
> L10n.setLanguage(nodeConfig.getOption("l10n").getDefault());
> } catch (MissingResourceException e1) {
> - L10n.setLanguage(L10n.FALLBACK_DEFAULT);
> +
> L10n.setLanguage(L10n.LANGUAGE.ENGLISH.getShortCode());
> }
> }
>
>
> Modified: trunk/freenet/src/freenet/node/fcp/NodeHelloMessage.java
> ===================================================================
> --- trunk/freenet/src/freenet/node/fcp/NodeHelloMessage.java 2008-08-19
> 18:50:57 UTC (rev 22031)
> +++ trunk/freenet/src/freenet/node/fcp/NodeHelloMessage.java 2008-08-19
> 19:11:49 UTC (rev 22032)
> @@ -43,7 +43,7 @@
> sfs.putSingle("Testnet", Boolean.toString(node == null ? false
> : node.isTestnetEnabled()));
> sfs.putSingle("CompressionCodecs",
> Integer.toString(Compressor.countCompressAlgorithms()));
> sfs.putSingle("ConnectionIdentifier", id);
> - sfs.putSingle("NodeLanguage", L10n.getSelectedLanguage());
> + sfs.putSingle("NodeLanguage",
> L10n.getSelectedLanguage().toString());
> return sfs;
> }
>
>
> _______________________________________________
> cvs mailing list
> cvs at freenetproject.org
> http://emu.freenetproject.org/cgi-bin/mailman/listinfo/cvs