package com.limegroup.gnutella.i18n;
import java.io.File;
import java.util.Enumeration;
import java.util.Map;
import java.util.Properties;
/**
* Was used to convert certain keys in the old MessageBundle_**_.properties files.
*/
public class KeyConverter {
@SuppressWarnings("unused")
private final static Rule[] rules = new Rule[] {
new ConcatenateAndInsertRule("DOWNLOAD_APPLY_NEW_THEME_START",
"DOWNLOAD_APPLY_NEW_THEME_END", "{0}",
"DOWNLOAD_APPLY_NEW_THEME"),
new ConcatenateAndInsertRule("ERROR_BROWSE_HOST_FAILED_BEGIN_KEY",
"ERROR_BROWSE_HOST_FAILED_END_KEY", " {0} ",
"ERROR_BROWSE_HOST_FAILED"),
new ConcatenateAndInsertRule("ERROR_CANT_RESUME_START",
"ERROR_CANT_RESUME_END", " {0} ", "ERROR_CANT_RESUME"),
new ConcatenateAndInsertRule("MESSAGE_UNABLE_TO_RENAME_FILE_START",
"MESSAGE_UNABLE_TO_RENAME_FILE_END", " {0} ",
"MESSAGE_UNABLE_TO_RENAME_FILE"),
new ConcatenateAndInsertRule("MESSAGE_FILE_CORRUPT",
"MESSAGE_CONTINUE_DOWNLOAD", " {0} ",
"MESSAGE_FILE_CORRUPT"),
new ConcatenateAndInsertRule("MESSAGE_SENSITIVE_SHARE_TOP",
"MESSAGE_SENSITIVE_SHARE_BOTTOM", "\n\n{0}\n\n",
"MESSAGE_SENSITIVE_SHARE"),
new ConcatenateRule("SEARCH_VIRUS_MSG", "SEARCH_VIRUS_MSG_ONE",
"SEARCH_VIRUS_MSG_TWO", "SEARCH_VIRUS_MSG_THREE") };
@SuppressWarnings("unused")
private static final Rule encodeMnemonics = new EncodeMnemonicAsAmpersAnd();
@SuppressWarnings("unused")
private static final Rule[] rules2 = new Rule[] {
new ConcatenateAndInsertRule("STATISTICS_SHARING_TOOLTIP",
"STATISTICS_FILES_TOOLTIP", " {0} ",
"STATISTICS_SHARING_TOOLTIP_NEW"),
new ConcatenateAndInsertRule("STATISTICS_SHARING_TOOLTIP",
"STATISTICS_FILES_TOOLTIP_PENDING", " {0} ",
"STATISTICS_SHARING_TOOLTIP_PENDING_NEW"),
};
private static final Rule[] rules3 = new Rule[] {
new ConcatenateAndInsertRule("DOWNLOAD_STATUS_WAITING_FOR_REQUERY_START",
"DOWNLOAD_STATUS_WAITING_FOR_REQUERY_END", " {0}",
"DOWNLOAD_STATUS_WAITING_FOR_REQUERY")
};
/**
* Call this in lib/messagebundles.
*/
public static void main(String[] args) throws Exception {
File dir = new File(".");
LanguageLoader loader = new LanguageLoader(dir);
Map<String, LanguageInfo> languages = loader.loadLanguages();
// apply conversions
for (LanguageInfo language : languages.values()) {
applyRules(language.getProperties(), rules3);
}
LanguageUpdater updater = new LanguageUpdater(dir, languages, loader
.getEnglishLines());
updater.updateAllLanguages();
}
private static void applyRules(Properties props, Rule...rules) {
for (Rule rule : rules) {
rule.apply(props);
}
}
private interface Rule {
void apply(Properties props);
}
/**
* Concateantes first value and second value inserting <code>insert</code>
* between them.
*/
private static class ConcatenateAndInsertRule implements Rule {
private String firstKey;
private String secondKey;
private String insert;
private String newKey;
public ConcatenateAndInsertRule(String firstKey, String secondKey,
String insert, String newKey) {
this.firstKey = firstKey;
this.secondKey = secondKey;
this.insert = insert;
this.newKey = newKey;
}
public void apply(Properties props) {
String firstValue = props.getProperty(firstKey, null);
String secondValue = props.getProperty(secondKey, null);
if (firstValue != null && secondValue != null) {
System.out.println(newKey + "=" + firstValue + insert
+ secondValue);
props.setProperty(newKey, firstValue + insert + secondValue);
}
}
}
/**
* Adds spaces between values.
*/
private static class ConcatenateRule implements Rule {
private String newKey;
private String[] keys;
public ConcatenateRule(String newKey, String... keys) {
this.newKey = newKey;
this.keys = keys;
}
public void apply(Properties props) {
StringBuilder builder = new StringBuilder();
for (String key : keys) {
String value = props.getProperty(key, null);
if (value == null) {
return;
}
builder.append(value);
builder.append(" ");
}
builder.setLength(builder.length() - 1);
System.out.println(newKey + "=" + builder.toString());
props.setProperty(newKey, builder.toString());
}
}
private static class EncodeMnemonicAsAmpersAnd implements Rule {
public void apply(Properties props) {
for (Enumeration<?> e = props.propertyNames(); e.hasMoreElements();) {
String key = (String)e.nextElement();
if (key.endsWith("_MNEMONIC")) {
// find corresponding label key
String labelKey = key.substring(0, key.length() - "_MNEMONIC".length());
String label = props.getProperty(labelKey, null);
if (label != null) {
String mnemonic = props.getProperty(key);
String replaced = label.replaceFirst(mnemonic, "&" + mnemonic);
if (replaced.equals(label)) {
replaced = label.replaceFirst(mnemonic.toLowerCase(), "&" + mnemonic.toLowerCase());
}
System.out.println("Replaced: " + replaced);
props.put(labelKey, replaced);
}
}
}
}
}
}