import java.io.*; import java.nio.file.*; import java.util.*; public class DuplicateTranslationsSearcher { public static void main(String[] args) throws Exception { Map> translatedStringsByLanguage = new TreeMap<>(); Map> untranslatedStringsByLanguage = new TreeMap<>(); File poDir = new File(args[0]); for (File textdomain : poDir.listFiles()) if (textdomain.isDirectory()) { for (File poFile : textdomain.listFiles()) if (poFile.getName().endsWith(".po")) { String langName = poFile.getName(); langName = langName.substring(0, langName.indexOf('.')); List translated = translatedStringsByLanguage.get(langName); if (translated == null) { translated = new ArrayList<>(); translatedStringsByLanguage.put(langName, translated); } List untranslated = untranslatedStringsByLanguage.get(langName); if (untranslated == null) { untranslated = new ArrayList<>(); untranslatedStringsByLanguage.put(langName, untranslated); } List lines = Files.readAllLines(poFile.toPath()); String curMsgID = null, curMsgStr = null; for (String l : lines) { if (curMsgID == null) { if (!l.startsWith("msgid")) continue; curMsgID = l.substring(l.indexOf("\"") + 1); curMsgID = curMsgID.substring(0, curMsgID.length() - 1); continue; } if (l.startsWith("\"")) { l = l.substring(0, l.length() - 1).substring(1); if (curMsgStr == null) { curMsgID += l; } else { curMsgStr += l; } continue; } if (curMsgStr == null) { if (l.startsWith("msgid_plural")) continue; if (!l.startsWith("msgstr")) throw new Exception(poFile.getPath() + ": Expected msgstr in line »" + l + "«"); curMsgStr = l.substring(l.indexOf("\"") + 1); curMsgStr = curMsgStr.substring(0, curMsgStr.length() - 1); continue; } if (curMsgStr.isEmpty()) { untranslated.add(curMsgID); } else { translated.add(curMsgID); } curMsgID = null; curMsgStr = null; } } } System.out.println("Language | Translated | Untranslated | Duplicates"); System.out.println("--- | --- | --- | ---"); for (String lang : translatedStringsByLanguage.keySet()) { int duplicates = 0; for (String s : untranslatedStringsByLanguage.get(lang)) if (translatedStringsByLanguage.get(lang).contains(s)) ++duplicates; System.out.println(lang + " | " + translatedStringsByLanguage.get(lang).size() + " | " + untranslatedStringsByLanguage.get(lang).size() + " | " + duplicates); } } }