/**
* Copyright (C) 2002-2012 The FreeCol Team
*
* This file is part of FreeCol.
*
* FreeCol is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* FreeCol is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with FreeCol. If not, see <http://www.gnu.org/licenses/>.
*/
package net.sf.freecol.tools;
import java.io.File;
import java.io.FileInputStream;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Properties;
import java.util.TreeSet;
public class TranslationReport {
private static class LanguageStatsRecord{
String localFile = "";
int missingKeys = 0;
int missingVariables = 0;
int copiedKeys = 0;
public int superfluousVariables;
public int superfluousKeys;
}
private static final String stars =
"*****************************************************************";
private static final boolean printSummary = true;
public static void main(String[] args) throws Exception {
ArrayList<LanguageStatsRecord> statistics = new ArrayList<LanguageStatsRecord>();
//String dirName = "src/net/sf/freecol/client/gui/i18n/";
String dirName = args[0];
File directory = new File(dirName);
if (!directory.isDirectory()) {
System.exit(1);
}
final String localeKey = args.length > 1 ? args[1] : "";
String[] languageFiles = directory.list(new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.matches("FreeColMessages_" + localeKey + ".*\\.properties");
}
});
File masterFile = new File(directory, "FreeColMessages.properties");
Properties master = new Properties();
master.load(new FileInputStream(masterFile));
//System.out.println("*** Found master property file with " + master.size() + " properties.\n");
for (String name : languageFiles) {
LanguageStatsRecord lstat = new LanguageStatsRecord();
lstat.localFile = name;
File propertyFile = new File(directory, name);
Properties properties = new Properties();
properties.load(new FileInputStream(propertyFile));
System.out.println(name.length()+8 < stars.length() ? stars.substring(0, name.length() + 8) : stars);
System.out.println("*** " + name + " ***");
System.out.println(name.length()+8 < stars.length() ? stars.substring(0, name.length() + 8) : stars);
ArrayList<String> missingKeys = new ArrayList<String>();
ArrayList<String> missingVariables = new ArrayList<String>();
ArrayList<String> copiedFromMaster = new ArrayList<String>();
for (Enumeration<Object> keys = master.keys() ; keys.hasMoreElements() ;) {
String key = (String) keys.nextElement();
String value = properties.getProperty(key, null);
if (value == null) {
missingKeys.add(key);
} else {
String masterValue = master.getProperty(key);
int lastIndex = 0;
boolean inVariable = false;
if (value.equalsIgnoreCase(masterValue)){
// ignore some values which are most probably copies in many languages
if (!key.contains("newColonyName")
&& !(key.contains("foundingFather") && key.contains(".birthAndDeath"))
&& !(key.contains("foundingFather") && key.contains(".name")) ){
copiedFromMaster.add(key);
}
}
for (int index = 0; index < masterValue.length() - 1; index++) {
char current = masterValue.charAt(index);
if (current == '%') {
if (inVariable) {
String var = masterValue.substring(lastIndex, index + 1);
if (value.indexOf(var) == -1) {
missingVariables.add(key);
}
inVariable = false;
} else {
lastIndex = index;
inVariable = true;
}
} else if (!Character.isLetterOrDigit(current)) {
inVariable = false;
}
}
}
}
if (missingKeys.size() > 0) {
System.out.println("** Total of " + missingKeys.size() + " properties missing:\n");
for (String key : sort(missingKeys)) {
System.out.println(key + "=" + master.getProperty(key));
}
lstat.missingKeys = missingKeys.size();
System.out.println("");
} else {
System.out.println("** No properties missing.\n");
}
if (copiedFromMaster.size() > 0){
System.out.println("** Total of " + copiedFromMaster.size() + " properties copied from master properties:\n");
for (String key : sort(copiedFromMaster)) {
System.out.println(key + "=" + master.getProperty(key));
}
lstat.copiedKeys = copiedFromMaster.size();
System.out.println("");
} else {
System.out.println("** No properties copied.\n");
}
if (missingVariables.size() > 0) {
System.out.println("** Total of " + missingVariables.size() + " properties with missing variables:\n");
for (String key : sort(missingVariables)) {
System.out.println("* CORRECT: " + key + "=" + master.getProperty(key));
System.out.println("INCORRECT: " + key + "=" + properties.getProperty(key));
}
lstat.missingVariables = missingVariables.size();
System.out.println("");
} else {
System.out.println("** No properties with missing variables.\n");
}
ArrayList<String> superfluousKeys = new ArrayList<String>();
ArrayList<String> superfluousVariables = new ArrayList<String>();
for (Enumeration<Object> keys = properties.keys() ; keys.hasMoreElements() ;) {
String key = (String) keys.nextElement();
String value = master.getProperty(key, null);
if (value == null) {
superfluousKeys.add(key);
} else {
String propertiesValue = properties.getProperty(key);
int lastIndex = 0;
boolean inVariable = false;
for (int index = 0; index < propertiesValue.length() - 1; index++) {
char current = propertiesValue.charAt(index);
if (current == '%') {
if (inVariable) {
String var = propertiesValue.substring(lastIndex, index + 1);
if (value.indexOf(var) == -1) {
superfluousVariables.add(key);
}
inVariable = false;
} else {
lastIndex = index;
inVariable = true;
}
} else if (!Character.isLetterOrDigit(current)) {
inVariable = false;
}
}
}
}
if (superfluousKeys.size() > 0) {
System.out.println("** Total of " + superfluousKeys.size() + " superfluous properties:\n");
for (String key : sort(superfluousKeys)) {
System.out.println(key + "=" + properties.getProperty(key));
}
lstat.superfluousKeys = superfluousKeys.size();
System.out.println("");
} else {
System.out.println("** No superfluous properties.\n");
}
if (superfluousVariables.size() > 0) {
System.out.println("** Total of " + superfluousVariables.size() +
" properties with superfluous variables:\n");
for (String key : sort(superfluousVariables)) {
System.out.println("* CORRECT: " + key + "=" + master.getProperty(key));
System.out.println("INCORRECT: " + key + "=" + properties.getProperty(key));
}
lstat.superfluousVariables = superfluousVariables.size();
System.out.println("");
} else {
System.out.println("** No properties with superfluous variables.\n");
}
statistics.add(lstat);
}
if (printSummary){
System.out.println(stars);
System.out.println("*** Summary of translation efforts (" + master.size() + " keys in master file) ***");
System.out.println(stars);
for (LanguageStatsRecord stats : statistics){
StringBuffer output = new StringBuffer();
output.append(shortenName(stats.localFile));
output.append(": ");
output.append(prettyPrint(stats.missingKeys));
output.append(" keys missing, ");
output.append(prettyPrint(stats.missingVariables));
output.append(" vars missing, ");
output.append(prettyPrint(stats.copiedKeys));
output.append(" entries copied, ");
output.append(prettyPrint(stats.superfluousKeys));
output.append(" redundant keys, ");
output.append(prettyPrint(stats.superfluousVariables));
output.append(" redundant vars. ");
float percentageDone = (100 * (master.size() - (stats.missingKeys + stats.copiedKeys))) / (float) master.size();
percentageDone = Math.round(percentageDone*100)/100f;
output.append(percentageDone + "% finished.");
System.out.println(output.toString());
}
}
}
private static StringBuffer shortenName(String localFile) {
StringBuffer out = new StringBuffer(5);
String temp = localFile.substring(16, localFile.indexOf("."));
if (temp.length() < 5)
out.append(" ");
out.append(temp);
return out;
}
private static StringBuffer prettyPrint(int number) {
StringBuffer output = new StringBuffer(4);
if (number < 10)
output.append(" ");
if (number < 100)
output.append(" ");
if (number < 1000)
output.append(" ");
output.append(number);
return output;
}
private static TreeSet<String> sort(ArrayList<String> missingKeys) {
TreeSet<String> sorted = new TreeSet<String>();
sorted.addAll(missingKeys);
return sorted;
}
}