From 5e686ff681b231d0d793a4184315a3f63e96a225 Mon Sep 17 00:00:00 2001 From: Luka Date: Thu, 13 Dec 2018 08:35:36 +0100 Subject: [PATCH] Implemented interlinguality and fixed some bugs" --- src/main/java/alg/XML_processing.java | 13 +- src/main/java/alg/ngram/Ngrams.java | 3 +- src/main/java/data/CalculateFor.java | 171 +++---- src/main/java/data/Corpus.java | 7 +- src/main/java/data/StatisticsNew.java | 86 ++-- src/main/java/data/Validation.java | 11 +- src/main/java/gui/CharacterAnalysisTab.java | 129 ++++-- src/main/java/gui/CorpusTab.java | 104 +++-- src/main/java/gui/GUIController.java | 30 +- src/main/java/gui/I18N.java | 230 ++++++++++ src/main/java/gui/Messages.java | 123 +++-- src/main/java/gui/OneWordAnalysisTab.java | 354 ++++++++++----- src/main/java/gui/StringAnalysisTabNew2.java | 420 +++++++++++++----- src/main/java/gui/WordFormationTab.java | 18 +- src/main/java/gui/WordLevelTab.java | 340 ++++++++++---- src/main/java/util/Export.java | 25 +- .../resources/gui/CharacterAnalysisTab.fxml | 31 +- src/main/resources/gui/CorpusTab.fxml | 12 +- .../resources/gui/OneWordAnalysisTab.fxml | 19 +- .../resources/gui/StringAnalysisTabNew2.fxml | 34 +- src/main/resources/gui/WordLevelTab.fxml | 193 ++++---- src/main/resources/message_en.properties | 192 ++++++++ src/main/resources/message_sl.properties | 192 ++++++++ src/main/resources/style.css | 8 + 24 files changed, 2062 insertions(+), 683 deletions(-) create mode 100644 src/main/java/gui/I18N.java create mode 100644 src/main/resources/message_en.properties create mode 100644 src/main/resources/message_sl.properties diff --git a/src/main/java/alg/XML_processing.java b/src/main/java/alg/XML_processing.java index 366aebc..6031e85 100755 --- a/src/main/java/alg/XML_processing.java +++ b/src/main/java/alg/XML_processing.java @@ -1026,7 +1026,6 @@ public class XML_processing { } //else { // System.out.println("Error"); // } - } } @@ -1068,10 +1067,22 @@ public class XML_processing { // add sentence to corpus if it passes filters if (includeFile && !ValidationUtil.isEmpty(sentence)) { +// for(Word w : sentence) { +// if (w.getW1().equals("")) { +// System.out.println("HERE!!!"); +// } +// } sentence = runFilters(sentence, stats.getFilter()); +// for(Word w : sentence) { +// if (w.getW1().equals("")) { +// System.out.println("HERE!!!"); +// } +// } corpus.add(new Sentence(sentence, currentFiletaxonomy)); } + + wordIndex = 0; diff --git a/src/main/java/alg/ngram/Ngrams.java b/src/main/java/alg/ngram/Ngrams.java index 98c069c..f8e42da 100755 --- a/src/main/java/alg/ngram/Ngrams.java +++ b/src/main/java/alg/ngram/Ngrams.java @@ -236,9 +236,10 @@ public class Ngrams { .collect(Collectors.toList())); return StringUtils.join(candidate, " "); case WORD_TYPE: + //'/' has to be a possiblility for when i.e. msd in GOS equals anon candidate.addAll(ngramCandidate .stream() - .map(w -> Character.toString(w.getMsd(wordParts).charAt(0))) + .map(w -> Character.toString(w.getMsd(wordParts).length() > 0 ? w.getMsd(wordParts).charAt(0) : '/')) .collect(Collectors.toList())); // candidate.addAll(ngramCandidate // .stream() diff --git a/src/main/java/data/CalculateFor.java b/src/main/java/data/CalculateFor.java index 17fe196..3401535 100755 --- a/src/main/java/data/CalculateFor.java +++ b/src/main/java/data/CalculateFor.java @@ -1,14 +1,34 @@ package data; +import gui.I18N; + public enum CalculateFor { - WORD("različnica"), - NORMALIZED_WORD("normalizirana različnica"), - LEMMA("lema"), - MORPHOSYNTACTIC_SPECS("oblikoskladenjska oznaka"), - MORPHOSYNTACTIC_PROPERTY("oblikoskladenjska lastnost"), - WORD_TYPE("besedna vrsta"), - DIST_WORDS("različnica"), - DIST_LEMMAS("lema"); +// calculateFor.WORD=word +// calculateFor.NORMALIZED_WORD=normalized word +// calculateFor.LEMMA=lemma +// calculateFor.MORPHOSYNTACTIC_SPECS=msd +// calculateFor.MORPHOSYNTACTIC_PROPERTY=oblikoskladenjska lastnost +// calculateFor.WORD_TYPE=besedna vrsta +// calculateFor.DIST_WORDS=različnica +// calculateFor.DIST_LEMMAS=lema + +// WORD("različnica"), +// NORMALIZED_WORD("normalizirana različnica"), +// LEMMA("lema"), +// MORPHOSYNTACTIC_SPECS("oblikoskladenjska oznaka"), +// MORPHOSYNTACTIC_PROPERTY("oblikoskladenjska lastnost"), +// WORD_TYPE("besedna vrsta"), +// DIST_WORDS("različnica"), +// DIST_LEMMAS("lema"); + + WORD("calculateFor.WORD"), + NORMALIZED_WORD("calculateFor.NORMALIZED_WORD"), + LEMMA("calculateFor.LEMMA"), + MORPHOSYNTACTIC_SPECS("calculateFor.MORPHOSYNTACTIC_SPECS"), + MORPHOSYNTACTIC_PROPERTY("calculateFor.MORPHOSYNTACTIC_PROPERTY"), + WORD_TYPE("calculateFor.WORD_TYPE"), + DIST_WORDS("calculateFor.DIST_WORDS"), + DIST_LEMMAS("calculateFor.DIST_LEMMAS"); private final String name; @@ -18,11 +38,12 @@ public enum CalculateFor { } public String toString() { - return this.name; + return I18N.get(this.name); } public static CalculateFor factory(String cf) { if (cf != null) { +// String name = I18N.findI18NString(cf, "calculateFor"); if (WORD.toString().equals(cf)) { return WORD; } @@ -49,42 +70,42 @@ public enum CalculateFor { if (ngram == 0) { switch (this) { case WORD: - return "Skupna vsota vseh črkovnih nizov različnic:"; + return I18N.get("exportTable.part.totalSumLetters") + " " + I18N.get("exportTable.part.word"); case NORMALIZED_WORD: - return "Skupna vsota vseh črkovnih nizov normaliziranih različnic:"; + return I18N.get("exportTable.part.totalSumLetters") + " " + I18N.get("exportTable.part.normalizedWord"); case LEMMA: - return "Skupna vsota vseh črkovnih nizov lem:"; + return I18N.get("exportTable.part.totalSumLetters") + " " + I18N.get("exportTable.part.lemma"); case MORPHOSYNTACTIC_SPECS: - return "Skupna vsota vseh črkovnih nizov oblikoskladenjskih oznak:"; + return I18N.get("exportTable.part.totalSumLetters") + " " + I18N.get("exportTable.part.msd"); case MORPHOSYNTACTIC_PROPERTY: - return "Skupna vsota vseh črkovnih nizov oblikoskladenjskih lastnosti:"; + return I18N.get("exportTable.part.totalSumLetters") + " " + I18N.get("exportTable.part.msdProperty"); case WORD_TYPE: - return "Skupna vsota vseh črkovnih nizov besednih vrst:"; + return I18N.get("exportTable.part.totalSumLetters") + " " + I18N.get("exportTable.part.wordType"); case DIST_WORDS: - return "Skupna vsota vseh črkovnih nizov različnic:"; + return I18N.get("exportTable.part.totalSumLetters") + " " + I18N.get("exportTable.part.word"); case DIST_LEMMAS: - return "Skupna vsota vseh črkovnih nizov lem:"; + return I18N.get("exportTable.part.totalSumLetters") + " " + I18N.get("exportTable.part.lemma"); default: return null; } } else if (ngram >= 1) { switch (this) { case WORD: - return "Skupna vsota vseh različnic:"; + return I18N.get("exportTable.part.totalSumString") + " " + I18N.get("exportTable.part.word"); case NORMALIZED_WORD: - return "Skupna vsota vseh normaliziranih različnic:"; + return I18N.get("exportTable.part.totalSumString") + " " + I18N.get("exportTable.part.normalizedWord"); case LEMMA: - return "Skupna vsota vseh lem:"; + return I18N.get("exportTable.part.totalSumString") + " " + I18N.get("exportTable.part.lemma"); case MORPHOSYNTACTIC_SPECS: - return "Skupna vsota vseh oblikoskladenjskih oznak:"; + return I18N.get("exportTable.part.totalSumString") + " " + I18N.get("exportTable.part.msd"); case MORPHOSYNTACTIC_PROPERTY: - return "Skupna vsota vseh oblikoskladenjskih lastnosti:"; + return I18N.get("exportTable.part.totalSumString") + " " + I18N.get("exportTable.part.msdProperty"); case WORD_TYPE: - return "Skupna vsota vseh besednih vrst:"; + return I18N.get("exportTable.part.totalSumString") + " " + I18N.get("exportTable.part.wordType"); case DIST_WORDS: - return "Skupna vsota vseh različnic:"; + return I18N.get("exportTable.part.totalSumString") + " " + I18N.get("exportTable.part.word"); case DIST_LEMMAS: - return "Skupna vsota vseh lem:"; + return I18N.get("exportTable.part.totalSumString") + " " + I18N.get("exportTable.part.lemma"); default: return null; } @@ -96,42 +117,42 @@ public enum CalculateFor { if (ngram == 0) { switch (this) { case WORD: - return "Skupna vsota vseh najdenih črkovnih nizov različnic:"; + return I18N.get("exportTable.part.totalFoundLetters") + " " + I18N.get("exportTable.part.word"); case NORMALIZED_WORD: - return "Skupna vsota vseh najdenih črkovnih nizov normaliziranih različnic:"; + return I18N.get("exportTable.part.totalFoundLetters") + " " + I18N.get("exportTable.part.normalizedWord"); case LEMMA: - return "Skupna vsota vseh najdenih črkovnih nizov lem:"; + return I18N.get("exportTable.part.totalFoundLetters") + " " + I18N.get("exportTable.part.lemma"); case MORPHOSYNTACTIC_SPECS: - return "Skupna vsota vseh najdenih črkovnih nizov oblikoskladenjskih oznak:"; + return I18N.get("exportTable.part.totalFoundLetters") + " " + I18N.get("exportTable.part.msd"); case MORPHOSYNTACTIC_PROPERTY: - return "Skupna vsota vseh najdenih črkovnih nizov oblikoskladenjskih lastnosti:"; + return I18N.get("exportTable.part.totalFoundLetters") + " " + I18N.get("exportTable.part.msdProperty"); case WORD_TYPE: - return "Skupna vsota vseh najdenih črkovnih nizov besednih vrst:"; + return I18N.get("exportTable.part.totalFoundLetters") + " " + I18N.get("exportTable.part.wordType"); case DIST_WORDS: - return "Skupna vsota vseh najdenih črkovnih nizov različnic:"; + return I18N.get("exportTable.part.totalFoundLetters") + " " + I18N.get("exportTable.part.word"); case DIST_LEMMAS: - return "Skupna vsota vseh najdenih črkovnih nizov lem:"; + return I18N.get("exportTable.part.totalFoundLetters") + " " + I18N.get("exportTable.part.lemma"); default: return null; } } else if (ngram >= 1) { switch (this) { case WORD: - return "Skupna vsota vseh najdenih različnic:"; + return I18N.get("exportTable.part.totalFound") + " " + I18N.get("exportTable.part.word"); case NORMALIZED_WORD: - return "Skupna vsota vseh najdenih normaliziranih različnic:"; + return I18N.get("exportTable.part.totalFound") + " " + I18N.get("exportTable.part.normalizedWord"); case LEMMA: - return "Skupna vsota vseh najdenih lem:"; + return I18N.get("exportTable.part.totalFound") + " " + I18N.get("exportTable.part.lemma"); case MORPHOSYNTACTIC_SPECS: - return "Skupna vsota vseh najdenih oblikoskladenjskih oznak:"; + return I18N.get("exportTable.part.totalFound") + " " + I18N.get("exportTable.part.msd"); case MORPHOSYNTACTIC_PROPERTY: - return "Skupna vsota vseh najdenih oblikoskladenjskih lastnosti:"; + return I18N.get("exportTable.part.totalFound") + " " + I18N.get("exportTable.part.msdProperty"); case WORD_TYPE: - return "Skupna vsota vseh najdenih besednih vrst:"; + return I18N.get("exportTable.part.totalFound") + " " + I18N.get("exportTable.part.wordType"); case DIST_WORDS: - return "Skupna vsota vseh najdenih različnic:"; + return I18N.get("exportTable.part.totalFound") + " " + I18N.get("exportTable.part.word"); case DIST_LEMMAS: - return "Skupna vsota vseh najdenih lem:"; + return I18N.get("exportTable.part.totalFound") + " " + I18N.get("exportTable.part.lemma"); default: return null; } @@ -142,25 +163,25 @@ public enum CalculateFor { public String totalAbsoluteFrequencyString(int ngram) { if (ngram == 0) { - return "Skupna absolutna pogostost črkovnega niza"; + return I18N.get("exportTable.part.absoluteFrequency") + " " + I18N.get("exportTable.part.letterSet"); } switch(this){ case WORD: - return "Skupna absolutna pogostost različnice"; + return I18N.get("exportTable.part.absoluteFrequency") + " " + I18N.get("exportTable.part.word2"); case NORMALIZED_WORD: - return "Skupna absolutna pogostost normalizirane različnice"; + return I18N.get("exportTable.part.absoluteFrequency") + " " + I18N.get("exportTable.part.normalizedWord2"); case LEMMA: - return "Skupna absolutna pogostost leme"; + return I18N.get("exportTable.part.absoluteFrequency") + " " + I18N.get("exportTable.part.lemma2"); case MORPHOSYNTACTIC_SPECS: - return "Skupna absolutna pogostost oblikoskladenjske oznake"; + return I18N.get("exportTable.part.absoluteFrequency") + " " + I18N.get("exportTable.part.msd2"); case MORPHOSYNTACTIC_PROPERTY: - return "Skupna absolutna pogostost oblikoskladenjske lastnosti"; + return I18N.get("exportTable.part.absoluteFrequency") + " " + I18N.get("exportTable.part.msdProperty2"); case WORD_TYPE: - return "Skupna absolutna pogostost besedne vrste"; + return I18N.get("exportTable.part.absoluteFrequency") + " " + I18N.get("exportTable.part.wordType2"); case DIST_WORDS: - return "Skupna absolutna pogostost različnice"; + return I18N.get("exportTable.part.absoluteFrequency") + " " + I18N.get("exportTable.part.word2"); case DIST_LEMMAS: - return "Skupna absolutna pogostost leme"; + return I18N.get("exportTable.part.absoluteFrequency") + " " + I18N.get("exportTable.part.lemma2"); default: return null; } @@ -168,25 +189,25 @@ public enum CalculateFor { public String shareOfTotalString(int ngram) { if (ngram == 0) { - return "Delež glede na skupno vsoto vseh najdenih črkovnih nizov"; + return I18N.get("exportTable.part.letterSet2"); } switch(this){ case WORD: - return "Delež glede na vse najdene različnice"; + return I18N.get("exportTable.part.share") + " " + I18N.get("exportTable.part.word2"); case NORMALIZED_WORD: - return "Delež glede na vse najdene normalizirane različnice"; + return I18N.get("exportTable.part.share") + " " + I18N.get("exportTable.part.normalizedWord2"); case LEMMA: - return "Delež glede na vse najdene leme"; + return I18N.get("exportTable.part.share") + " " + I18N.get("exportTable.part.lemma2"); case MORPHOSYNTACTIC_SPECS: - return "Delež glede na vse najdene oblikoskladenjske oznake"; + return I18N.get("exportTable.part.share") + " " + I18N.get("exportTable.part.msd2"); case MORPHOSYNTACTIC_PROPERTY: - return "Delež glede na vse najdene oblikoskladenjske lastnosti"; + return I18N.get("exportTable.part.share") + " " + I18N.get("exportTable.part.msdProperty2"); case WORD_TYPE: - return "Delež glede na vse najdene besedne vrste"; + return I18N.get("exportTable.part.share") + " " + I18N.get("exportTable.part.wordType2"); case DIST_WORDS: - return "Delež glede na vse najdene različnice"; + return I18N.get("exportTable.part.share") + " " + I18N.get("exportTable.part.word2"); case DIST_LEMMAS: - return "Delež glede na vse najdene leme"; + return I18N.get("exportTable.part.share") + " " + I18N.get("exportTable.part.lemma2"); default: return null; } @@ -194,25 +215,23 @@ public enum CalculateFor { public String toHeaderString(int ngram) { if (ngram == 0) { - return "Črkovni niz"; + return I18N.get("exportTable.part.letterSet3"); } else if (ngram == 1) { switch (this) { case WORD: - return "Različnica"; + case DIST_WORDS: + return I18N.get("exportTable.part.word3"); case NORMALIZED_WORD: - return "Normalizirana različnica"; + return I18N.get("exportTable.part.normalizedWord3"); case LEMMA: - return "Lema"; + case DIST_LEMMAS: + return I18N.get("exportTable.part.lemma3"); case MORPHOSYNTACTIC_SPECS: - return "Oblikoskladenjska oznaka"; + return I18N.get("exportTable.part.msd3"); case MORPHOSYNTACTIC_PROPERTY: - return "Oblikoskladenjska lastnost"; + return I18N.get("exportTable.part.msdProperty3"); case WORD_TYPE: - return "Besedna vrsta"; - case DIST_WORDS: - return "Različnica"; - case DIST_LEMMAS: - return "Lema"; + return I18N.get("exportTable.part.wordType3"); default: return null; } @@ -220,18 +239,18 @@ public enum CalculateFor { switch (this) { case WORD: case DIST_WORDS: - return "Različnica niza"; + return I18N.get("exportTable.part.word3") + " " + I18N.get("exportTable.part.set"); case NORMALIZED_WORD: - return "Normalizirana različnica niza"; + return I18N.get("exportTable.part.normalizedWord3") + " " + I18N.get("exportTable.part.set"); case LEMMA: case DIST_LEMMAS: - return "Lema niza"; + return I18N.get("exportTable.part.lemma3") + " " + I18N.get("exportTable.part.set"); case MORPHOSYNTACTIC_SPECS: - return "Oblikoskladenjska oznaka niza"; + return I18N.get("exportTable.part.msd3") + " " + I18N.get("exportTable.part.set"); case MORPHOSYNTACTIC_PROPERTY: - return "Oblikoskladenjska lastnost niza"; + return I18N.get("exportTable.part.msdProperty3") + " " + I18N.get("exportTable.part.set"); case WORD_TYPE: - return "Besedna vrsta niza"; + return I18N.get("exportTable.part.wordType3") + " " + I18N.get("exportTable.part.set"); default: return null; } diff --git a/src/main/java/data/Corpus.java b/src/main/java/data/Corpus.java index 017ecb5..dfbd710 100755 --- a/src/main/java/data/Corpus.java +++ b/src/main/java/data/Corpus.java @@ -8,6 +8,7 @@ import java.util.Collection; import java.util.HashMap; import java.util.HashSet; +import gui.I18N; import javafx.collections.FXCollections; import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.LogManager; @@ -136,15 +137,15 @@ public class Corpus { public boolean validate() { if (corpusType == null) { - validationErrors.add(LABEL_RESULTS_CORPUS_TYPE_NOT_SET); + validationErrors.add(I18N.get("message.LABEL_RESULTS_CORPUS_TYPE_NOT_SET")); } if (chosenCorpusLocation == null) { - validationErrors.add(LABEL_CORPUS_LOCATION_NOT_SET); + validationErrors.add(I18N.get("message.LABEL_CORPUS_LOCATION_NOT_SET")); } if (chosenResultsLocation == null) { - validationErrors.add(LABEL_RESULTS_LOCATION_NOT_SET); + validationErrors.add(I18N.get("message.LABEL_RESULTS_LOCATION_NOT_SET")); } if (!headerRead && corpusType != null) { diff --git a/src/main/java/data/StatisticsNew.java b/src/main/java/data/StatisticsNew.java index fec58a7..cc29469 100755 --- a/src/main/java/data/StatisticsNew.java +++ b/src/main/java/data/StatisticsNew.java @@ -12,6 +12,7 @@ import java.util.concurrent.atomic.AtomicLong; import java.util.regex.Pattern; import java.util.stream.Collectors; +import gui.I18N; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; @@ -112,7 +113,7 @@ public class StatisticsNew { if(ngramLevel == 0) { sb.append(corpus.getCorpusType().toString()) .append(separator) - .append("crke") + .append(I18N.get("exportFileName.letters")) .append(separator) .append(filter.getCalculateFor()) .append(separator); @@ -120,30 +121,30 @@ public class StatisticsNew { if (filter.getSuffixLength() != null && filter.getSuffixList() != null && filter.getPrefixLength() != null && filter.getPrefixList() != null) { sb.append(corpus.getCorpusType().toString()) .append(separator) - .append("besedni-deli") + .append(I18N.get("exportFileName.wordParts")) .append(separator) .append(filter.getCalculateFor()) .append(separator); } else { sb.append(corpus.getCorpusType().toString()) .append(separator) - .append("besede") + .append(I18N.get("exportFileName.words")) .append(separator) .append(filter.getCalculateFor()) .append(separator); } } else { - sb.append(filter.getAl().toString()) + sb.append(corpus.getCorpusType().toString()) .append(separator) - .append(corpus.getCorpusType().toString()) + .append(I18N.get("exportFileName.wordSets")) .append(separator); sb.append(filter.getCalculateFor().toString()) .append(separator); // ngram value - sb.append(filter.getNgramValue()).append("-gram") + sb.append(filter.getNgramValue()).append(I18N.get("exportFileName.gram")) .append(separator); - sb.append(filter.getSkipValue()).append("-preskok") + sb.append(filter.getSkipValue()).append(I18N.get("exportFileName.skip")) .append(separator); } // TODO: assure skip is not null but zero @@ -229,6 +230,9 @@ public class StatisticsNew { db.delete(); } + removeMinimalOccurrences(filter.getMinimalOccurrences()); + removeMinimalTaxonomy(taxonomyResult, filter.getMinimalTaxonomy()); + // if no results and nothing to save, return false if (!(taxonomyResult.get(Taxonomy.TOTAL).size() > 0)) { analysisProducedResults = false; @@ -237,8 +241,6 @@ public class StatisticsNew { analysisProducedResults = true; } - removeMinimalOccurrences(filter.getMinimalOccurrences()); - removeMinimalTaxonomy(taxonomyResult, filter.getMinimalTaxonomy()); stats.add(ImmutablePair.of(resultTitle, getSortedResult(taxonomyResult.get(Taxonomy.TOTAL), Util.getValidInt(limit)))); Export.SetToCSV(stats, corpus.getChosenResultsLocation(), headerInfoBlock(), this, filter); return true; @@ -465,40 +467,40 @@ public class StatisticsNew { private LinkedHashMap headerInfoBlock() { LinkedHashMap info = new LinkedHashMap<>(); - info.put("Korpus:", corpus.getCorpusType().toString()); + info.put(I18N.get("exportHeader.corpus"), corpus.getCorpusType().toString()); setTimeEnding(); - info.put("Datum:", timeEnding.format(DateTimeFormatter.ofPattern("dd.MM.yyyy hh:mm"))); + info.put(I18N.get("exportHeader.date"), timeEnding.format(DateTimeFormatter.ofPattern("dd.MM.yyyy hh:mm"))); // time elapsed long seconds = ChronoUnit.MILLIS.between(timeBeginning, timeEnding) / 1000; - info.put("Čas izvajanja:", String.valueOf(seconds) + " s"); + info.put(I18N.get("exportHeader.executionTime"), String.valueOf(seconds) + " s"); if (filter.getAl() == AnalysisLevel.STRING_LEVEL) { Integer ngramLevel = filter.getNgramValue(); if (ngramLevel == 0) - info.put("Analiza:", "črke"); + info.put(I18N.get("exportHeader.analysis"), I18N.get("exportHeader.analysis.letters")); else if (ngramLevel == 1) { // if suffixes or prefixes are not null print word parts if (filter.getSuffixLength() != null || filter.getSuffixList() != null || filter.getPrefixLength() != null || filter.getPrefixList() != null) { - info.put("Analiza:", "besedni deli"); + info.put(I18N.get("exportHeader.analysis"), I18N.get("exportHeader.analysis.wordParts")); } else { - info.put("Analiza:", "besede"); + info.put(I18N.get("exportHeader.analysis"), I18N.get("exportHeader.analysis.words")); } } else - info.put("Analiza:", filter.getAl().toString()); + info.put(I18N.get("exportHeader.analysis"), I18N.get("exportHeader.analysis.wordSets")); } else { - info.put("Analiza:", filter.getAl().toString()); + info.put(I18N.get("exportHeader.analysis"), filter.getAl().toString()); } // if (filter.getAl() == AnalysisLevel.STRING_LEVEL) { Integer ngramLevel = filter.getNgramValue(); if (ngramLevel == 0){ - info.put("Število črk:", filter.getStringLength().toString()); + info.put(I18N.get("exportHeader.numberLetters"), filter.getStringLength().toString()); } // calculate for - info.put("Izračunaj za:", filter.getCalculateFor().toString()); + info.put(I18N.get("exportHeader.calculateFor"), filter.getCalculateFor().toString()); // also write if (ngramLevel > 0) { @@ -508,34 +510,34 @@ public class StatisticsNew { for (CalculateFor s : filter.getMultipleKeys()) { mk.append(s.toString()).append("; "); } - info.put("Upoštevaj tudi: ", String.join("; ", mk.substring(0, mk.length() - 2))); + info.put(I18N.get("exportHeader.alsoFilter"), String.join("; ", mk.substring(0, mk.length() - 2))); } else { - info.put("Upoštevaj tudi: ", ""); + info.put(I18N.get("exportHeader.alsoFilter"), ""); } } // data limitations if (filter.getDisplayTaxonomy()){ - info.put("Izpiši taksonomije: ", "da"); + info.put(I18N.get("exportHeader.displayTaxonomies"), I18N.get("exportHeader.yes")); } else { - info.put("Izpiši taksonomije: ", "ne"); + info.put(I18N.get("exportHeader.displayTaxonomies"), I18N.get("exportHeader.no")); } // n.gram nivo if (ngramLevel > 1) { - info.put("N-gram nivo:", String.valueOf(ngramLevel)); + info.put(I18N.get("exportHeader.ngramLevel"), String.valueOf(ngramLevel)); } // skip if (ngramLevel > 1) - info.put("Preskok besed:", isNotEmpty(filter.getSkipValue()) ? filter.getSkipValue().toString() : "0"); + info.put(I18N.get("exportHeader.skipValue"), isNotEmpty(filter.getSkipValue()) ? filter.getSkipValue().toString() : "0"); // note punctuations - ngram > 1 if(ngramLevel > 1) { if (filter.getNotePunctuations()) { - info.put("Upoštevaj ločila: ", "da"); + info.put(I18N.get("exportHeader.notePunctuations"), I18N.get("exportHeader.yes")); } else { - info.put("Upoštevaj ločila: ", "ne"); + info.put(I18N.get("exportHeader.notePunctuations"), I18N.get("exportHeader.no")); } } @@ -546,28 +548,28 @@ public class StatisticsNew { for (Collocability s : filter.getCollocability()) { mk.append(s.toString()).append("; "); } - info.put("Kolokabilnost: ", String.join("; ", mk.substring(0, mk.length() - 2))); + info.put(I18N.get("exportHeader.collocability"), String.join("; ", mk.substring(0, mk.length() - 2))); } else { - info.put("Kolokabilnost: ", ""); + info.put(I18N.get("exportHeader.collocability"), ""); } } // fragmented MSD - n-gram = 1 - if (info.get("Analiza:").equals("besede")){ + if (info.get(I18N.get("exportHeader.analysis")).equals(I18N.get("exportHeader.analysis.words"))){ if (filter.getWriteMsdAtTheEnd()){ - info.put("Izpiši razbit MSD: ", "da"); + info.put(I18N.get("exportHeader.writeMSDAtTheEnd"), I18N.get("exportHeader.yes")); } else { - info.put("Izpiši razbit MSD: ", "ne"); + info.put(I18N.get("exportHeader.writeMSDAtTheEnd"), I18N.get("exportHeader.no")); } } if (filter.getSuffixLength() != null || filter.getSuffixList() != null || filter.getPrefixLength() != null || filter.getPrefixList() != null) { if (filter.getPrefixLength() > 0 || filter.getSuffixLength() > 0) { - info.put("Dolžina predpone: ", String.valueOf(filter.getPrefixLength())); - info.put("Dolžina pripone: ", String.valueOf(filter.getSuffixLength())); + info.put(I18N.get("exportHeader.prefixLength"), String.valueOf(filter.getPrefixLength())); + info.put(I18N.get("exportHeader.suffixLength"), String.valueOf(filter.getSuffixLength())); } else { - info.put("Seznam predpon: ", String.join("; ", filter.getPrefixList())); - info.put("Seznam pripon: ", String.join("; ", filter.getSuffixList())); + info.put(I18N.get("exportHeader.prefixList"), String.join("; ", filter.getPrefixList())); + info.put(I18N.get("exportHeader.suffixList"), String.join("; ", filter.getSuffixList())); } } @@ -578,15 +580,15 @@ public class StatisticsNew { msdPattern.append(pattern.toString()).append(" "); } - info.put("Oznaka MSD:", msdPattern.toString()); + info.put(I18N.get("exportHeader.msd"), msdPattern.toString()); } else { - info.put("Oznaka MSD:", ""); + info.put(I18N.get("exportHeader.msd"), ""); } // } - info.put("Taksonomija: ", ""); + info.put(I18N.get("exportHeader.taxonomy"), ""); if (isNotEmpty(filter.getTaxonomy()) && Tax.getCorpusTypesWithTaxonomy().contains(corpus.getCorpusType()) || filter.getDisplayTaxonomy()) { ArrayList tax = Tax.getTaxonomyForInfo(corpus.getCorpusType(), filter.getTaxonomy()); @@ -631,14 +633,14 @@ public class StatisticsNew { } - info.put("Min. št. pojavitev: ", String.valueOf(filter.getMinimalOccurrences())); - info.put("Min. št. taksonomij: ", String.valueOf(filter.getMinimalTaxonomy())); + info.put(I18N.get("exportHeader.minOccurrences"), String.valueOf(filter.getMinimalOccurrences())); + info.put(I18N.get("exportHeader.minTaxonomies"), String.valueOf(filter.getMinimalTaxonomy())); if (corpus.getCorpusType() == CorpusType.SOLAR) { HashMap> filters = corpus.getSolarFilters(); if (!isEmpty(filters)) { - info.put("Dodatni filtri: ", ""); + info.put(I18N.get("exportHeader.additionalFilters"), ""); for (Map.Entry> f : filters.entrySet()) { info.put(f.getKey(), StringUtils.join(f.getValue(), ", ")); diff --git a/src/main/java/data/Validation.java b/src/main/java/data/Validation.java index 44b809e..e7e3cd7 100755 --- a/src/main/java/data/Validation.java +++ b/src/main/java/data/Validation.java @@ -5,6 +5,7 @@ import static gui.ValidationUtil.*; import java.util.ArrayList; import java.util.regex.Pattern; +import gui.I18N; import org.apache.commons.lang3.StringUtils; import gui.Messages; @@ -17,12 +18,12 @@ public class Validation { // should not be null, error if null, because init failed if (filter.getNgramValue() == null) { - errors.add(Messages.MISSING_NGRAM_LEVEL); + errors.add(I18N.get("message.MISSING_NGRAM_LEVEL")); } // should not be null, error if null, because init failed if (filter.getCalculateFor() == null) { - errors.add(Messages.MISSING_CALCULATE_FOR); + errors.add(I18N.get("message.MISSING_CALCULATE_FOR")); } if (filter.getSkipValue() == null) { @@ -32,20 +33,20 @@ public class Validation { if (filter.getNgramValue() != null && ValidationUtil.isEmpty(filter.getMsd()) && (filter.getMsd().size() != filter.getNgramValue())) { if (!(filter.getMsd().size() == 1 && filter.getNgramValue() == 0) && !ValidationUtil.isEmpty(filter.getMsd())) - errors.add(Messages.WARNING_MISMATCHED_NGRAM_AND_TOKENS_VALUES); + errors.add(I18N.get("message.WARNING_MISMATCHED_NGRAM_AND_TOKENS_VALUES")); } Integer ngramValue = filter.getNgramValue(); ArrayList msd = filter.getMsd(); if (ngramValue > 0 && !ValidationUtil.isEmpty(msd) && ngramValue != msd.size()) { - errors.add(String.format(Messages.WARNING_MISMATCHED_NGRAM_AND_TOKENS_VALUES, ngramValue, msd.size())); + errors.add(String.format(I18N.get("message.WARNING_MISMATCHED_NGRAM_AND_TOKENS_VALUES"), ngramValue, msd.size())); } if (filter.getNgramValue() != null && filter.getNgramValue() == 0 && isEmpty(filter.getStringLength())) { // if count letters, make sure that the length is given // TODO: check that words we're adding in xml reader are longer than this value - errors.add(Messages.MISSING_STRING_LENGTH); + errors.add(I18N.get("message.MISSING_STRING_LENGTH")); } return isEmpty(errors) ? null : StringUtils.join(errors, ", \n"); diff --git a/src/main/java/gui/CharacterAnalysisTab.java b/src/main/java/gui/CharacterAnalysisTab.java index 60a52e2..77cf86c 100755 --- a/src/main/java/gui/CharacterAnalysisTab.java +++ b/src/main/java/gui/CharacterAnalysisTab.java @@ -2,6 +2,7 @@ package gui; import data.*; import javafx.application.HostServices; +import javafx.beans.binding.Bindings; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.collections.FXCollections; @@ -35,6 +36,31 @@ public class CharacterAnalysisTab { @FXML public Label selectedFiltersLabel; + + @FXML + public Label stringLengthL; + + @FXML + public Label calculateForL; + + @FXML + public Label displayTaxonomyL; + + @FXML + public Label dataLimitL; + + @FXML + public Label msdL; + + @FXML + public Label taxonomyL; + + @FXML + public Label minimalOccurrencesL; + + @FXML + public Label minimalTaxonomyL; + @FXML public Label solarFilters; @@ -90,6 +116,9 @@ public class CharacterAnalysisTab { @FXML private Button cancel; + @FXML + private Button changeLanguageB; + @FXML public ProgressBar ngramProgressBar; @FXML @@ -109,8 +138,12 @@ public class CharacterAnalysisTab { private Filter filter; private boolean useDb; private HostServices hostService; + private ListChangeListener taxonomyListener; + + private static final String [] N_GRAM_COMPUTE_FOR_LETTERS_ARRAY = {"calculateFor.WORD", "calculateFor.LEMMA"}; + private static final ArrayList N_GRAM_COMPUTE_FOR_LETTERS = new ArrayList<>(Arrays.asList(N_GRAM_COMPUTE_FOR_LETTERS_ARRAY)); - private static final ObservableList N_GRAM_COMPUTE_FOR_LETTERS = FXCollections.observableArrayList("različnica", "lema"); +// private static final ObservableList N_GRAM_COMPUTE_FOR_LETTERS = FXCollections.observableArrayList("različnica", "lema"); private static final ObservableList N_GRAM_COMPUTE_FOR_WORDS_ORTH = FXCollections.observableArrayList("različnica"); @@ -123,6 +156,8 @@ public class CharacterAnalysisTab { characterAnalysisTab.getStylesheets().add("style.css"); characterAnalysisTab.getStyleClass().add("root"); + manageTranslations(); + currentMode = MODE.LETTER; toggleMode(currentMode); @@ -138,8 +173,13 @@ public class CharacterAnalysisTab { // }); calculateForCB.valueProperty().addListener((observable, oldValue, newValue) -> { + if(newValue == null){ + newValue = I18N.getTranslatedValue(oldValue, N_GRAM_COMPUTE_FOR_LETTERS); + calculateForCB.getSelectionModel().select(newValue); + } +// System.out.println(oldValue); +// System.out.println(newValue); calculateFor = CalculateFor.factory(newValue); - logger.info("calculateForCB:", calculateFor.toString()); }); @@ -157,7 +197,7 @@ public class CharacterAnalysisTab { int nOfRequiredMsdTokens = 1; if (msdTmp.size() != nOfRequiredMsdTokens) { - String msg = String.format(Messages.WARNING_MISMATCHED_NGRAM_AND_TOKENS_VALUES, nOfRequiredMsdTokens, msdTmp.size()); + String msg = String.format(I18N.get("message.WARNING_MISMATCHED_NGRAM_AND_TOKENS_VALUES"), nOfRequiredMsdTokens, msdTmp.size()); logAlert(msg); showAlert(Alert.AlertType.ERROR, msg); } @@ -181,10 +221,11 @@ public class CharacterAnalysisTab { // taxonomy if (Tax.getCorpusTypesWithTaxonomy().contains(corpus.getCorpusType())) { - taxonomyCCB.setDisable(false); - taxonomyCCB.getItems().removeAll(); - taxonomyCCB.getItems().setAll(corpus.getTaxonomy()); - taxonomyCCB.getCheckModel().getCheckedItems().addListener(new ListChangeListener() { + if (taxonomyListener != null){ + taxonomyCCB.getCheckModel().getCheckedItems().removeListener(taxonomyListener); + } + + taxonomyListener = new ListChangeListener() { boolean changing = true; @Override @@ -211,8 +252,13 @@ public class CharacterAnalysisTab { logger.info(String.format("Selected taxonomy: %s", StringUtils.join(checkedItems, ","))); } } - }); + }; taxonomyCCB.getCheckModel().clearChecks(); + taxonomyCCB.setDisable(false); + taxonomyCCB.getItems().removeAll(); + taxonomyCCB.getItems().setAll(corpus.getTaxonomy()); + + taxonomyCCB.getCheckModel().getCheckedItems().addListener(taxonomyListener); } else { taxonomyCCB.setDisable(true); } @@ -235,7 +281,7 @@ public class CharacterAnalysisTab { logger.info("display taxonomy: ", displayTaxonomy); }); - displayTaxonomyChB.setTooltip(new Tooltip(TOOLTIP_readDisplayTaxonomyChB)); + displayTaxonomyChB.setTooltip(new Tooltip(I18N.get("message.TOOLTIP_readDisplayTaxonomyChB"))); } else { displayTaxonomyChB.setDisable(true); } @@ -254,14 +300,14 @@ public class CharacterAnalysisTab { String value = stringLengthTF.getText(); if (!ValidationUtil.isEmpty(value)) { if (!ValidationUtil.isNumber(value)) { - logAlert("stringlengthTf: " + WARNING_ONLY_NUMBERS_ALLOWED); - GUIController.showAlert(Alert.AlertType.ERROR, WARNING_ONLY_NUMBERS_ALLOWED); + logAlert("stringlengthTf: " + I18N.get("message.WARNING_ONLY_NUMBERS_ALLOWED")); + GUIController.showAlert(Alert.AlertType.ERROR, I18N.get("message.WARNING_ONLY_NUMBERS_ALLOWED")); } stringLength = Integer.parseInt(value); } else { - GUIController.showAlert(Alert.AlertType.ERROR, WARNING_MISSING_STRING_LENGTH); + GUIController.showAlert(Alert.AlertType.ERROR, I18N.get("message.WARNING_MISSING_STRING_LENGTH")); stringLengthTF.setText("1"); - logAlert(WARNING_MISSING_STRING_LENGTH); + logAlert(I18N.get("message.WARNING_MISSING_STRING_LENGTH")); } } }); @@ -281,8 +327,8 @@ public class CharacterAnalysisTab { String value = minimalOccurrencesTF.getText(); if (!ValidationUtil.isEmpty(value)) { if (!ValidationUtil.isNumber(value)) { - logAlert("minimalOccurrencesTF: " + WARNING_ONLY_NUMBERS_ALLOWED); - GUIController.showAlert(Alert.AlertType.ERROR, WARNING_ONLY_NUMBERS_ALLOWED); + logAlert("minimalOccurrencesTF: " + I18N.get("message.WARNING_ONLY_NUMBERS_ALLOWED")); + GUIController.showAlert(Alert.AlertType.ERROR, I18N.get("message.WARNING_ONLY_NUMBERS_ALLOWED")); } else { minimalOccurrences = Integer.parseInt(value); } @@ -299,8 +345,8 @@ public class CharacterAnalysisTab { String value = minimalTaxonomyTF.getText(); if (!ValidationUtil.isEmpty(value)) { if (!ValidationUtil.isNumber(value)) { - logAlert("minimalTaxonomyTF: " + WARNING_ONLY_NUMBERS_ALLOWED); - GUIController.showAlert(Alert.AlertType.ERROR, WARNING_ONLY_NUMBERS_ALLOWED); + logAlert("minimalTaxonomyTF: " + I18N.get("message.WARNING_ONLY_NUMBERS_ALLOWED")); + GUIController.showAlert(Alert.AlertType.ERROR, I18N.get("message.WARNING_ONLY_NUMBERS_ALLOWED")); } else { minimalTaxonomy = Integer.parseInt(value); } @@ -316,7 +362,19 @@ public class CharacterAnalysisTab { logger.info("compute button"); }); - helpH.setOnAction(e -> openHelpWebsite()); + changeLanguageB.setOnAction(e -> { + if (I18N.getLocale() == new Locale.Builder().setLanguage("sl").setRegion("SI").build()){ + I18N.setLocale(Locale.ENGLISH); + } else { + I18N.setLocale(new Locale.Builder().setLanguage("sl").setRegion("SI").build()); + } + Messages.reload(); + Messages.updateChooseCorpusL(); + logger.info("change language"); + }); + + + helpH.setOnAction(e -> openHelpWebsite()); cancel.setVisible(false); } @@ -412,6 +470,27 @@ public class CharacterAnalysisTab { // // } + private void manageTranslations(){ + helpH.textProperty().bind(I18N.createStringBinding("hyperlink.help")); + changeLanguageB.textProperty().bind(I18N.createStringBinding("button.language")); + computeNgramsB.textProperty().bind(I18N.createStringBinding("button.computeNgrams")); + cancel.textProperty().bind(I18N.createStringBinding("button.cancel")); + + stringLengthL.textProperty().bind(I18N.createStringBinding("label.stringLength")); + calculateForL.textProperty().bind(I18N.createStringBinding("label.calculateFor")); + displayTaxonomyL.textProperty().bind(I18N.createStringBinding("label.displayTaxonomy")); + dataLimitL.textProperty().bind(I18N.createStringBinding("label.dataLimit")); + msdL.textProperty().bind(I18N.createStringBinding("label.msd")); + taxonomyL.textProperty().bind(I18N.createStringBinding("label.taxonomy")); + minimalOccurrencesL.textProperty().bind(I18N.createStringBinding("label.minimalOccurrences")); + minimalTaxonomyL.textProperty().bind(I18N.createStringBinding("label.minimalTaxonomy")); + solarFilters.textProperty().bind(I18N.createStringBinding("label.solarFilters")); + + + calculateForCB.itemsProperty().bind(I18N.createObjectBinding(N_GRAM_COMPUTE_FOR_LETTERS)); + + } + /** * Toggles visibility for panes which hold fields for skipgram value (not applicable when calculating for letters) etc., * sets combobox values to what is applicable ... @@ -533,11 +612,11 @@ public class CharacterAnalysisTab { readXML(f.toString(), statistic); i++; if (isCancelled()) { - updateMessage(CANCELING_NOTIFICATION); + updateMessage(I18N.get("message.CANCELING_NOTIFICATION")); break; } this.updateProgress(i, corpusFiles.size()); - this.updateMessage(String.format(ONGOING_NOTIFICATION_ANALYZING_FILE_X_OF_Y, i, corpusFiles.size(), f.getName())); + this.updateMessage(String.format(I18N.get("message.ONGOING_NOTIFICATION_ANALYZING_FILE_X_OF_Y"), i, corpusFiles.size(), f.getName())); } return null; @@ -551,12 +630,12 @@ public class CharacterAnalysisTab { try { boolean successullySaved = statistic.saveResultToDisk(); if (successullySaved) { - showAlert(Alert.AlertType.INFORMATION, Messages.NOTIFICATION_ANALYSIS_COMPLETED); + showAlert(Alert.AlertType.INFORMATION, I18N.get("message.NOTIFICATION_ANALYSIS_COMPLETED")); } else { - showAlert(Alert.AlertType.INFORMATION, Messages.NOTIFICATION_ANALYSIS_COMPLETED_NO_RESULTS); + showAlert(Alert.AlertType.INFORMATION, I18N.get("message.NOTIFICATION_ANALYSIS_COMPLETED_NO_RESULTS")); } } catch (UnsupportedEncodingException e1) { - showAlert(Alert.AlertType.ERROR, ERROR_WHILE_SAVING_RESULTS_TO_CSV); + showAlert(Alert.AlertType.ERROR, I18N.get("message.ERROR_WHILE_SAVING_RESULTS_TO_CSV")); logger.error("Error while saving", e1); } @@ -568,7 +647,7 @@ public class CharacterAnalysisTab { }); task.setOnFailed(e -> { - showAlert(Alert.AlertType.ERROR, ERROR_WHILE_EXECUTING); + showAlert(Alert.AlertType.ERROR, I18N.get("message.ERROR_WHILE_EXECUTING")); logger.error("Error while executing", e); ngramProgressBar.progressProperty().unbind(); ngramProgressBar.setProgress(0.0); @@ -579,7 +658,7 @@ public class CharacterAnalysisTab { }); task.setOnCancelled(e -> { - showAlert(Alert.AlertType.INFORMATION, Messages.NOTIFICATION_ANALYSIS_CANCLED); + showAlert(Alert.AlertType.INFORMATION, I18N.get("message.NOTIFICATION_ANALYSIS_CANCELED")); ngramProgressBar.progressProperty().unbind(); ngramProgressBar.setProgress(0.0); ngramProgressBar.setStyle(Settings.FX_ACCENT_OK); diff --git a/src/main/java/gui/CorpusTab.java b/src/main/java/gui/CorpusTab.java index ce60c67..68e6ad9 100755 --- a/src/main/java/gui/CorpusTab.java +++ b/src/main/java/gui/CorpusTab.java @@ -6,10 +6,7 @@ import static gui.Messages.*; import static util.Util.*; import java.io.File; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; +import java.util.*; import javafx.scene.layout.AnchorPane; import org.apache.commons.io.FileUtils; @@ -57,6 +54,9 @@ public class CorpusTab { @FXML private Button chooseResultsLocationB; + @FXML + private Button changeLanguageB; + @FXML private Label chooseCorpusL; private String chooseCorpusLabelContent; @@ -91,6 +91,9 @@ public class CorpusTab { private WordLevelTab wlController; private HostServices hostService; + private String corpusLocation; + private String corpusFilesSize; + public void initialize() { // add CSS style @@ -99,16 +102,18 @@ public class CorpusTab { stage = new Stage(); + manageTranslations(); + // add listeners chooseCorpusLocationB.setOnAction(e -> chooseCorpusLocation()); - chooseCorpusLocationB.setTooltip(new Tooltip(TOOLTIP_chooseCorpusLocationB)); + chooseCorpusLocationB.setTooltip(new Tooltip(I18N.get("message.TOOLTIP_chooseCorpusLocationB"))); helpH.setOnAction(e -> openHelpWebsite()); readHeaderInfoChB.selectedProperty().addListener((observable, oldValue, newValue) -> { readHeaderInfo = newValue; logger.info("read headers: ", readHeaderInfo); }); - readHeaderInfoChB.setTooltip(new Tooltip(TOOLTIP_readHeaderInfoChB)); + readHeaderInfoChB.setTooltip(new Tooltip(I18N.get("message.TOOLTIP_readHeaderInfoChB"))); // gosUseOrthChB.selectedProperty().addListener((observable, oldValue, newValue) -> { // gosUseOrth = newValue; @@ -123,18 +128,52 @@ public class CorpusTab { chooseResultsLocationB.setOnAction(e -> chooseResultsLocation(null)); + changeLanguageB.setOnAction(e -> { + if (I18N.getLocale() == new Locale.Builder().setLanguage("sl").setRegion("SI").build()){ + I18N.setLocale(Locale.ENGLISH); + } else { + I18N.setLocale(new Locale.Builder().setLanguage("sl").setRegion("SI").build()); + } + Messages.reload(); + +// StringBuilder sb = new StringBuilder(); +// sb.append(corpusLocation) +// .append("\n") +// .append(String.format(I18N.get("message.NOTIFICATION_FOUND_X_FILES"), corpusFilesSize)) +// .append("\n") +// .append(String.format(I18N.get("message.NOTIFICATION_CORPUS"), corpusType.toString())); +// +// chooseCorpusLabelContent = sb.toString(); +// chooseCorpusL.textProperty().unbind(); +// chooseCorpusL.setText(chooseCorpusLabelContent); + Messages.updateChooseCorpusL(); + + logger.info("change language"); + }); + // set labels and toggle visibility // toggleGosChBVisibility(); - chooseCorpusLabelContent = Messages.LABEL_CORPUS_LOCATION_NOT_SET; - chooseCorpusL.setText(chooseCorpusLabelContent); - - chooseResultsLabelContent = Messages.LABEL_RESULTS_LOCATION_NOT_SET; - chooseResultsL.setText(chooseResultsLabelContent); +// chooseCorpusLabelContent = Messages.LABEL_CORPUS_LOCATION_NOT_SET; +// chooseCorpusL.setText(chooseCorpusLabelContent); +// +// chooseResultsLabelContent = Messages.LABEL_RESULTS_LOCATION_NOT_SET; +// chooseResultsL.setText(chooseResultsLabelContent); togglePiAndSetCorpusWrapper(false); } + private void manageTranslations(){ + chooseCorpusLocationB.textProperty().bind(I18N.createStringBinding("button.setCorpusLocation")); + readHeaderInfoChB.textProperty().bind(I18N.createStringBinding("checkBox.readHeaderInfo")); + chooseResultsLocationB.textProperty().bind(I18N.createStringBinding("button.chooseResultsLocation")); + helpH.textProperty().bind(I18N.createStringBinding("hyperlink.help")); + changeLanguageB.textProperty().bind(I18N.createStringBinding("button.language")); + chooseCorpusL.textProperty().bind(I18N.createStringBinding("message.LABEL_CORPUS_LOCATION_NOT_SET")); + chooseResultsL.textProperty().bind(I18N.createStringBinding("message.LABEL_RESULTS_LOCATION_NOT_SET")); + + } + private void togglePiAndSetCorpusWrapper(boolean piIsActive) { locationScanPI.setVisible(piIsActive); setCorpusWrapperP.setLayoutX(piIsActive ? 100.0 : 10.0); @@ -166,18 +205,23 @@ public class CorpusTab { // scan for xml files Collection corpusFiles = FileUtils.listFiles(selectedDirectory, FileFilterUtils.suffixFileFilter("xml", IOCase.INSENSITIVE), TrueFileFilter.INSTANCE); + corpusLocation = selectedDirectory.getAbsolutePath(); + corpusFilesSize = String.valueOf(corpusFiles.size()); + Messages.setChooseCorpusProperties(corpusLocation, corpusFilesSize, corpusType != null ? corpusType.toString() : null); + // make sure there are corpus files in selected directory or notify the user about it if (corpusFiles.size() == 0) { - logger.info("alert: ", WARNING_CORPUS_NOT_FOUND); - showAlert(Alert.AlertType.ERROR, WARNING_CORPUS_NOT_FOUND, null); + logger.info("alert: ", I18N.get("message.WARNING_CORPUS_NOT_FOUND")); + showAlert(Alert.AlertType.ERROR, I18N.get("message.WARNING_CORPUS_NOT_FOUND"), null); } else { - String chooseCorpusLabelContentTmp = detectCorpusType(corpusFiles, selectedDirectory.getAbsolutePath()); + String chooseCorpusLabelContentTmp = detectCorpusType(corpusFiles); if (chooseCorpusLabelContentTmp == null) { - logger.info("alert: ", WARNING_CORPUS_NOT_FOUND); - showAlert(Alert.AlertType.ERROR, WARNING_CORPUS_NOT_FOUND, null); + logger.info("alert: ", I18N.get("message.WARNING_CORPUS_NOT_FOUND")); + showAlert(Alert.AlertType.ERROR, I18N.get("message.WARNING_CORPUS_NOT_FOUND"), null); } else { initNewCorpus(selectedDirectory, corpusFiles); + Messages.setChooseCorpusProperties(corpusLocation, corpusFilesSize, corpusType.toString()); corpus.setChosenCorpusLocation(selectedDirectory); corpus.setDetectedCorpusFiles(corpusFiles); @@ -221,11 +265,12 @@ public class CorpusTab { File chosenResultsLocationTmp = new File(resultsLocationPath); if (!ValidationUtil.isValidDirectory(chosenResultsLocationTmp)) { - showAlert(Alert.AlertType.ERROR, WARNING_RESULTS_DIR_NOT_VALID); - logger.info("alert: ", WARNING_RESULTS_DIR_NOT_VALID); + showAlert(Alert.AlertType.ERROR, I18N.get("message.WARNING_RESULTS_DIR_NOT_VALID")); + logger.info("alert: ", I18N.get("message.WARNING_RESULTS_DIR_NOT_VALID")); } else { corpus.setChosenResultsLocation(chosenResultsLocationTmp); chooseResultsLabelContent = corpus.getChosenResultsLocation().getAbsolutePath(); + chooseResultsL.textProperty().unbind(); chooseResultsL.setText(chooseResultsLabelContent); logger.info("results dir: " + chooseResultsLabelContent); } @@ -241,14 +286,15 @@ public class CorpusTab { String defaultResultsLocationPath = corpus.getChosenCorpusLocation().getAbsolutePath(); logger.info("setting default results location to: ", defaultResultsLocationPath); - chooseCorpusL.setText(chooseCorpusLabelContent); + Messages.setChooseCorpusL(chooseCorpusL, chooseCorpusLabelContent); } private void readHeaderInfo() { CorpusType corpusType = corpus.getCorpusType(); Collection corpusFiles = corpus.getDetectedCorpusFiles(); togglePiAndSetCorpusWrapper(true); - chooseCorpusL.setText(LABEL_SCANNING_CORPUS); + chooseCorpusL.textProperty().unbind(); + chooseCorpusL.setText(I18N.get("message.LABEL_SCANNING_CORPUS")); logger.info("reading header data for ", corpusType.toString()); @@ -270,6 +316,8 @@ public class CorpusTab { i++; if (corpusIsSplit) { +// System.out.println(i); +// System.out.println(corpusFiles.size()); updateProgress(i, corpusFiles.size()); } } @@ -287,12 +335,12 @@ public class CorpusTab { if (ValidationUtil.isEmpty(readTaxonomy)) { // if no taxonomy found alert the user and keep other tabs disabled logger.info("No taxonomy found in headers."); - GUIController.showAlert(Alert.AlertType.ERROR, WARNING_NO_TAXONOMY_FOUND); + GUIController.showAlert(Alert.AlertType.ERROR, I18N.get("message.WARNING_NO_TAXONOMY_FOUND")); } else { // set taxonomy, update label corpus.setTaxonomy(readTaxonomy); corpus.setHeaderRead(true); - chooseCorpusL.setText(chooseCorpusLabelContent); + Messages.setChooseCorpusL(chooseCorpusL, chooseCorpusLabelContent); setResults(); setCorpusForAnalysis(); } @@ -353,14 +401,14 @@ public class CorpusTab { if (ValidationUtil.isEmpty(values)) { // if no taxonomy found alert the user and keep other tabs disabled logger.info("No solar filters found in headers."); - GUIController.showAlert(Alert.AlertType.ERROR, WARNING_NO_SOLAR_FILTERS_FOUND); + GUIController.showAlert(Alert.AlertType.ERROR, I18N.get("message.WARNING_NO_SOLAR_FILTERS_FOUND")); } else { HashMap> filtersForComboBoxes = SolarFilters.getFiltersForComboBoxes(values); // set taxonomy, update label corpus.setSolarFiltersForXML(values); corpus.setSolarFilters(filtersForComboBoxes); corpus.setHeaderRead(true); - chooseCorpusL.setText(chooseCorpusLabelContent); + Messages.setChooseCorpusL(chooseCorpusL, chooseCorpusLabelContent); setResults(); setCorpusForAnalysis(); } @@ -432,7 +480,7 @@ public class CorpusTab { // gosUseOrthChB.setVisible(corpus != null && corpus.getCorpusType() != null && corpus.getCorpusType() == CorpusType.GOS); // } - private String detectCorpusType(Collection corpusFiles, String corpusLocation) { + private String detectCorpusType(Collection corpusFiles) { // check that we recognize this corpus // read first file only, maybe later do all, if toll on resources is acceptable File f = corpusFiles.iterator().next(); @@ -460,12 +508,14 @@ public class CorpusTab { } else { corpus.setCorpusType(corpusType); + Messages.setChooseCorpusProperties(corpusLocation, corpusFilesSize, corpusType.toString()); + StringBuilder sb = new StringBuilder(); sb.append(corpusLocation) .append("\n") - .append(String.format(NOTIFICATION_FOUND_X_FILES, corpusFiles.size())) + .append(String.format(I18N.get("message.NOTIFICATION_FOUND_X_FILES"), corpusFiles.size())) .append("\n") - .append(String.format("Korpus: %s", corpusType.toString())); + .append(String.format(I18N.get("message.NOTIFICATION_CORPUS"), corpusType.toString())); String result = sb.toString(); diff --git a/src/main/java/gui/GUIController.java b/src/main/java/gui/GUIController.java index be311c1..741d002 100755 --- a/src/main/java/gui/GUIController.java +++ b/src/main/java/gui/GUIController.java @@ -2,6 +2,7 @@ package gui; import java.io.IOException; +import javafx.beans.binding.StringBinding; import javafx.scene.layout.AnchorPane; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -82,9 +83,25 @@ public class GUIController extends Application { @Override public void start(Stage primaryStage) throws IOException { +// File fileDir = new File("message_sl_unicode.properties"); +// +// BufferedReader in = new BufferedReader( +// new InputStreamReader( +// new FileInputStream(fileDir), "UTF8")); +// +// String str; +// +// while ((str = in.readLine()) != null) { +// System.out.println(str); +// } +// +// in.close(); + Parent root = FXMLLoader.load(getClass().getResource("/GUI.fxml")); // Parent root = FXMLLoader.load(ResourceLookup.resources.url("GUI.fxml")); - primaryStage.setTitle("GUI"); +// primaryStage.setTitle("Luščilnik"); +// StringBinding a = I18N.createStringBinding("window.title"); + primaryStage.titleProperty().bind(I18N.createStringBinding("window.title")); Scene scene = new Scene(root, 800, 600); // https://github.com/dicolar/jbootx // scene.getStylesheets().add(GUIController.class.getResource("bootstrap3.css").toExternalForm()) @@ -103,6 +120,8 @@ public class GUIController extends Application { gui.getStyleClass().add("root"); corpus = new Corpus(); + manageTranslations(); + ctController.setCorpus(corpus); ctController.setFilterTab(filterTab); ctController.setStringLevelTabNew2(StringLevelTabNew2); @@ -146,6 +165,15 @@ public class GUIController extends Application { tabPane.getTabs().removeAll(filterTab); } + private void manageTranslations(){ + corpusTab.textProperty().bind(I18N.createStringBinding("tab.corpusTab")); + filterTab.textProperty().bind(I18N.createStringBinding("tab.filterTab")); + CharacterLevelTabNew.textProperty().bind(I18N.createStringBinding("tab.characterLevelTabNew")); + wordLevelTab.textProperty().bind(I18N.createStringBinding("tab.wordLevelTab")); + OneWordAnalysisTab.textProperty().bind(I18N.createStringBinding("tab.oneWordAnalysisTab")); + StringLevelTabNew2.textProperty().bind(I18N.createStringBinding("tab.stringLevelTabNew2")); + } + static void showAlert(Alert.AlertType alertType, String headerText, String contentText) { Alert alert = new Alert(alertType); alert.setTitle(Messages.windowTitles.get(alertType)); diff --git a/src/main/java/gui/I18N.java b/src/main/java/gui/I18N.java new file mode 100644 index 0000000..57f4c27 --- /dev/null +++ b/src/main/java/gui/I18N.java @@ -0,0 +1,230 @@ +package gui; + +import com.sun.javafx.collections.ObservableListWrapper; +import javafx.beans.binding.Bindings; +import javafx.beans.binding.ObjectBinding; +import javafx.beans.binding.StringBinding; +import javafx.beans.property.ObjectProperty; +import javafx.beans.property.SimpleObjectProperty; +import javafx.beans.value.ObservableValue; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import javafx.scene.control.Button; +import javafx.scene.control.Label; +import javafx.scene.control.Tooltip; + +import java.io.UnsupportedEncodingException; +import java.text.MessageFormat; +import java.util.*; +import java.util.concurrent.Callable; + +public final class I18N { + private static final ObjectProperty locale; + + static { + locale = new SimpleObjectProperty<>(getDefaultLocale()); + locale.addListener((observable, oldValue, newValue) -> Locale.setDefault(newValue)); + } + + /** + * get the supported Locales. + * + * @return List of Locale objects. + */ + public static List getSupportedLocales() { + return new ArrayList<>(Arrays.asList(new Locale.Builder().setLanguage("sl").setRegion("SI").build(), Locale.ENGLISH)); + } + /** + * get the default locale. This is the systems default if contained in the supported locales, english otherwise. + * + * @return + */ + public static Locale getDefaultLocale() { + Locale sysDefault = Locale.getDefault(); + return getSupportedLocales().contains(sysDefault) ? sysDefault : new Locale.Builder().setLanguage("sl").setRegion("SI").build(); + } + public static Locale getLocale() { + return locale.get(); + } + public static void setLocale(Locale locale) { + localeProperty().set(locale); + Locale.setDefault(locale); + } + public static ObjectProperty localeProperty() { + return locale; + } + /** + * gets the string with the given key from the resource bundle for the current locale and uses it as first argument + * to MessageFormat.format, passing in the optional args and returning the result. + * + * @param key + * message key + * @param args + * optional arguments for the message + * @return localized formatted string + */ + public static String get(final String key, final Object... args) { + ResourceBundle bundle = ResourceBundle.getBundle("message", getLocale()); + String val = bundle.getString(key); + try { + return MessageFormat.format(new String(val.getBytes("ISO-8859-1"), "UTF-8"), args); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + return val; +// return MessageFormat.format(bundle.getString(key), args); + } + + public static ObservableList getObject(final ArrayList keys, final Object... args) { + ResourceBundle bundle = ResourceBundle.getBundle("message", getLocale()); + + ArrayList results = new ArrayList<>(); + for(String key : keys){ + String val = bundle.getString(key); + try { + results.add(MessageFormat.format(new String(val.getBytes("ISO-8859-1"), "UTF-8"), args)); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + } + + return FXCollections.observableArrayList(results); + } + /** + * creates a String binding to a localized String for the given message bundle key + * + * @param key + * key + * @return String binding + */ + public static StringBinding createStringBinding(final String key, Object... args) { + return Bindings.createStringBinding(() -> get(key, args), locale); + } + +// public static ObservableValue> createListStringBinding(final String key, Object... args) { +// ObservableList r = (ObservableList) new ArrayList(); +// r.add(Bindings.createStringBinding(() -> get(key, args), locale)); +// return r; +// } + + /** + * creates a Object Binding to a localized Object that is computed by calling the given func + * + * @param func + * function called on every change + * @return StringBinding + */ + public static StringBinding createStringBinding(Callable func) { + return Bindings.createStringBinding(func, locale); + } + /** + * creates a String binding to a localized String for the given message bundle key + * + * @param keys + * key + * @return ObjectBinding + */ + public static ObjectBinding createObjectBinding(final ArrayList keys, Object... args) { + return Bindings.createObjectBinding(() -> getObject(keys, args), locale); + } + +// public static ObservableValue> createListStringBinding(final String key, Object... args) { +// ObservableList r = (ObservableList) new ArrayList(); +// r.add(Bindings.createStringBinding(() -> get(key, args), locale)); +// return r; +// } + + /** + * creates a String Binding to a localized String that is computed by calling the given func + * + * @param func + * function called on every change + * @return ObjectBinding + */ + public static ObjectBinding createObjectBinding(Callable func) { + return Bindings.createObjectBinding(func, locale); + } + + public static String getIndependent(final String key, Locale locale, final Object... args) { + ResourceBundle bundle = ResourceBundle.getBundle("message", locale); + String val = bundle.getString(key); + try { + return MessageFormat.format(new String(val.getBytes("ISO-8859-1"), "UTF-8"), args); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + return val; +// return MessageFormat.format(bundle.getString(key), args); + } + + public static String getTranslatedValue(String oldValue, ArrayList nGramComputeForLetters) { + Locale loc; + if(getLocale().equals(Locale.ENGLISH)) { + loc = new Locale.Builder().setLanguage("sl").setRegion("SI").build(); + } else { + loc = Locale.ENGLISH; + } + + for (String el : nGramComputeForLetters){ + if (oldValue.equals(getIndependent(el, loc))){ + return get(el); + } + } + + // in case translated language doesn't contain specified word, try original language + for (String el : nGramComputeForLetters){ + if (oldValue.equals(get(el))){ + return get(el); + } + } + + return null; + } + + /** + * Returns translated FXCollection + * + * @param words + * function called on every change + * @return ObjectBinding + */ + public static ObservableList translatedObservableList(ArrayList words){ + ArrayList translatedWords = new ArrayList<>(); + for (String word : words){ + translatedWords.add(get(word)); + } + + return FXCollections.observableArrayList(translatedWords); + } + + /** + * DUPLICATE OF toString() + * searches for possible values in translations and returns key of the string + * == .toString() + * + * @param w, prefix + * function called on every change + * @return ObjectBinding + */ + public static String findI18NString(String w, String prefix){ + ResourceBundle bundle = ResourceBundle.getBundle("message", getLocale()); + for (String key : bundle.keySet()){ + if(prefix.length() > key.length() || !key.substring(0, prefix.length()).equals(prefix)){ + continue; + } + String val = bundle.getString(key); + try { + String newVal = new String(val.getBytes("ISO-8859-1"), "UTF-8"); + + if (newVal.equals(w)){ + return key; + } + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + } + + + return null; + } +} diff --git a/src/main/java/gui/Messages.java b/src/main/java/gui/Messages.java index f34eaa7..72db5c1 100755 --- a/src/main/java/gui/Messages.java +++ b/src/main/java/gui/Messages.java @@ -5,62 +5,65 @@ import static javafx.scene.control.Alert.AlertType.*; import java.util.HashMap; import javafx.scene.control.Alert; +import javafx.scene.control.Label; public class Messages { // warnings & errors - public static final String WARNING_CORPUS_NOT_FOUND = "V izbranem direktoriju ni ustreznih korpusnih datotek."; - public static final String WARNING_RESULTS_DIR_NOT_VALID = "Za dostop do izbranega direktorija nimate potrebnih pravic."; - public static final String WARNING_DIFFERING_NGRAM_LEVEL_AND_FILTER_TOKENS = "Izbran nivo ngramov in vpisano št. besed v filtru se ne ujemata."; - public static final String WARNING_DIFFERING_NGRAM_LEVEL_AND_FILTER_TOKENS_INFO = "Izberite drugo število ali popravite filter."; - public static final String WARNING_WORD_OR_LEMMA = "Izberite, če želite statistiko izračunati za besede ali leme."; - public static final String WARNING_ONLY_NUMBERS_ALLOWED = "Prosim vnesite veljavno število."; - public static final String WARNING_NUMBER_TOO_BIG = "Vnešeno število je večje od števila taksonomij."; - public static final String WARNING_MISMATCHED_NGRAM_AND_TOKENS_VALUES = "Število za ngram (%d) in število msd oznak (%d) se morata ujemati."; - public static final String WARNING_MISSING_STRING_LENGTH = "Dolžina niza mora biti večja od 0. Vstavljena je privzeta vrednost (1)."; - public static final String WARNING_NO_TAXONOMY_FOUND = "Iz korpusnih datotek ni bilo moč razbrati taksonomije. Prosim izberite drugo lokacijo ali korpus."; - public static final String WARNING_NO_SOLAR_FILTERS_FOUND = "Iz korpusnih datotek ni bilo moč razbrati filtrov. Prosim izberite drugo lokacijo ali korpus."; - public static final String ERROR_WHILE_EXECUTING = "Prišlo je do napake med izvajanjem."; - public static final String ERROR_WHILE_SAVING_RESULTS_TO_CSV = "Prišlo je do napake med shranjevanje rezultatov."; - public static final String ERROR_NOT_ENOUGH_MEMORY= "Na voljo imate premalo pomnilnika (RAM-a) za analizo takšne količine podatkov."; + public static String WARNING_CORPUS_NOT_FOUND = I18N.get("message.WARNING_CORPUS_NOT_FOUND"); + public static String WARNING_RESULTS_DIR_NOT_VALID = I18N.get("message.WARNING_RESULTS_DIR_NOT_VALID"); + public static String WARNING_DIFFERING_NGRAM_LEVEL_AND_FILTER_TOKENS = I18N.get("message.WARNING_DIFFERING_NGRAM_LEVEL_AND_FILTER_TOKENS"); + public static String WARNING_DIFFERING_NGRAM_LEVEL_AND_FILTER_TOKENS_INFO = I18N.get("message.WARNING_DIFFERING_NGRAM_LEVEL_AND_FILTER_TOKENS_INFO"); + public static String WARNING_WORD_OR_LEMMA = I18N.get("message.WARNING_WORD_OR_LEMMA"); + public static String WARNING_ONLY_NUMBERS_ALLOWED = I18N.get("message.WARNING_ONLY_NUMBERS_ALLOWED"); + public static String WARNING_NUMBER_TOO_BIG = I18N.get("message.WARNING_NUMBER_TOO_BIG"); + public static String WARNING_MISMATCHED_NGRAM_AND_TOKENS_VALUES = I18N.get("message.WARNING_MISMATCHED_NGRAM_AND_TOKENS_VALUES"); + public static String WARNING_MISSING_STRING_LENGTH = I18N.get("message.WARNING_MISSING_STRING_LENGTH"); + public static String WARNING_NO_TAXONOMY_FOUND = I18N.get("message.WARNING_NO_TAXONOMY_FOUND"); + public static String WARNING_NO_SOLAR_FILTERS_FOUND = I18N.get("message.WARNING_NO_SOLAR_FILTERS_FOUND"); + public static String ERROR_WHILE_EXECUTING = I18N.get("message.ERROR_WHILE_EXECUTING"); + public static String ERROR_WHILE_SAVING_RESULTS_TO_CSV = I18N.get("message.ERROR_WHILE_SAVING_RESULTS_TO_CSV"); + public static String ERROR_NOT_ENOUGH_MEMORY= I18N.get("message.ERROR_NOT_ENOUGH_MEMORY"); // missing - public static final String MISSING_NGRAM_LEVEL = "N-gram nivo"; - public static final String MISSING_CALCULATE_FOR = "Izračunaj za"; - public static final String MISSING_SKIP = ""; - public static final String MISSING_STRING_LENGTH = "Dolžina niza"; - public static final String MISMATCHED_STRING_LENGTH_AND_MSD_REGEX = "Neujemajoča dolžina niza in regex filter"; + public static String MISSING_NGRAM_LEVEL = I18N.get("message.MISSING_NGRAM_LEVEL"); + public static String MISSING_CALCULATE_FOR = I18N.get("message.MISSING_CALCULATE_FOR"); + public static String MISSING_SKIP = I18N.get("message.MISSING_SKIP"); + public static String MISSING_STRING_LENGTH = I18N.get("message.MISSING_STRING_LENGTH"); + public static String MISMATCHED_STRING_LENGTH_AND_MSD_REGEX = I18N.get("message.MISMATCHED_STRING_LENGTH_AND_MSD_REGEX"); // general notifications - static content/set only once - public static final String NOTIFICATION_FOUND_X_FILES = "Št. najdenih datotek: %d"; - public static final String NOTIFICATION_ANALYSIS_COMPLETED = "Analiza je zaključena, rezultati so shranjeni."; - public static final String NOTIFICATION_ANALYSIS_COMPLETED_NO_RESULTS = "Analiza je zaključena, vendar ni bilo moč izračunati statistike, ki bi ustrezala vsem navedenim pogojem."; - public static final String RESULTS_PATH_SET_TO_DEFAULT = "Lokacija za shranjevanje rezultatov je nastavljena na lokacijo korpusa."; - public static final String NOTIFICATION_ANALYSIS_CANCLED = "Analiziranje je bilo prekinjeno."; + public static String NOTIFICATION_FOUND_X_FILES = I18N.get("message.NOTIFICATION_FOUND_X_FILES"); + public static String NOTIFICATION_ANALYSIS_COMPLETED = I18N.get("message.NOTIFICATION_ANALYSIS_COMPLETED"); + public static String NOTIFICATION_ANALYSIS_COMPLETED_NO_RESULTS = I18N.get("message.NOTIFICATION_ANALYSIS_COMPLETED_NO_RESULTS"); + public static String RESULTS_PATH_SET_TO_DEFAULT = I18N.get("message.RESULTS_PATH_SET_TO_DEFAULT"); + public static String NOTIFICATION_ANALYSIS_CANCLED = I18N.get("message.NOTIFICATION_ANALYSIS_CANCELED"); // ongoing notifications - displayed while processing, dynamically changing - public static final String ONGOING_NOTIFICATION_ANALYZING_FILE_X_OF_Y = "Analiziram datoteko %d od %d (%s)"; - public static final String CANCELING_NOTIFICATION = "Prekinjeno"; + public static String ONGOING_NOTIFICATION_ANALYZING_FILE_X_OF_Y = I18N.get("message.ONGOING_NOTIFICATION_ANALYZING_FILE_X_OF_Y"); + public static String CANCELING_NOTIFICATION = I18N.get("message.CANCELING_NOTIFICATION"); // Labels - public static final String LABEL_CORPUS_LOCATION_NOT_SET = "Lokacija korpusa ni nastavljena"; - public static final String LABEL_RESULTS_LOCATION_NOT_SET = "Lokacija za shranjevanje rezultatov ni nastavljena"; - public static final String LABEL_RESULTS_CORPUS_TYPE_NOT_SET = "Vrsta korpusa ni nastavljena"; + public static String LABEL_CORPUS_LOCATION_NOT_SET = I18N.get("message.LABEL_CORPUS_LOCATION_NOT_SET"); + public static String LABEL_RESULTS_LOCATION_NOT_SET = I18N.get("message.LABEL_RESULTS_LOCATION_NOT_SET"); + public static String LABEL_RESULTS_CORPUS_TYPE_NOT_SET = I18N.get("message.LABEL_RESULTS_CORPUS_TYPE_NOT_SET"); - public static final String LABEL_SCANNING_CORPUS = "Iskanje in analiza korpusnih datotek..."; - public static final String LABEL_SCANNING_SINGLE_FILE_CORPUS = "Analiza vnosa "; - public static final String COMPLETED = "končano"; - - public static final String TOOLTIP_chooseCorpusLocationB = "Izberite mapo v kateri se nahaja korpus. Program izbrano mapo preišče rekurzivno, zato bodite pozorni, da ne izberete mape z več korpusi ali z mnogo datotekami, ki niso del korpusa."; - public static final String TOOLTIP_readHeaderInfoChB = "Če izberete to opcijo, se bo iz headerjev korpusa prebrala razpoložljiva taksonomija oz. filtri (korpus Šolar). Ta operacija lahko traja dlje časa, sploh če je korpus združen v eni sami datoteki."; - public static final String TOOLTIP_readNotePunctuationsChB = "Ločila med povedmi se upoštevajo v vsakem primeru."; - public static final String TOOLTIP_readDisplayTaxonomyChB = "V izhodni datoteki bodo prikazane tudi statistike po taksonomijah."; + public static String LABEL_SCANNING_CORPUS = I18N.get("message.LABEL_SCANNING_CORPUS"); + public static String LABEL_SCANNING_SINGLE_FILE_CORPUS = I18N.get("message.LABEL_SCANNING_SINGLE_FILE_CORPUS"); + public static String COMPLETED = I18N.get("message.COMPLETED"); + public static String TOOLTIP_chooseCorpusLocationB = I18N.get("message.TOOLTIP_chooseCorpusLocationB"); + public static String TOOLTIP_readHeaderInfoChB = I18N.get("message.TOOLTIP_readHeaderInfoChB"); + public static String TOOLTIP_readNotePunctuationsChB = I18N.get("message.TOOLTIP_readNotePunctuationsChB"); + public static String TOOLTIP_readDisplayTaxonomyChB = I18N.get("message.TOOLTIP_readDisplayTaxonomyChB"); + private static Label chooseCorpusL; + private static String chooseCorpusLabelContent; + private static String[] chooseCorpusLabelProperties; // Not properly to be here. TODO move somewhere else in future - public static final String HELP_URL = "http://slovnica.ijs.si/"; + public static String HELP_URL = "http://slovnica.ijs.si/"; // helper maps /** @@ -73,8 +76,46 @@ public class Messages { static { // automatically set window's title - windowTitles.put(ERROR, "Napaka"); - windowTitles.put(WARNING, "Opozorilo"); - windowTitles.put(CONFIRMATION, "Potrdilo"); + windowTitles.put(ERROR, I18N.get("windowTitles.error")); + windowTitles.put(WARNING, I18N.get("windowTitles.warning")); + windowTitles.put(CONFIRMATION, I18N.get("windowTitles.confirmation")); + } + + public static void reload(){ + LABEL_CORPUS_LOCATION_NOT_SET = I18N.createStringBinding("message.LABEL_CORPUS_LOCATION_NOT_SET").get(); + windowTitles = new HashMap<>(); + windowTitles.put(ERROR, I18N.get("windowTitles.error")); + windowTitles.put(WARNING, I18N.get("windowTitles.warning")); + windowTitles.put(CONFIRMATION, I18N.get("windowTitles.confirmation")); + } + + public static void setChooseCorpusL(Label chooseCorpus, String chooseCorpusLabel){ + chooseCorpusL = chooseCorpus; + chooseCorpusLabelContent = chooseCorpusLabel; + + chooseCorpusL.textProperty().unbind(); + chooseCorpusL.setText(chooseCorpusLabelContent); + } + + public static void setChooseCorpusProperties(String corpusLoc, String corpusFilesSi, String corpusName){ + chooseCorpusLabelProperties = new String[3]; + chooseCorpusLabelProperties[0] = corpusLoc; + chooseCorpusLabelProperties[1] = corpusFilesSi; + chooseCorpusLabelProperties[2] = corpusName; + } + + public static void updateChooseCorpusL(){ + if (chooseCorpusLabelProperties != null && chooseCorpusLabelProperties[0] != null && chooseCorpusLabelProperties[1] != null && chooseCorpusLabelProperties[2] != null) { + StringBuilder sb = new StringBuilder(); + sb.append(chooseCorpusLabelProperties[0]) + .append("\n") + .append(String.format(I18N.get("message.NOTIFICATION_FOUND_X_FILES"), chooseCorpusLabelProperties[1])) + .append("\n") + .append(String.format(I18N.get("message.NOTIFICATION_CORPUS"), chooseCorpusLabelProperties[2])); + + chooseCorpusLabelContent = sb.toString(); + chooseCorpusL.textProperty().unbind(); + chooseCorpusL.setText(chooseCorpusLabelContent); + } } } diff --git a/src/main/java/gui/OneWordAnalysisTab.java b/src/main/java/gui/OneWordAnalysisTab.java index 49580fc..f1e3407 100755 --- a/src/main/java/gui/OneWordAnalysisTab.java +++ b/src/main/java/gui/OneWordAnalysisTab.java @@ -2,6 +2,8 @@ package gui; import data.*; import javafx.application.HostServices; +import javafx.beans.value.ChangeListener; +import javafx.beans.value.ObservableValue; import javafx.collections.FXCollections; import javafx.collections.ListChangeListener; import javafx.collections.ObservableList; @@ -36,9 +38,37 @@ public class OneWordAnalysisTab { @FXML public Label selectedFiltersLabel; + @FXML public Label solarFilters; + @FXML + public Label calculateForL; + + @FXML + public Label alsoVisualizeL; + + @FXML + public Label displayTaxonomyL; + + @FXML + public Label writeMsdAtTheEndL; + + @FXML + public Label dataLimitL; + + @FXML + public Label msdL; + + @FXML + public Label taxonomyL; + + @FXML + public Label minimalOccurrencesL; + + @FXML + public Label minimalTaxonomyL; + @FXML private TextField msdTF; private ArrayList msd; @@ -75,6 +105,9 @@ public class OneWordAnalysisTab { @FXML private Button computeNgramsB; + @FXML + private Button changeLanguageB; + @FXML private Button cancel; @@ -98,17 +131,49 @@ public class OneWordAnalysisTab { private Filter filter; private boolean useDb; private HostServices hostService; - - private static final ObservableList N_GRAM_COMPUTE_FOR_WORDS = FXCollections.observableArrayList("lema", "različnica", "oblikoskladenjska oznaka"); - private static final ObservableList N_GRAM_COMPUTE_FOR_LETTERS = FXCollections.observableArrayList("lema", "različnica"); - private static final ObservableList N_GRAM_COMPUTE_FOR_WORDS_ORTH = FXCollections.observableArrayList("različnica"); - private static final ObservableList N_GRAM_COMPUTE_FOR_WORDS_GOS = FXCollections.observableArrayList("lema", "različnica", "oblikoskladenjska oznaka", "normalizirana različnica"); - private static final ObservableList alsoVisualizeItemsLemma = FXCollections.observableArrayList("besedna vrsta", "oblikoskladenjska oznaka"); - private static final ObservableList alsoVisualizeItemsWord = FXCollections.observableArrayList("lema", "besedna vrsta", "oblikoskladenjska oznaka"); - private static final ObservableList alsoVisualizeItemsWordGos = FXCollections.observableArrayList("lema", "besedna vrsta", "oblikoskladenjska oznaka", "normalizirana različnica"); - private static final ObservableList alsoVisualizeItemsNormalizedWord = FXCollections.observableArrayList("lema", "besedna vrsta", "oblikoskladenjska oznaka"); - private static final ObservableList alsoVisualizeItemsMsd = FXCollections.observableArrayList("besedna vrsta"); - private static final ObservableList alsoVisualizeItemsEmpty = FXCollections.observableArrayList(); + private ListChangeListener taxonomyListener; + private ListChangeListener alsoVisualizeListener; + private ChangeListener calculateForListener; + +// private static final ObservableList N_GRAM_COMPUTE_FOR_WORDS = FXCollections.observableArrayList("lema", "različnica", "oblikoskladenjska oznaka"); +// private static final ObservableList N_GRAM_COMPUTE_FOR_LETTERS = FXCollections.observableArrayList("lema", "različnica"); +// private static final ObservableList N_GRAM_COMPUTE_FOR_WORDS_ORTH = FXCollections.observableArrayList("različnica"); +// private static final ObservableList N_GRAM_COMPUTE_FOR_WORDS_GOS = FXCollections.observableArrayList("lema", "različnica", "oblikoskladenjska oznaka", "normalizirana različnica"); +// private static final ObservableList alsoVisualizeItemsLemma = FXCollections.observableArrayList("besedna vrsta", "oblikoskladenjska oznaka"); +// private static final ObservableList alsoVisualizeItemsWord = FXCollections.observableArrayList("lema", "besedna vrsta", "oblikoskladenjska oznaka"); +// private static final ObservableList alsoVisualizeItemsWordGos = FXCollections.observableArrayList("lema", "besedna vrsta", "oblikoskladenjska oznaka", "normalizirana različnica"); +// private static final ObservableList alsoVisualizeItemsNormalizedWord = FXCollections.observableArrayList("lema", "besedna vrsta", "oblikoskladenjska oznaka"); +// private static final ObservableList alsoVisualizeItemsMsd = FXCollections.observableArrayList("besedna vrsta"); +// private static final ObservableList alsoVisualizeItemsEmpty = FXCollections.observableArrayList(); + + // private static final ObservableList N_GRAM_COMPUTE_FOR_WORDS = FXCollections.observableArrayList("lema", "različnica"); +// private static final ObservableList N_GRAM_COMPUTE_FOR_LETTERS = FXCollections.observableArrayList("lema", "različnica"); + private static final String [] N_GRAM_COMPUTE_FOR_WORDS_ARRAY = {"calculateFor.WORD", "calculateFor.LEMMA", "calculateFor.MORPHOSYNTACTIC_SPECS"}; + private static final ArrayList N_GRAM_COMPUTE_FOR_WORDS = new ArrayList<>(Arrays.asList(N_GRAM_COMPUTE_FOR_WORDS_ARRAY)); + // private static final ObservableList N_GRAM_COMPUTE_FOR_WORDS_ORTH = FXCollections.observableArrayList("različnica"); + private static final String [] N_GRAM_COMPUTE_FOR_WORDS_ORTH_ARRAY = {"calculateFor.WORD"}; + private static final ArrayList N_GRAM_COMPUTE_FOR_WORDS_ORTH = new ArrayList<>(Arrays.asList(N_GRAM_COMPUTE_FOR_WORDS_ORTH_ARRAY)); + // private static final ObservableList N_GRAM_COMPUTE_FOR_WORDS_GOS = FXCollections.observableArrayList("lema", "različnica", "normalizirana različnica"); + private static final String [] N_GRAM_COMPUTE_FOR_WORDS_GOS_ARRAY = {"calculateFor.WORD", "calculateFor.LEMMA", "calculateFor.MORPHOSYNTACTIC_SPECS", "calculateFor.NORMALIZED_WORD"}; + private static final ArrayList N_GRAM_COMPUTE_FOR_WORDS_GOS = new ArrayList<>(Arrays.asList(N_GRAM_COMPUTE_FOR_WORDS_GOS_ARRAY)); + // private static final ObservableList alsoVisualizeItemsLemma = FXCollections.observableArrayList("besedna vrsta", "oblikoskladenjska oznaka"); + private static final String [] ALSO_VISUALIZE_ITEMS_LEMMA_ARRAY = {"calculateFor.WORD_TYPE", "calculateFor.MORPHOSYNTACTIC_SPECS"}; + private static final ArrayList ALSO_VISUALIZE_ITEMS_LEMMA = new ArrayList<>(Arrays.asList(ALSO_VISUALIZE_ITEMS_LEMMA_ARRAY)); + // private static final ObservableList alsoVisualizeItemsWord = FXCollections.observableArrayList("lema", "besedna vrsta", "oblikoskladenjska oznaka"); + private static final String [] ALSO_VISUALIZE_ITEMS_WORDS_ARRAY = {"calculateFor.LEMMA", "calculateFor.WORD_TYPE", "calculateFor.MORPHOSYNTACTIC_SPECS"}; + private static final ArrayList ALSO_VISUALIZE_ITEMS_WORDS = new ArrayList<>(Arrays.asList(ALSO_VISUALIZE_ITEMS_WORDS_ARRAY)); + // private static final ObservableList alsoVisualizeItemsWordGos = FXCollections.observableArrayList("lema", "besedna vrsta", "oblikoskladenjska oznaka", "normalizirana različnica"); + private static final String [] ALSO_VISUALIZE_ITEMS_WORDS_GOS_ARRAY = {"calculateFor.LEMMA", "calculateFor.WORD_TYPE", "calculateFor.MORPHOSYNTACTIC_SPECS", "calculateFor.NORMALIZED_WORD"}; + private static final ArrayList ALSO_VISUALIZE_ITEMS_WORDS_GOS = new ArrayList<>(Arrays.asList(ALSO_VISUALIZE_ITEMS_WORDS_GOS_ARRAY)); + // private static final ObservableList alsoVisualizeItemsNormalizedWord = FXCollections.observableArrayList("lema", "besedna vrsta", "oblikoskladenjska oznaka"); + private static final String [] ALSO_VISUALIZE_ITEMS_NORMALIZED_WORDS_ARRAY = {"calculateFor.LEMMA", "calculateFor.WORD_TYPE", "calculateFor.MORPHOSYNTACTIC_SPECS"}; + private static final ArrayList ALSO_VISUALIZE_ITEMS_NORMALIZED_WORDS = new ArrayList<>(Arrays.asList(ALSO_VISUALIZE_ITEMS_NORMALIZED_WORDS_ARRAY)); + // private static final ObservableList alsoVisualizeItemsMsd = FXCollections.observableArrayList("besedna vrsta"); + private static final String [] ALSO_VISUALIZE_ITEMS_MSD_ARRAY = {"calculateFor.WORD_TYPE"}; + private static final ArrayList ALSO_VISUALIZE_ITEMS_MSD = new ArrayList<>(Arrays.asList(ALSO_VISUALIZE_ITEMS_MSD_ARRAY)); + // private static final ObservableList alsoVisualizeItemsEmpty = FXCollections.observableArrayList(); + private static final String [] ALSO_VISUALIZE_ITEMS_EMPTY_ARRAY = {}; + private static final ArrayList ALSO_VISUALIZE_ITEMS_EMPTY = new ArrayList<>(Arrays.asList(ALSO_VISUALIZE_ITEMS_EMPTY_ARRAY)); // TODO: pass observables for taxonomy based on header scan // after header scan @@ -120,51 +185,112 @@ public class OneWordAnalysisTab { oneWordAnalysisTabPane.getStylesheets().add("style.css"); oneWordAnalysisTabPane.getStyleClass().add("root"); + manageTranslations(); + currentMode = MODE.WORD; toggleMode(currentMode); AtomicBoolean writeMsdAtTheEndEnableCalculateFor = new AtomicBoolean(false); + if (calculateForListener != null){ + calculateForCB.valueProperty().removeListener(calculateForListener); + } + // calculateForCB - calculateForCB.valueProperty().addListener((observable, oldValue, newValue) -> { - calculateFor = CalculateFor.factory(newValue); - - alsoVisualizeCCB.getItems().removeAll(); - if(newValue.equals("lema")){ - alsoVisualizeCCB.getItems().setAll(alsoVisualizeItemsLemma); - } else if(newValue.equals("različnica")) { - if (corpus.getCorpusType() == CorpusType.GOS) - alsoVisualizeCCB.getItems().setAll(alsoVisualizeItemsWordGos); - else - alsoVisualizeCCB.getItems().setAll(alsoVisualizeItemsWord); - } else if(newValue.equals("normalizirana različnica")) { - alsoVisualizeCCB.getItems().setAll(alsoVisualizeItemsNormalizedWord); - } else if(newValue.equals("oblikoskladenjska oznaka")) { - writeMsdAtTheEndEnableCalculateFor.set(true); - writeMsdAtTheEndChB.setDisable(false); - alsoVisualizeCCB.getItems().setAll(alsoVisualizeItemsMsd); - }else { - - alsoVisualizeCCB.getItems().setAll(alsoVisualizeItemsEmpty); - } + calculateForListener = new ChangeListener() { + boolean ignoreCode = false; + @Override + public void changed(ObservableValue observable, String oldValue, String newValue) { + if (ignoreCode) { + return; + } + boolean languageChanged = newValue == null; + ArrayList checkedIndices = new ArrayList<>(); + checkedIndices.addAll(alsoVisualizeCCB.getCheckModel().getCheckedIndices()); + if (languageChanged) { + ignoreCode = true; + if (corpus.getCorpusType() == CorpusType.GOS) { + newValue = I18N.getTranslatedValue(oldValue, N_GRAM_COMPUTE_FOR_WORDS_GOS); + calculateForCB.getSelectionModel().select(newValue); + } else { + newValue = I18N.getTranslatedValue(oldValue, N_GRAM_COMPUTE_FOR_WORDS); + calculateForCB.getSelectionModel().select(newValue); + } + + // override if orth mode, allow only word + if (corpus.isGosOrthMode()) { + newValue = I18N.getTranslatedValue(oldValue, N_GRAM_COMPUTE_FOR_WORDS_ORTH); + calculateForCB.getSelectionModel().select(newValue); + } + ignoreCode = false; + } + + calculateFor = CalculateFor.factory(newValue); + + if (alsoVisualizeListener != null) { + alsoVisualizeCCB.getCheckModel().getCheckedItems().removeListener(alsoVisualizeListener); + } - if (!newValue.equals("oblikoskladenjska oznaka")){ - writeMsdAtTheEnd = false; - writeMsdAtTheEndChB.setSelected(false); - writeMsdAtTheEndChB.setDisable(true); - writeMsdAtTheEndEnableCalculateFor.set(false); + alsoVisualizeCCB.getCheckModel().clearChecks(); + alsoVisualizeCCB.getItems().removeAll(); + if (newValue.equals(CalculateFor.LEMMA.toString())) { + alsoVisualizeCCB.getItems().setAll(I18N.translatedObservableList(ALSO_VISUALIZE_ITEMS_LEMMA)); + } else if (newValue.equals(CalculateFor.WORD.toString())) { + if (corpus.getCorpusType() == CorpusType.GOS) + alsoVisualizeCCB.getItems().setAll(I18N.translatedObservableList(ALSO_VISUALIZE_ITEMS_WORDS_GOS)); + else + alsoVisualizeCCB.getItems().setAll(I18N.translatedObservableList(ALSO_VISUALIZE_ITEMS_WORDS)); + } else if (newValue.equals(CalculateFor.NORMALIZED_WORD.toString())) { + alsoVisualizeCCB.getItems().setAll(I18N.translatedObservableList(ALSO_VISUALIZE_ITEMS_NORMALIZED_WORDS)); + } else if (newValue.equals(CalculateFor.MORPHOSYNTACTIC_SPECS.toString())) { + writeMsdAtTheEndEnableCalculateFor.set(true); + writeMsdAtTheEndChB.setDisable(false); + alsoVisualizeCCB.getItems().setAll(I18N.translatedObservableList(ALSO_VISUALIZE_ITEMS_MSD)); + } else { + alsoVisualizeCCB.getItems().setAll(I18N.translatedObservableList(ALSO_VISUALIZE_ITEMS_EMPTY)); + } + + if (!newValue.equals(CalculateFor.MORPHOSYNTACTIC_SPECS.toString())) { + writeMsdAtTheEnd = false; + writeMsdAtTheEndChB.setSelected(false); + writeMsdAtTheEndChB.setDisable(true); + writeMsdAtTheEndEnableCalculateFor.set(false); + } + + + alsoVisualizeListener = new ListChangeListener() { + @Override + public void onChanged(Change c) { + alsoVisualize = new ArrayList<>(); + ObservableList checkedItems = alsoVisualizeCCB.getCheckModel().getCheckedItems(); + alsoVisualize.addAll(checkedItems); + if (checkedItems.contains(CalculateFor.MORPHOSYNTACTIC_SPECS.toString()) || writeMsdAtTheEndEnableCalculateFor.get()) { + writeMsdAtTheEndChB.setDisable(false); + } else { + writeMsdAtTheEnd = false; + writeMsdAtTheEndChB.setSelected(false); + writeMsdAtTheEndChB.setDisable(true); + } + logger.info(String.format("Selected also visualize items: %s", StringUtils.join(checkedItems, ","))); + } + }; +// alsoVisualizeCCB.getCheckModel().clearChecks(); +// alsoVisualizeCCB.getItems().removeAll(); +// alsoVisualizeCCB.getItems().setAll(I18N.translatedObservableList(ALSO_VISUALIZE_ITEMS_LEMMA)); + + alsoVisualizeCCB.getCheckModel().getCheckedItems().addListener(alsoVisualizeListener); + + if (languageChanged) { + for (int i : checkedIndices) { + alsoVisualizeCCB.getCheckModel().check(i); + } + } + + logger.info("calculateForCB:", calculateFor.toString()); } + }; - alsoVisualizeCCB.getCheckModel().getCheckedItems().addListener((ListChangeListener) c -> { - alsoVisualize = new ArrayList<>(); - ObservableList checkedItems = alsoVisualizeCCB.getCheckModel().getCheckedItems(); - alsoVisualize.addAll(checkedItems); - logger.info(String.format("Selected also visualize items: %s", StringUtils.join(checkedItems, ","))); - }); - alsoVisualizeCCB.getCheckModel().clearChecks(); - - logger.info("calculateForCB:", calculateFor.toString()); - }); + calculateForCB.valueProperty().addListener(calculateForListener); calculateForCB.getSelectionModel().select(0); @@ -180,7 +306,7 @@ public class OneWordAnalysisTab { int nOfRequiredMsdTokens = 1; if (msdTmp.size() != nOfRequiredMsdTokens) { - String msg = String.format(Messages.WARNING_MISMATCHED_NGRAM_AND_TOKENS_VALUES, nOfRequiredMsdTokens, msdTmp.size()); + String msg = String.format(I18N.get("message.WARNING_MISMATCHED_NGRAM_AND_TOKENS_VALUES"), nOfRequiredMsdTokens, msdTmp.size()); logAlert(msg); showAlert(Alert.AlertType.ERROR, msg); } @@ -202,30 +328,39 @@ public class OneWordAnalysisTab { msdTF.setText(""); msd = new ArrayList<>(); - alsoVisualizeCCB.getItems().removeAll(); - alsoVisualizeCCB.getItems().setAll(alsoVisualizeItemsLemma); - alsoVisualizeCCB.getCheckModel().getCheckedItems().addListener((ListChangeListener) c -> { - alsoVisualize = new ArrayList<>(); - ObservableList checkedItems = alsoVisualizeCCB.getCheckModel().getCheckedItems(); - alsoVisualize.addAll(checkedItems); - if (checkedItems.contains("oblikoskladenjska oznaka") || writeMsdAtTheEndEnableCalculateFor.get()){ - writeMsdAtTheEndChB.setDisable(false); - } else { - writeMsdAtTheEnd = false; - writeMsdAtTheEndChB.setSelected(false); - writeMsdAtTheEndChB.setDisable(true); + if (alsoVisualizeListener != null){ + alsoVisualizeCCB.getCheckModel().getCheckedItems().removeListener(alsoVisualizeListener); + } + + alsoVisualizeListener = new ListChangeListener() { + @Override + public void onChanged(Change c) { + alsoVisualize = new ArrayList<>(); + ObservableList checkedItems = alsoVisualizeCCB.getCheckModel().getCheckedItems(); + alsoVisualize.addAll(checkedItems); + if (checkedItems.contains("oblikoskladenjska oznaka") || writeMsdAtTheEndEnableCalculateFor.get()) { + writeMsdAtTheEndChB.setDisable(false); + } else { + writeMsdAtTheEnd = false; + writeMsdAtTheEndChB.setSelected(false); + writeMsdAtTheEndChB.setDisable(true); + } + logger.info(String.format("Selected also visualize items: %s", StringUtils.join(checkedItems, ","))); } - logger.info(String.format("Selected also visualize items: %s", StringUtils.join(checkedItems, ","))); - }); + }; alsoVisualizeCCB.getCheckModel().clearChecks(); + alsoVisualizeCCB.getItems().removeAll(); + alsoVisualizeCCB.getItems().setAll(I18N.translatedObservableList(ALSO_VISUALIZE_ITEMS_LEMMA)); + + alsoVisualizeCCB.getCheckModel().getCheckedItems().addListener(alsoVisualizeListener); // taxonomy if (Tax.getCorpusTypesWithTaxonomy().contains(corpus.getCorpusType())) { - taxonomyCCB.setDisable(false); - taxonomyCCB.getItems().removeAll(); - taxonomyCCB.getItems().setAll(corpus.getTaxonomy()); + if (taxonomyListener != null){ + taxonomyCCB.getCheckModel().getCheckedItems().removeListener(taxonomyListener); + } - ListChangeListener listener = new ListChangeListener() { + taxonomyListener = new ListChangeListener() { public boolean changing = true; @Override @@ -254,14 +389,12 @@ public class OneWordAnalysisTab { } }; -// taxonomyCCB.getCheckModel().getCheckedItems().removeListener(listener); -// System.out.println("THIS WORKS!!!!"); taxonomyCCB.getCheckModel().clearChecks(); -// System.out.println("YES???"); - taxonomyCCB.getCheckModel().getCheckedItems().addListener(listener); -// taxonomyCCB.setCheckModel(null); + taxonomyCCB.setDisable(false); + taxonomyCCB.getItems().removeAll(); + taxonomyCCB.getItems().setAll(corpus.getTaxonomy()); -// taxonomyCCB.getCheckModel().clearChecks(); + taxonomyCCB.getCheckModel().getCheckedItems().addListener(taxonomyListener); } else { taxonomyCCB.setDisable(true); } @@ -283,7 +416,7 @@ public class OneWordAnalysisTab { } logger.info("display taxonomy: ", displayTaxonomy); }); - displayTaxonomyChB.setTooltip(new Tooltip(TOOLTIP_readDisplayTaxonomyChB)); + displayTaxonomyChB.setTooltip(new Tooltip(I18N.get("message.TOOLTIP_readDisplayTaxonomyChB"))); } else { displayTaxonomyChB.setDisable(true); } @@ -312,8 +445,8 @@ public class OneWordAnalysisTab { String value = minimalOccurrencesTF.getText(); if (!ValidationUtil.isEmpty(value)) { if (!ValidationUtil.isNumber(value)) { - logAlert("minimalOccurrencesTF: " + WARNING_ONLY_NUMBERS_ALLOWED); - GUIController.showAlert(Alert.AlertType.ERROR, WARNING_ONLY_NUMBERS_ALLOWED); + logAlert("minimalOccurrencesTF: " + I18N.get("message.WARNING_ONLY_NUMBERS_ALLOWED")); + GUIController.showAlert(Alert.AlertType.ERROR, I18N.get("message.WARNING_ONLY_NUMBERS_ALLOWED")); } else { minimalOccurrences = Integer.parseInt(value); } @@ -330,8 +463,8 @@ public class OneWordAnalysisTab { String value = minimalTaxonomyTF.getText(); if (!ValidationUtil.isEmpty(value)) { if (!ValidationUtil.isNumber(value)) { - logAlert("minimalTaxonomyTF: " + WARNING_ONLY_NUMBERS_ALLOWED); - GUIController.showAlert(Alert.AlertType.ERROR, WARNING_ONLY_NUMBERS_ALLOWED); + logAlert("minimalTaxonomyTF: " + I18N.get("message.WARNING_ONLY_NUMBERS_ALLOWED")); + GUIController.showAlert(Alert.AlertType.ERROR, I18N.get("message.WARNING_ONLY_NUMBERS_ALLOWED")); } else { minimalTaxonomy = Integer.parseInt(value); } @@ -342,6 +475,17 @@ public class OneWordAnalysisTab { } }); + changeLanguageB.setOnAction(e -> { + if (I18N.getLocale() == new Locale.Builder().setLanguage("sl").setRegion("SI").build()){ + I18N.setLocale(Locale.ENGLISH); + } else { + I18N.setLocale(new Locale.Builder().setLanguage("sl").setRegion("SI").build()); + } + Messages.reload(); + Messages.updateChooseCorpusL(); + logger.info("change language"); + }); + computeNgramsB.setOnAction(e -> { compute(); logger.info("compute button"); @@ -429,6 +573,25 @@ public class OneWordAnalysisTab { // taxonomyCCB.getItems().addAll(taxonomyCCBValues); // // } + private void manageTranslations(){ + helpH.textProperty().bind(I18N.createStringBinding("hyperlink.help")); + changeLanguageB.textProperty().bind(I18N.createStringBinding("button.language")); + computeNgramsB.textProperty().bind(I18N.createStringBinding("button.computeNgrams")); + cancel.textProperty().bind(I18N.createStringBinding("button.cancel")); + + calculateForL.textProperty().bind(I18N.createStringBinding("label.calculateFor")); + alsoVisualizeL.textProperty().bind(I18N.createStringBinding("label.alsoVisualize")); + displayTaxonomyL.textProperty().bind(I18N.createStringBinding("label.displayTaxonomy")); + writeMsdAtTheEndL.textProperty().bind(I18N.createStringBinding("label.writeMsdAtTheEnd")); + + dataLimitL.textProperty().bind(I18N.createStringBinding("label.dataLimit")); + msdL.textProperty().bind(I18N.createStringBinding("label.msd")); + taxonomyL.textProperty().bind(I18N.createStringBinding("label.taxonomy")); + minimalOccurrencesL.textProperty().bind(I18N.createStringBinding("label.minimalOccurrences")); + minimalTaxonomyL.textProperty().bind(I18N.createStringBinding("label.minimalTaxonomy")); + solarFilters.textProperty().bind(I18N.createStringBinding("label.solarFilters")); + + } /** * Toggles visibility for panes which hold fields for skipgram value (not applicable when calculating for letters) etc., @@ -444,25 +607,18 @@ public class OneWordAnalysisTab { logger.info("mode: ", mode.toString()); if (mode == MODE.WORD) { - if (corpus.getCorpusType() == CorpusType.GOS) - calculateForCB.getItems().setAll(N_GRAM_COMPUTE_FOR_WORDS_GOS); - else - calculateForCB.getItems().setAll(N_GRAM_COMPUTE_FOR_WORDS); - } else if (mode == MODE.LETTER) { - calculateForCB.getItems().setAll(N_GRAM_COMPUTE_FOR_LETTERS); - - - // if calculateFor was selected for something other than a word or a lemma -> reset - if (!(calculateFor == CalculateFor.WORD || calculateFor == CalculateFor.LEMMA)) { - // if the user selected something else before selecting ngram for letters, reset that choice - calculateFor = CalculateFor.WORD; - calculateForCB.getSelectionModel().select("različnica"); + if (corpus.getCorpusType() == CorpusType.GOS) { + calculateForCB.itemsProperty().unbind(); + calculateForCB.itemsProperty().bind(I18N.createObjectBinding(N_GRAM_COMPUTE_FOR_WORDS_GOS)); + } else { + calculateForCB.itemsProperty().unbind(); + calculateForCB.itemsProperty().bind(I18N.createObjectBinding(N_GRAM_COMPUTE_FOR_WORDS)); } } - // override if orth mode, allow only word if (corpus.isGosOrthMode()) { - calculateForCB.getItems().setAll(N_GRAM_COMPUTE_FOR_WORDS_ORTH); + calculateForCB.itemsProperty().unbind(); + calculateForCB.itemsProperty().bind(I18N.createObjectBinding(N_GRAM_COMPUTE_FOR_WORDS_ORTH)); msdTF.setDisable(true); } else { msdTF.setDisable(false); @@ -549,11 +705,11 @@ public class OneWordAnalysisTab { readXML(f.toString(), statistic); i++; if (isCancelled()) { - updateMessage(CANCELING_NOTIFICATION); + updateMessage(I18N.get("message.CANCELING_NOTIFICATION")); break; } this.updateProgress(i, corpusFiles.size()); - this.updateMessage(String.format(ONGOING_NOTIFICATION_ANALYZING_FILE_X_OF_Y, i, corpusFiles.size(), f.getName())); + this.updateMessage(String.format(I18N.get("message.ONGOING_NOTIFICATION_ANALYZING_FILE_X_OF_Y"), i, corpusFiles.size(), f.getName())); } return null; @@ -567,12 +723,12 @@ public class OneWordAnalysisTab { try { boolean successullySaved = statistic.saveResultToDisk(); if (successullySaved) { - showAlert(Alert.AlertType.INFORMATION, Messages.NOTIFICATION_ANALYSIS_COMPLETED); + showAlert(Alert.AlertType.INFORMATION, I18N.get("message.NOTIFICATION_ANALYSIS_COMPLETED")); } else { - showAlert(Alert.AlertType.INFORMATION, Messages.NOTIFICATION_ANALYSIS_COMPLETED_NO_RESULTS); + showAlert(Alert.AlertType.INFORMATION, I18N.get("message.NOTIFICATION_ANALYSIS_COMPLETED_NO_RESULTS")); } } catch (UnsupportedEncodingException e1) { - showAlert(Alert.AlertType.ERROR, ERROR_WHILE_SAVING_RESULTS_TO_CSV); + showAlert(Alert.AlertType.ERROR, I18N.get("message.ERROR_WHILE_SAVING_RESULTS_TO_CSV")); logger.error("Error while saving", e1); } @@ -584,7 +740,7 @@ public class OneWordAnalysisTab { }); task.setOnFailed(e -> { - showAlert(Alert.AlertType.ERROR, ERROR_WHILE_EXECUTING); + showAlert(Alert.AlertType.ERROR, I18N.get("message.ERROR_WHILE_EXECUTING")); logger.error("Error while executing", e); ngramProgressBar.progressProperty().unbind(); ngramProgressBar.setProgress(0.0); @@ -595,7 +751,7 @@ public class OneWordAnalysisTab { }); task.setOnCancelled(e -> { - showAlert(Alert.AlertType.INFORMATION, Messages.NOTIFICATION_ANALYSIS_CANCLED); + showAlert(Alert.AlertType.INFORMATION, I18N.get("message.NOTIFICATION_ANALYSIS_CANCELED")); ngramProgressBar.progressProperty().unbind(); ngramProgressBar.setProgress(0.0); ngramProgressBar.setStyle(Settings.FX_ACCENT_OK); diff --git a/src/main/java/gui/StringAnalysisTabNew2.java b/src/main/java/gui/StringAnalysisTabNew2.java index f5e9d30..30fee7b 100755 --- a/src/main/java/gui/StringAnalysisTabNew2.java +++ b/src/main/java/gui/StringAnalysisTabNew2.java @@ -13,6 +13,8 @@ import java.util.concurrent.atomic.AtomicLong; import java.util.regex.Pattern; import javafx.application.HostServices; +import javafx.beans.value.ChangeListener; +import javafx.beans.value.ObservableValue; import javafx.scene.layout.AnchorPane; import org.apache.commons.lang3.SerializationUtils; import org.apache.commons.lang3.StringUtils; @@ -38,9 +40,53 @@ public class StringAnalysisTabNew2 { @FXML public Label selectedFiltersLabel; + @FXML public Label solarFilters; + @FXML + public Label calculateForL; + + @FXML + public Label alsoVisualizeL; + + @FXML + public Label displayTaxonomyL; + + @FXML + public Label dataLimitL; + + @FXML + public Label msdL; + + @FXML + public Label taxonomyL; + + @FXML + public Label minimalOccurrencesL; + + @FXML + public Label minimalTaxonomyL; + + @FXML + public Label skipValueL; + + @FXML + public Label slowSpeedWarning1L; + + @FXML + public Label slowSpeedWarning2L; + + @FXML + public Label ngramValueL; + + @FXML + public Label notePunctuationsL; + + @FXML + public Label collocabilityL; + + @FXML private TextField msdTF; private ArrayList msd; @@ -103,6 +149,9 @@ public class StringAnalysisTabNew2 { @FXML private Button computeNgramsB; + @FXML + private Button changeLanguageB; + @FXML private Button cancel; @@ -126,19 +175,50 @@ public class StringAnalysisTabNew2 { private Filter filter; private boolean useDb; private HostServices hostService; - - private static final ObservableList N_GRAM_COMPUTE_FOR_WORDS = FXCollections.observableArrayList("lema", "različnica", "oblikoskladenjska oznaka"); + private ListChangeListener taxonomyListener; + private ListChangeListener alsoVisualizeListener; + private ListChangeListener collocabilityListener; + private ChangeListener calculateForListener; + +// private static final ObservableList N_GRAM_COMPUTE_FOR_WORDS = FXCollections.observableArrayList("lema", "različnica", "oblikoskladenjska oznaka"); +// private static final ObservableList N_GRAM_COMPUTE_FOR_LETTERS = FXCollections.observableArrayList("lema", "različnica"); +// private static final ObservableList N_GRAM_COMPUTE_FOR_WORDS_ORTH = FXCollections.observableArrayList("različnica"); // private static final ObservableList N_GRAM_COMPUTE_FOR_WORDS_GOS = FXCollections.observableArrayList("lema", "različnica", "oblikoskladenjska oznaka", "normalizirana različnica"); - private static final ObservableList N_GRAM_COMPUTE_FOR_LETTERS = FXCollections.observableArrayList("lema", "različnica"); - private static final ObservableList N_GRAM_COMPUTE_FOR_WORDS_ORTH = FXCollections.observableArrayList("različnica"); - private static final ObservableList N_GRAM_COMPUTE_FOR_WORDS_GOS = FXCollections.observableArrayList("lema", "različnica", "oblikoskladenjska oznaka", "normalizirana različnica"); - private static final ObservableList alsoVisualizeItemsLemma = FXCollections.observableArrayList("besedna vrsta", "oblikoskladenjska oznaka"); - private static final ObservableList alsoVisualizeItemsWord = FXCollections.observableArrayList("lema", "besedna vrsta", "oblikoskladenjska oznaka"); - private static final ObservableList alsoVisualizeItemsWordGos = FXCollections.observableArrayList("lema", "besedna vrsta", "oblikoskladenjska oznaka", "normalizirana različnica"); - private static final ObservableList alsoVisualizeItemsNormalizedWord = FXCollections.observableArrayList("lema", "besedna vrsta", "oblikoskladenjska oznaka"); - private static final ObservableList alsoVisualizeItemsMsd = FXCollections.observableArrayList("besedna vrsta"); +// private static final ObservableList alsoVisualizeItemsLemma = FXCollections.observableArrayList("besedna vrsta", "oblikoskladenjska oznaka"); +// private static final ObservableList alsoVisualizeItemsWord = FXCollections.observableArrayList("lema", "besedna vrsta", "oblikoskladenjska oznaka"); +// private static final ObservableList alsoVisualizeItemsWordGos = FXCollections.observableArrayList("lema", "besedna vrsta", "oblikoskladenjska oznaka", "normalizirana različnica"); +// private static final ObservableList alsoVisualizeItemsNormalizedWord = FXCollections.observableArrayList("lema", "besedna vrsta", "oblikoskladenjska oznaka"); +// private static final ObservableList alsoVisualizeItemsMsd = FXCollections.observableArrayList("besedna vrsta"); private static final ObservableList COLLOCABILITY_ITEMS = FXCollections.observableArrayList("Dice", "t-score", "MI", "MI3", "logDice", "simple LL"); - private static final ObservableList alsoVisualizeItemsEmpty = FXCollections.observableArrayList(); +// private static final ObservableList alsoVisualizeItemsEmpty = FXCollections.observableArrayList(); + + // private static final ObservableList N_GRAM_COMPUTE_FOR_LETTERS = FXCollections.observableArrayList("lema", "različnica"); + private static final String [] N_GRAM_COMPUTE_FOR_WORDS_ARRAY = {"calculateFor.WORD", "calculateFor.LEMMA", "calculateFor.MORPHOSYNTACTIC_SPECS"}; + private static final ArrayList N_GRAM_COMPUTE_FOR_WORDS = new ArrayList<>(Arrays.asList(N_GRAM_COMPUTE_FOR_WORDS_ARRAY)); + // private static final ObservableList N_GRAM_COMPUTE_FOR_WORDS_ORTH = FXCollections.observableArrayList("različnica"); + private static final String [] N_GRAM_COMPUTE_FOR_WORDS_ORTH_ARRAY = {"calculateFor.WORD"}; + private static final ArrayList N_GRAM_COMPUTE_FOR_WORDS_ORTH = new ArrayList<>(Arrays.asList(N_GRAM_COMPUTE_FOR_WORDS_ORTH_ARRAY)); + // private static final ObservableList N_GRAM_COMPUTE_FOR_WORDS_GOS = FXCollections.observableArrayList("lema", "različnica", "normalizirana različnica"); + private static final String [] N_GRAM_COMPUTE_FOR_WORDS_GOS_ARRAY = {"calculateFor.WORD", "calculateFor.LEMMA", "calculateFor.MORPHOSYNTACTIC_SPECS", "calculateFor.NORMALIZED_WORD"}; + private static final ArrayList N_GRAM_COMPUTE_FOR_WORDS_GOS = new ArrayList<>(Arrays.asList(N_GRAM_COMPUTE_FOR_WORDS_GOS_ARRAY)); + // private static final ObservableList alsoVisualizeItemsLemma = FXCollections.observableArrayList("besedna vrsta", "oblikoskladenjska oznaka"); + private static final String [] ALSO_VISUALIZE_ITEMS_LEMMA_ARRAY = {"calculateFor.WORD_TYPE", "calculateFor.MORPHOSYNTACTIC_SPECS"}; + private static final ArrayList ALSO_VISUALIZE_ITEMS_LEMMA = new ArrayList<>(Arrays.asList(ALSO_VISUALIZE_ITEMS_LEMMA_ARRAY)); + // private static final ObservableList alsoVisualizeItemsWord = FXCollections.observableArrayList("lema", "besedna vrsta", "oblikoskladenjska oznaka"); + private static final String [] ALSO_VISUALIZE_ITEMS_WORDS_ARRAY = {"calculateFor.LEMMA", "calculateFor.WORD_TYPE", "calculateFor.MORPHOSYNTACTIC_SPECS"}; + private static final ArrayList ALSO_VISUALIZE_ITEMS_WORDS = new ArrayList<>(Arrays.asList(ALSO_VISUALIZE_ITEMS_WORDS_ARRAY)); + // private static final ObservableList alsoVisualizeItemsWordGos = FXCollections.observableArrayList("lema", "besedna vrsta", "oblikoskladenjska oznaka", "normalizirana različnica"); + private static final String [] ALSO_VISUALIZE_ITEMS_WORDS_GOS_ARRAY = {"calculateFor.LEMMA", "calculateFor.WORD_TYPE", "calculateFor.MORPHOSYNTACTIC_SPECS", "calculateFor.NORMALIZED_WORD"}; + private static final ArrayList ALSO_VISUALIZE_ITEMS_WORDS_GOS = new ArrayList<>(Arrays.asList(ALSO_VISUALIZE_ITEMS_WORDS_GOS_ARRAY)); + // private static final ObservableList alsoVisualizeItemsNormalizedWord = FXCollections.observableArrayList("lema", "besedna vrsta", "oblikoskladenjska oznaka"); + private static final String [] ALSO_VISUALIZE_ITEMS_NORMALIZED_WORDS_ARRAY = {"calculateFor.LEMMA", "calculateFor.WORD_TYPE", "calculateFor.MORPHOSYNTACTIC_SPECS"}; + private static final ArrayList ALSO_VISUALIZE_ITEMS_NORMALIZED_WORDS = new ArrayList<>(Arrays.asList(ALSO_VISUALIZE_ITEMS_NORMALIZED_WORDS_ARRAY)); + // private static final ObservableList alsoVisualizeItemsMsd = FXCollections.observableArrayList("besedna vrsta"); + private static final String [] ALSO_VISUALIZE_ITEMS_MSD_ARRAY = {"calculateFor.WORD_TYPE"}; + private static final ArrayList ALSO_VISUALIZE_ITEMS_MSD = new ArrayList<>(Arrays.asList(ALSO_VISUALIZE_ITEMS_MSD_ARRAY)); + // private static final ObservableList alsoVisualizeItemsEmpty = FXCollections.observableArrayList(); + private static final String [] ALSO_VISUALIZE_ITEMS_EMPTY_ARRAY = {}; + private static final ArrayList ALSO_VISUALIZE_ITEMS_EMPTY = new ArrayList<>(Arrays.asList(ALSO_VISUALIZE_ITEMS_EMPTY_ARRAY)); // TODO: pass observables for taxonomy based on header scan @@ -151,6 +231,8 @@ public class StringAnalysisTabNew2 { stringAnalysisTabPaneNew2.getStylesheets().add("style.css"); stringAnalysisTabPaneNew2.getStyleClass().add("root"); + manageTranslations(); + currentMode = MODE.WORD; toggleMode(currentMode); @@ -195,7 +277,7 @@ public class StringAnalysisTabNew2 { notePunctuations = newValue; logger.info("note punctuations: ", notePunctuations); }); - notePunctuationsChB.setTooltip(new Tooltip(TOOLTIP_readNotePunctuationsChB)); + notePunctuationsChB.setTooltip(new Tooltip(I18N.get("message.TOOLTIP_readNotePunctuationsChB"))); displayTaxonomy = false; displayTaxonomyChB.setSelected(false); @@ -215,57 +297,136 @@ public class StringAnalysisTabNew2 { } logger.info("display taxonomy: ", displayTaxonomy); }); - displayTaxonomyChB.setTooltip(new Tooltip(TOOLTIP_readDisplayTaxonomyChB)); + displayTaxonomyChB.setTooltip(new Tooltip(I18N.get("message.TOOLTIP_readDisplayTaxonomyChB"))); } else { displayTaxonomyChB.setDisable(true); } + if (calculateForListener != null){ + calculateForCB.valueProperty().removeListener(calculateForListener); + } + // calculateForCB - calculateForCB.valueProperty().addListener((observable, oldValue, newValue) -> { - calculateFor = CalculateFor.factory(newValue); - - alsoVisualizeCCB.getItems().removeAll(); - if(newValue.equals("lema")){ - alsoVisualizeCCB.getItems().setAll(alsoVisualizeItemsLemma); - } else if(newValue.equals("različnica")) { - if (corpus.getCorpusType() == CorpusType.GOS) - alsoVisualizeCCB.getItems().setAll(alsoVisualizeItemsWordGos); - else - alsoVisualizeCCB.getItems().setAll(alsoVisualizeItemsWord); - } else if(newValue.equals("normalizirana različnica")) { - alsoVisualizeCCB.getItems().setAll(alsoVisualizeItemsNormalizedWord); - }else if(newValue.equals("oblikoskladenjska oznaka")) { - alsoVisualizeCCB.getItems().setAll(alsoVisualizeItemsMsd); - }else { - alsoVisualizeCCB.getItems().setAll(alsoVisualizeItemsEmpty); + calculateForListener = new ChangeListener() { + boolean ignoreCode = false; + @Override + public void changed(ObservableValue observable, String oldValue, String newValue) { + if (ignoreCode) { + return; + } + boolean languageChanged = newValue == null; + ArrayList checkedIndices = new ArrayList<>(); + checkedIndices.addAll(alsoVisualizeCCB.getCheckModel().getCheckedIndices()); + if (languageChanged) { + ignoreCode = true; + if (corpus.getCorpusType() == CorpusType.GOS) { + newValue = I18N.getTranslatedValue(oldValue, N_GRAM_COMPUTE_FOR_WORDS_GOS); + calculateForCB.getSelectionModel().select(newValue); + } else { + newValue = I18N.getTranslatedValue(oldValue, N_GRAM_COMPUTE_FOR_WORDS); + calculateForCB.getSelectionModel().select(newValue); + } + + // override if orth mode, allow only word + if (corpus.isGosOrthMode()) { + newValue = I18N.getTranslatedValue(oldValue, N_GRAM_COMPUTE_FOR_WORDS_ORTH); + calculateForCB.getSelectionModel().select(newValue); + } + ignoreCode = false; + } + + calculateFor = CalculateFor.factory(newValue); + + if (alsoVisualizeListener != null) { + alsoVisualizeCCB.getCheckModel().getCheckedItems().removeListener(alsoVisualizeListener); + } + + alsoVisualizeCCB.getCheckModel().clearChecks(); + alsoVisualizeCCB.getItems().removeAll(); + if (newValue.equals(CalculateFor.LEMMA.toString())) { + alsoVisualizeCCB.getItems().setAll(I18N.translatedObservableList(ALSO_VISUALIZE_ITEMS_LEMMA)); + } else if (newValue.equals(CalculateFor.WORD.toString())) { + if (corpus.getCorpusType() == CorpusType.GOS) + alsoVisualizeCCB.getItems().setAll(I18N.translatedObservableList(ALSO_VISUALIZE_ITEMS_WORDS_GOS)); + else + alsoVisualizeCCB.getItems().setAll(I18N.translatedObservableList(ALSO_VISUALIZE_ITEMS_WORDS)); + } else if (newValue.equals(CalculateFor.NORMALIZED_WORD.toString())) { + alsoVisualizeCCB.getItems().setAll(I18N.translatedObservableList(ALSO_VISUALIZE_ITEMS_NORMALIZED_WORDS)); + } else if (newValue.equals(CalculateFor.MORPHOSYNTACTIC_SPECS.toString())) { + alsoVisualizeCCB.getItems().setAll(I18N.translatedObservableList(ALSO_VISUALIZE_ITEMS_MSD)); + } else { + alsoVisualizeCCB.getItems().setAll(I18N.translatedObservableList(ALSO_VISUALIZE_ITEMS_EMPTY)); + } + // alsoVisualizeCCB.getCheckModel().getCheckedItems().addListener((ListChangeListener) c -> { + // alsoVisualize = new ArrayList<>(); + // ObservableList checkedItems = alsoVisualizeCCB.getCheckModel().getCheckedItems(); + // alsoVisualize.addAll(checkedItems); + // logger.info(String.format("Selected also visualize items: %s", StringUtils.join(checkedItems, ","))); + // }); + // alsoVisualizeCCB.getCheckModel().clearChecks(); + + alsoVisualizeListener = new ListChangeListener() { + @Override + public void onChanged(Change c) { + alsoVisualize = new ArrayList<>(); + ObservableList checkedItems = alsoVisualizeCCB.getCheckModel().getCheckedItems(); + alsoVisualize.addAll(checkedItems); + logger.info(String.format("Selected also visualize items: %s", StringUtils.join(checkedItems, ","))); + } + }; +// alsoVisualizeCCB.getCheckModel().clearChecks(); +// alsoVisualizeCCB.getItems().removeAll(); +// alsoVisualizeCCB.getItems().setAll(I18N.translatedObservableList(ALSO_VISUALIZE_ITEMS_WORDS)); + + alsoVisualizeCCB.getCheckModel().getCheckedItems().addListener(alsoVisualizeListener); + + if (languageChanged) { + for (int i : checkedIndices) { + alsoVisualizeCCB.getCheckModel().check(i); + } + } + + logger.info("calculateForCB:", calculateFor.toString()); } - alsoVisualizeCCB.getCheckModel().getCheckedItems().addListener((ListChangeListener) c -> { - alsoVisualize = new ArrayList<>(); - ObservableList checkedItems = alsoVisualizeCCB.getCheckModel().getCheckedItems(); - alsoVisualize.addAll(checkedItems); - logger.info(String.format("Selected also visualize items: %s", StringUtils.join(checkedItems, ","))); - }); - alsoVisualizeCCB.getCheckModel().clearChecks(); + }; - logger.info("calculateForCB:", calculateFor.toString()); - }); + calculateForCB.valueProperty().addListener(calculateForListener); calculateForCB.getSelectionModel().select(0); // collocabilityCCB - collocabilityCCB.getItems().removeAll(); + if (collocabilityListener != null){ + collocabilityCCB.getCheckModel().getCheckedItems().removeListener(collocabilityListener); + } - collocabilityCCB.getItems().setAll(FXCollections.observableArrayList(COLLOCABILITY_ITEMS)); - collocabilityCCB.getCheckModel().getCheckedItems().addListener((ListChangeListener) c -> { - collocability = new ArrayList<>(); - ObservableList checkedItems = FXCollections.observableArrayList(); - for (String el : collocabilityCCB.getCheckModel().getCheckedItems()) { - checkedItems.add(Collocability.factory(el)); + collocabilityListener = new ListChangeListener() { + @Override + public void onChanged(Change c) { + collocability = new ArrayList<>(); + ObservableList checkedItems = FXCollections.observableArrayList(); + for (String el : collocabilityCCB.getCheckModel().getCheckedItems()) { + checkedItems.add(Collocability.factory(el)); + } + collocability.addAll(checkedItems); + logger.info(String.format("Selected collocabilities: %s", StringUtils.join(collocabilityCCB.getCheckModel().getCheckedItems(), ","))); } - collocability.addAll(checkedItems); - logger.info(String.format("Selected collocabilities: %s", StringUtils.join(collocabilityCCB.getCheckModel().getCheckedItems(), ","))); - }); + }; + collocabilityCCB.getCheckModel().clearChecks(); + collocabilityCCB.getItems().removeAll(); + collocabilityCCB.getItems().setAll(FXCollections.observableArrayList(COLLOCABILITY_ITEMS)); + + collocabilityCCB.getCheckModel().getCheckedItems().addListener(collocabilityListener); +// collocabilityCCB.getCheckModel().getCheckedItems().addListener((ListChangeListener) c -> { +// collocability = new ArrayList<>(); +// ObservableList checkedItems = FXCollections.observableArrayList(); +// for (String el : collocabilityCCB.getCheckModel().getCheckedItems()) { +// checkedItems.add(Collocability.factory(el)); +// } +// collocability.addAll(checkedItems); +// logger.info(String.format("Selected collocabilities: %s", StringUtils.join(collocabilityCCB.getCheckModel().getCheckedItems(), ","))); +// }); + // msd msdTF.focusedProperty().addListener((observable, oldValue, newValue) -> { @@ -279,7 +440,7 @@ public class StringAnalysisTabNew2 { int nOfRequiredMsdTokens = ngramValue == 0 ? 1 : ngramValue; if (msdTmp.size() != nOfRequiredMsdTokens) { - String msg = String.format(Messages.WARNING_MISMATCHED_NGRAM_AND_TOKENS_VALUES, nOfRequiredMsdTokens, msdTmp.size()); + String msg = String.format(I18N.get("message.WARNING_MISMATCHED_NGRAM_AND_TOKENS_VALUES"), nOfRequiredMsdTokens, msdTmp.size()); logAlert(msg); showAlert(Alert.AlertType.ERROR, msg); } @@ -301,22 +462,32 @@ public class StringAnalysisTabNew2 { msdTF.setText(""); msd = new ArrayList<>(); - alsoVisualizeCCB.getItems().removeAll(); - alsoVisualizeCCB.getItems().setAll(alsoVisualizeItemsLemma); - alsoVisualizeCCB.getCheckModel().getCheckedItems().addListener((ListChangeListener) c -> { - alsoVisualize = new ArrayList<>(); - ObservableList checkedItems = alsoVisualizeCCB.getCheckModel().getCheckedItems(); - alsoVisualize.addAll(checkedItems); - logger.info(String.format("Selected also visualize items: %s", StringUtils.join(checkedItems, ","))); - }); + if (alsoVisualizeListener != null){ + alsoVisualizeCCB.getCheckModel().getCheckedItems().removeListener(alsoVisualizeListener); + } + + alsoVisualizeListener = new ListChangeListener() { + @Override + public void onChanged(Change c) { + alsoVisualize = new ArrayList<>(); + ObservableList checkedItems = alsoVisualizeCCB.getCheckModel().getCheckedItems(); + alsoVisualize.addAll(checkedItems); + logger.info(String.format("Selected also visualize items: %s", StringUtils.join(checkedItems, ","))); + } + }; alsoVisualizeCCB.getCheckModel().clearChecks(); + alsoVisualizeCCB.getItems().removeAll(); + alsoVisualizeCCB.getItems().setAll(I18N.translatedObservableList(ALSO_VISUALIZE_ITEMS_LEMMA)); + + alsoVisualizeCCB.getCheckModel().getCheckedItems().addListener(alsoVisualizeListener); // taxonomy if (Tax.getCorpusTypesWithTaxonomy().contains(corpus.getCorpusType())) { - taxonomyCCB.setDisable(false); - taxonomyCCB.getItems().removeAll(); - taxonomyCCB.getItems().setAll(corpus.getTaxonomy()); - taxonomyCCB.getCheckModel().getCheckedItems().addListener(new ListChangeListener() { + if (taxonomyListener != null){ + taxonomyCCB.getCheckModel().getCheckedItems().removeListener(taxonomyListener); + } + + taxonomyListener = new ListChangeListener() { boolean changing = true; @Override @@ -343,8 +514,13 @@ public class StringAnalysisTabNew2 { logger.info(String.format("Selected taxonomy: %s", StringUtils.join(checkedItems, ","))); } } - }); + }; taxonomyCCB.getCheckModel().clearChecks(); + taxonomyCCB.setDisable(false); + taxonomyCCB.getItems().removeAll(); + taxonomyCCB.getItems().setAll(corpus.getTaxonomy()); + + taxonomyCCB.getCheckModel().getCheckedItems().addListener(taxonomyListener); } else { taxonomyCCB.setDisable(true); } @@ -373,14 +549,14 @@ public class StringAnalysisTabNew2 { String value = stringLengthTF.getText(); if (!ValidationUtil.isEmpty(value)) { if (!ValidationUtil.isNumber(value)) { - logAlert("stringlengthTf: " + WARNING_ONLY_NUMBERS_ALLOWED); - GUIController.showAlert(Alert.AlertType.ERROR, WARNING_ONLY_NUMBERS_ALLOWED); + logAlert("stringlengthTf: " + I18N.get("message.WARNING_ONLY_NUMBERS_ALLOWED")); + GUIController.showAlert(Alert.AlertType.ERROR, I18N.get("message.WARNING_ONLY_NUMBERS_ALLOWED")); } stringLength = Integer.parseInt(value); } else { - GUIController.showAlert(Alert.AlertType.ERROR, WARNING_MISSING_STRING_LENGTH); + GUIController.showAlert(Alert.AlertType.ERROR, I18N.get("message.WARNING_MISSING_STRING_LENGTH")); stringLengthTF.setText("1"); - logAlert(WARNING_MISSING_STRING_LENGTH); + logAlert(I18N.get("message.WARNING_MISSING_STRING_LENGTH")); } } }); @@ -391,8 +567,8 @@ public class StringAnalysisTabNew2 { String value = minimalOccurrencesTF.getText(); if (!ValidationUtil.isEmpty(value)) { if (!ValidationUtil.isNumber(value)) { - logAlert("minimalOccurrencesTF: " + WARNING_ONLY_NUMBERS_ALLOWED); - GUIController.showAlert(Alert.AlertType.ERROR, WARNING_ONLY_NUMBERS_ALLOWED); + logAlert("minimalOccurrencesTF: " + I18N.get("message.WARNING_ONLY_NUMBERS_ALLOWED")); + GUIController.showAlert(Alert.AlertType.ERROR, I18N.get("message.WARNING_ONLY_NUMBERS_ALLOWED")); } else { minimalOccurrences = Integer.parseInt(value); } @@ -409,8 +585,8 @@ public class StringAnalysisTabNew2 { String value = minimalTaxonomyTF.getText(); if (!ValidationUtil.isEmpty(value)) { if (!ValidationUtil.isNumber(value)) { - logAlert("minimalTaxonomyTF: " + WARNING_ONLY_NUMBERS_ALLOWED); - GUIController.showAlert(Alert.AlertType.ERROR, WARNING_ONLY_NUMBERS_ALLOWED); + logAlert("minimalTaxonomyTF: " + I18N.get("message.WARNING_ONLY_NUMBERS_ALLOWED")); + GUIController.showAlert(Alert.AlertType.ERROR, I18N.get("message.WARNING_ONLY_NUMBERS_ALLOWED")); } else { minimalTaxonomy = Integer.parseInt(value); } @@ -421,6 +597,17 @@ public class StringAnalysisTabNew2 { } }); + changeLanguageB.setOnAction(e -> { + if (I18N.getLocale() == new Locale.Builder().setLanguage("sl").setRegion("SI").build()){ + I18N.setLocale(Locale.ENGLISH); + } else { + I18N.setLocale(new Locale.Builder().setLanguage("sl").setRegion("SI").build()); + } + Messages.reload(); + Messages.updateChooseCorpusL(); + logger.info("change language"); + }); + computeNgramsB.setOnAction(e -> { compute(); logger.info("compute button"); @@ -534,6 +721,32 @@ public class StringAnalysisTabNew2 { // // } + private void manageTranslations(){ + helpH.textProperty().bind(I18N.createStringBinding("hyperlink.help")); + changeLanguageB.textProperty().bind(I18N.createStringBinding("button.language")); + computeNgramsB.textProperty().bind(I18N.createStringBinding("button.computeNgrams")); + cancel.textProperty().bind(I18N.createStringBinding("button.cancel")); + + calculateForL.textProperty().bind(I18N.createStringBinding("label.calculateFor")); + alsoVisualizeL.textProperty().bind(I18N.createStringBinding("label.alsoVisualize")); + displayTaxonomyL.textProperty().bind(I18N.createStringBinding("label.displayTaxonomy")); +// writeMsdAtTheEndL.textProperty().bind(I18N.createStringBinding("label.writeMsdAtTheEnd")); + skipValueL.textProperty().bind(I18N.createStringBinding("label.skipValue")); + slowSpeedWarning1L.textProperty().bind(I18N.createStringBinding("label.slowSpeedWarning")); + slowSpeedWarning2L.textProperty().bind(I18N.createStringBinding("label.slowSpeedWarning")); + ngramValueL.textProperty().bind(I18N.createStringBinding("label.ngramValue")); + notePunctuationsL.textProperty().bind(I18N.createStringBinding("label.notePunctuations")); + collocabilityL.textProperty().bind(I18N.createStringBinding("label.collocability")); + + dataLimitL.textProperty().bind(I18N.createStringBinding("label.dataLimit")); + msdL.textProperty().bind(I18N.createStringBinding("label.msd")); + taxonomyL.textProperty().bind(I18N.createStringBinding("label.taxonomy")); + minimalOccurrencesL.textProperty().bind(I18N.createStringBinding("label.minimalOccurrences")); + minimalTaxonomyL.textProperty().bind(I18N.createStringBinding("label.minimalTaxonomy")); + solarFilters.textProperty().bind(I18N.createStringBinding("label.solarFilters")); + + } + /** * Toggles visibility for panes which hold fields for skipgram value (not applicable when calculating for letters) etc., * sets combobox values to what is applicable ... @@ -553,36 +766,20 @@ public class StringAnalysisTabNew2 { // if (corpus.getCorpusType() == CorpusType.GOS) // calculateForCB.getItems().setAll(N_GRAM_COMPUTE_FOR_WORDS_GOS); // else - if (corpus.getCorpusType() == CorpusType.GOS) - calculateForCB.getItems().setAll(N_GRAM_COMPUTE_FOR_WORDS_GOS); - else - calculateForCB.getItems().setAll(N_GRAM_COMPUTE_FOR_WORDS); -// calculateForCB.getItems().setAll(N_GRAM_COMPUTE_FOR_WORDS); - - } else if (mode == MODE.LETTER) { - paneWords.setVisible(false); - paneLetters.setVisible(true); - calculateForCB.getItems().setAll(N_GRAM_COMPUTE_FOR_LETTERS); - - // populate with default cvv length value - if (stringLength == null) { - stringLengthTF.setText("1"); - stringLength = 1; + if (corpus.getCorpusType() == CorpusType.GOS) { + calculateForCB.itemsProperty().unbind(); + calculateForCB.itemsProperty().bind(I18N.createObjectBinding(N_GRAM_COMPUTE_FOR_WORDS_GOS)); } else { - stringLengthTF.setText(String.valueOf(stringLength)); + calculateForCB.itemsProperty().unbind(); + calculateForCB.itemsProperty().bind(I18N.createObjectBinding(N_GRAM_COMPUTE_FOR_WORDS)); } - // if calculateFor was selected for something other than a word or a lemma -> reset - if (!(calculateFor == CalculateFor.WORD || calculateFor == CalculateFor.LEMMA)) { - // if the user selected something else before selecting ngram for letters, reset that choice - calculateFor = CalculateFor.WORD; - calculateForCB.getSelectionModel().select("različnica"); - } } // override if orth mode, allow only word if (corpus.isGosOrthMode()) { - calculateForCB.getItems().setAll(N_GRAM_COMPUTE_FOR_WORDS_ORTH); + calculateForCB.itemsProperty().unbind(); + calculateForCB.itemsProperty().bind(I18N.createObjectBinding(N_GRAM_COMPUTE_FOR_WORDS_ORTH)); msdTF.setDisable(true); } else { msdTF.setDisable(false); @@ -676,9 +873,9 @@ public class StringAnalysisTabNew2 { i++; this.updateProgress(i, corpusFiles.size() * 2); if (statistic.getFilter().getCollocability().size() > 0) { - this.updateMessage(String.format(ONGOING_NOTIFICATION_ANALYZING_FILE_X_OF_Y, i, corpusFiles.size() * 2, f.getName())); + this.updateMessage(String.format(I18N.get("message.ONGOING_NOTIFICATION_ANALYZING_FILE_X_OF_Y"), i, corpusFiles.size() * 2, f.getName())); } else { - this.updateMessage(String.format(ONGOING_NOTIFICATION_ANALYZING_FILE_X_OF_Y, i, corpusFiles.size(), f.getName())); + this.updateMessage(String.format(I18N.get("message.ONGOING_NOTIFICATION_ANALYZING_FILE_X_OF_Y"), i, corpusFiles.size(), f.getName())); } } @@ -690,22 +887,21 @@ public class StringAnalysisTabNew2 { progressLabel.textProperty().bind(task.messageProperty()); task.setOnSucceeded(e -> { - System.out.print("test"); try { System.out.print(statistic); // calculate_collocabilities(statistic, statisticsOneGrams); statistic.updateCalculateCollocabilities(statisticsOneGrams); boolean successullySaved = statistic.saveResultToDisk(); if (successullySaved) { - showAlert(Alert.AlertType.INFORMATION, Messages.NOTIFICATION_ANALYSIS_COMPLETED); + showAlert(Alert.AlertType.INFORMATION, I18N.get("message.NOTIFICATION_ANALYSIS_COMPLETED")); } else { - showAlert(Alert.AlertType.INFORMATION, Messages.NOTIFICATION_ANALYSIS_COMPLETED_NO_RESULTS); + showAlert(Alert.AlertType.INFORMATION, I18N.get("message.NOTIFICATION_ANALYSIS_COMPLETED_NO_RESULTS")); } } catch (UnsupportedEncodingException e1) { - showAlert(Alert.AlertType.ERROR, ERROR_WHILE_SAVING_RESULTS_TO_CSV); + showAlert(Alert.AlertType.ERROR, I18N.get("message.ERROR_WHILE_SAVING_RESULTS_TO_CSV")); logger.error("Error while saving", e1); } catch (OutOfMemoryError e1) { - showAlert(Alert.AlertType.ERROR, ERROR_NOT_ENOUGH_MEMORY); + showAlert(Alert.AlertType.ERROR, I18N.get("message.ERROR_NOT_ENOUGH_MEMORY")); logger.error("Out of memory error", e1); } // try { @@ -731,7 +927,7 @@ public class StringAnalysisTabNew2 { }); task.setOnFailed(e -> { - showAlert(Alert.AlertType.ERROR, ERROR_WHILE_EXECUTING); + showAlert(Alert.AlertType.ERROR, I18N.get("message.ERROR_WHILE_EXECUTING")); logger.error("Error while executing", e); ngramProgressBar.progressProperty().unbind(); ngramProgressBar.setProgress(0.0); @@ -742,7 +938,7 @@ public class StringAnalysisTabNew2 { }); task.setOnCancelled(e -> { - showAlert(Alert.AlertType.INFORMATION, Messages.NOTIFICATION_ANALYSIS_CANCLED); + showAlert(Alert.AlertType.INFORMATION, I18N.get("message.NOTIFICATION_ANALYSIS_CANCELED")); ngramProgressBar.progressProperty().unbind(); ngramProgressBar.setProgress(0.0); ngramProgressBar.setStyle(Settings.FX_ACCENT_OK); @@ -778,15 +974,15 @@ public class StringAnalysisTabNew2 { readXML(f.toString(), statistic); i++; if (isCancelled()) { - updateMessage(CANCELING_NOTIFICATION); + updateMessage(I18N.get("message.CANCELING_NOTIFICATION")); break; } if (statistic.getFilter().getCollocability().size() > 0) { this.updateProgress(i, corpusFiles.size() * 2); - this.updateMessage(String.format(ONGOING_NOTIFICATION_ANALYZING_FILE_X_OF_Y, i, corpusFiles.size() * 2, f.getName())); + this.updateMessage(String.format(I18N.get("message.ONGOING_NOTIFICATION_ANALYZING_FILE_X_OF_Y"), i, corpusFiles.size() * 2, f.getName())); } else { this.updateProgress(i, corpusFiles.size()); - this.updateMessage(String.format(ONGOING_NOTIFICATION_ANALYZING_FILE_X_OF_Y, i, corpusFiles.size(), f.getName())); + this.updateMessage(String.format(I18N.get("message.ONGOING_NOTIFICATION_ANALYZING_FILE_X_OF_Y"), i, corpusFiles.size(), f.getName())); } // this.updateMessage(String.format(ONGOING_NOTIFICATION_ANALYZING_FILE_X_OF_Y, i, corpusFiles.size() * 2, f.getName())); } @@ -816,15 +1012,15 @@ public class StringAnalysisTabNew2 { // System.out.print(statistics); boolean successullySaved = statistic.saveResultToDisk(); if (successullySaved) { - showAlert(Alert.AlertType.INFORMATION, Messages.NOTIFICATION_ANALYSIS_COMPLETED); + showAlert(Alert.AlertType.INFORMATION, I18N.get("message.NOTIFICATION_ANALYSIS_COMPLETED")); } else { - showAlert(Alert.AlertType.INFORMATION, Messages.NOTIFICATION_ANALYSIS_COMPLETED_NO_RESULTS); + showAlert(Alert.AlertType.INFORMATION, I18N.get("message.NOTIFICATION_ANALYSIS_COMPLETED_NO_RESULTS")); } } catch (UnsupportedEncodingException e1) { - showAlert(Alert.AlertType.ERROR, ERROR_WHILE_SAVING_RESULTS_TO_CSV); + showAlert(Alert.AlertType.ERROR, I18N.get("message.ERROR_WHILE_SAVING_RESULTS_TO_CSV")); logger.error("Error while saving", e1); } catch (OutOfMemoryError e1) { - showAlert(Alert.AlertType.ERROR, ERROR_NOT_ENOUGH_MEMORY); + showAlert(Alert.AlertType.ERROR, I18N.get("message.ERROR_NOT_ENOUGH_MEMORY")); logger.error("Out of memory error", e1); } ngramProgressBar.progressProperty().unbind(); @@ -838,7 +1034,7 @@ public class StringAnalysisTabNew2 { }); task.setOnFailed(e -> { - showAlert(Alert.AlertType.ERROR, ERROR_WHILE_EXECUTING); + showAlert(Alert.AlertType.ERROR, I18N.get("message.ERROR_WHILE_EXECUTING")); logger.error("Error while executing", e); ngramProgressBar.progressProperty().unbind(); ngramProgressBar.setProgress(0.0); @@ -849,7 +1045,7 @@ public class StringAnalysisTabNew2 { }); task.setOnCancelled(e -> { - showAlert(Alert.AlertType.INFORMATION, Messages.NOTIFICATION_ANALYSIS_CANCLED); + showAlert(Alert.AlertType.INFORMATION, I18N.get("message.NOTIFICATION_ANALYSIS_CANCELED")); ngramProgressBar.progressProperty().unbind(); ngramProgressBar.setProgress(0.0); ngramProgressBar.setStyle(Settings.FX_ACCENT_OK); diff --git a/src/main/java/gui/WordFormationTab.java b/src/main/java/gui/WordFormationTab.java index 7c7d436..914afb1 100755 --- a/src/main/java/gui/WordFormationTab.java +++ b/src/main/java/gui/WordFormationTab.java @@ -99,8 +99,8 @@ public class WordFormationTab { String value = minimalOccurrencesTF.getText(); if (!ValidationUtil.isEmpty(value)) { if (!ValidationUtil.isNumber(value)) { - logAlert("minimalOccurrencesTF: " + WARNING_ONLY_NUMBERS_ALLOWED); - GUIController.showAlert(Alert.AlertType.ERROR, WARNING_ONLY_NUMBERS_ALLOWED); + logAlert("minimalOccurrencesTF: " + I18N.get("message.WARNING_ONLY_NUMBERS_ALLOWED")); + GUIController.showAlert(Alert.AlertType.ERROR, I18N.get("message.WARNING_ONLY_NUMBERS_ALLOWED")); } else { minimalOccurrences = Integer.parseInt(value); } @@ -117,8 +117,8 @@ public class WordFormationTab { String value = minimalTaxonomyTF.getText(); if (!ValidationUtil.isEmpty(value)) { if (!ValidationUtil.isNumber(value)) { - logAlert("minimalTaxonomyTF: " + WARNING_ONLY_NUMBERS_ALLOWED); - GUIController.showAlert(Alert.AlertType.ERROR, WARNING_ONLY_NUMBERS_ALLOWED); + logAlert("minimalTaxonomyTF: " + I18N.get("message.WARNING_ONLY_NUMBERS_ALLOWED")); + GUIController.showAlert(Alert.AlertType.ERROR, I18N.get("message.WARNING_ONLY_NUMBERS_ALLOWED")); } else { minimalTaxonomy = Integer.parseInt(value); } @@ -180,7 +180,7 @@ public class WordFormationTab { readXML(f.toString(), statistic); i++; this.updateProgress(i, corpusFiles.size()); - this.updateMessage(String.format(ONGOING_NOTIFICATION_ANALYZING_FILE_X_OF_Y, i, corpusFiles.size(), f.getName())); + this.updateMessage(String.format(I18N.get("message.ONGOING_NOTIFICATION_ANALYZING_FILE_X_OF_Y"), i, corpusFiles.size(), f.getName())); } return null; @@ -196,12 +196,12 @@ public class WordFormationTab { boolean successullySaved = statistic.recalculateAndSaveResultToDisk(); if (successullySaved) { - showAlert(Alert.AlertType.INFORMATION, Messages.NOTIFICATION_ANALYSIS_COMPLETED); + showAlert(Alert.AlertType.INFORMATION, I18N.get("message.NOTIFICATION_ANALYSIS_COMPLETED")); } else { - showAlert(Alert.AlertType.INFORMATION, Messages.NOTIFICATION_ANALYSIS_COMPLETED_NO_RESULTS); + showAlert(Alert.AlertType.INFORMATION, I18N.get("message.NOTIFICATION_ANALYSIS_COMPLETED_NO_RESULTS")); } } catch (UnsupportedEncodingException e1) { - showAlert(Alert.AlertType.ERROR, ERROR_WHILE_SAVING_RESULTS_TO_CSV); + showAlert(Alert.AlertType.ERROR, I18N.get("message.ERROR_WHILE_SAVING_RESULTS_TO_CSV")); logger.error("Error while saving", e1); } @@ -212,7 +212,7 @@ public class WordFormationTab { }); task.setOnFailed(e -> { - showAlert(Alert.AlertType.ERROR, ERROR_WHILE_EXECUTING); + showAlert(Alert.AlertType.ERROR, I18N.get("message.ERROR_WHILE_EXECUTING")); logger.error("Error while executing", e); ngramProgressBar.progressProperty().unbind(); ngramProgressBar.setProgress(0.0); diff --git a/src/main/java/gui/WordLevelTab.java b/src/main/java/gui/WordLevelTab.java index 9b24956..8b38cd0 100755 --- a/src/main/java/gui/WordLevelTab.java +++ b/src/main/java/gui/WordLevelTab.java @@ -2,6 +2,8 @@ package gui; import data.*; import javafx.application.HostServices; +import javafx.beans.value.ChangeListener; +import javafx.beans.value.ObservableValue; import javafx.collections.FXCollections; import javafx.collections.ListChangeListener; import javafx.collections.ObservableList; @@ -33,9 +35,52 @@ public class WordLevelTab { @FXML public Label selectedFiltersLabel; + @FXML public Label solarFilters; + @FXML + public Label calculateForL; + + @FXML + public Label alsoVisualizeL; + + @FXML + public Label displayTaxonomyL; + + @FXML + public Label lengthSearchL; + + @FXML + public Label prefixLengthL; + + @FXML + public Label suffixLengthL; + + @FXML + public Label listSearchL; + + @FXML + public Label prefixListL; + + @FXML + public Label suffixListL; + + @FXML + public Label dataLimitL; + + @FXML + public Label msdL; + + @FXML + public Label taxonomyL; + + @FXML + public Label minimalOccurrencesL; + + @FXML + public Label minimalTaxonomyL; + @FXML private TextField msdTF; private ArrayList msd; @@ -88,6 +133,9 @@ public class WordLevelTab { @FXML private Button computeNgramsB; + @FXML + private Button changeLanguageB; + @FXML private Button cancel; @@ -111,17 +159,38 @@ public class WordLevelTab { private Filter filter; private boolean useDb; private HostServices hostService; - - private static final ObservableList N_GRAM_COMPUTE_FOR_WORDS = FXCollections.observableArrayList("lema", "različnica"); - private static final ObservableList N_GRAM_COMPUTE_FOR_LETTERS = FXCollections.observableArrayList("lema", "različnica"); - private static final ObservableList N_GRAM_COMPUTE_FOR_WORDS_ORTH = FXCollections.observableArrayList("različnica"); - private static final ObservableList N_GRAM_COMPUTE_FOR_WORDS_GOS = FXCollections.observableArrayList("lema", "različnica", "normalizirana različnica"); - private static final ObservableList alsoVisualizeItemsLemma = FXCollections.observableArrayList("besedna vrsta", "oblikoskladenjska oznaka"); - private static final ObservableList alsoVisualizeItemsWord = FXCollections.observableArrayList("lema", "besedna vrsta", "oblikoskladenjska oznaka"); - private static final ObservableList alsoVisualizeItemsWordGos = FXCollections.observableArrayList("lema", "besedna vrsta", "oblikoskladenjska oznaka", "normalizirana različnica"); - private static final ObservableList alsoVisualizeItemsNormalizedWord = FXCollections.observableArrayList("lema", "besedna vrsta", "oblikoskladenjska oznaka"); - private static final ObservableList alsoVisualizeItemsMsd = FXCollections.observableArrayList("besedna vrsta"); - private static final ObservableList alsoVisualizeItemsEmpty = FXCollections.observableArrayList(); + private ListChangeListener taxonomyListener; + private ListChangeListener alsoVisualizeListener; + private ChangeListener calculateForListener; + +// private static final ObservableList N_GRAM_COMPUTE_FOR_WORDS = FXCollections.observableArrayList("lema", "različnica"); +// private static final ObservableList N_GRAM_COMPUTE_FOR_LETTERS = FXCollections.observableArrayList("lema", "različnica"); + private static final String [] N_GRAM_COMPUTE_FOR_WORDS_ARRAY = {"calculateFor.WORD", "calculateFor.LEMMA"}; + private static final ArrayList N_GRAM_COMPUTE_FOR_WORDS = new ArrayList<>(Arrays.asList(N_GRAM_COMPUTE_FOR_WORDS_ARRAY)); +// private static final ObservableList N_GRAM_COMPUTE_FOR_WORDS_ORTH = FXCollections.observableArrayList("različnica"); + private static final String [] N_GRAM_COMPUTE_FOR_WORDS_ORTH_ARRAY = {"calculateFor.WORD"}; + private static final ArrayList N_GRAM_COMPUTE_FOR_WORDS_ORTH = new ArrayList<>(Arrays.asList(N_GRAM_COMPUTE_FOR_WORDS_ORTH_ARRAY)); +// private static final ObservableList N_GRAM_COMPUTE_FOR_WORDS_GOS = FXCollections.observableArrayList("lema", "različnica", "normalizirana različnica"); + private static final String [] N_GRAM_COMPUTE_FOR_WORDS_GOS_ARRAY = {"calculateFor.WORD", "calculateFor.LEMMA", "calculateFor.NORMALIZED_WORD"}; + private static final ArrayList N_GRAM_COMPUTE_FOR_WORDS_GOS = new ArrayList<>(Arrays.asList(N_GRAM_COMPUTE_FOR_WORDS_GOS_ARRAY)); +// private static final ObservableList alsoVisualizeItemsLemma = FXCollections.observableArrayList("besedna vrsta", "oblikoskladenjska oznaka"); + private static final String [] ALSO_VISUALIZE_ITEMS_LEMMA_ARRAY = {"calculateFor.WORD_TYPE", "calculateFor.MORPHOSYNTACTIC_SPECS"}; + private static final ArrayList ALSO_VISUALIZE_ITEMS_LEMMA = new ArrayList<>(Arrays.asList(ALSO_VISUALIZE_ITEMS_LEMMA_ARRAY)); +// private static final ObservableList alsoVisualizeItemsWord = FXCollections.observableArrayList("lema", "besedna vrsta", "oblikoskladenjska oznaka"); + private static final String [] ALSO_VISUALIZE_ITEMS_WORDS_ARRAY = {"calculateFor.LEMMA", "calculateFor.WORD_TYPE", "calculateFor.MORPHOSYNTACTIC_SPECS"}; + private static final ArrayList ALSO_VISUALIZE_ITEMS_WORDS = new ArrayList<>(Arrays.asList(ALSO_VISUALIZE_ITEMS_WORDS_ARRAY)); +// private static final ObservableList alsoVisualizeItemsWordGos = FXCollections.observableArrayList("lema", "besedna vrsta", "oblikoskladenjska oznaka", "normalizirana različnica"); + private static final String [] ALSO_VISUALIZE_ITEMS_WORDS_GOS_ARRAY = {"calculateFor.LEMMA", "calculateFor.WORD_TYPE", "calculateFor.MORPHOSYNTACTIC_SPECS", "calculateFor.NORMALIZED_WORD"}; + private static final ArrayList ALSO_VISUALIZE_ITEMS_WORDS_GOS = new ArrayList<>(Arrays.asList(ALSO_VISUALIZE_ITEMS_WORDS_GOS_ARRAY)); +// private static final ObservableList alsoVisualizeItemsNormalizedWord = FXCollections.observableArrayList("lema", "besedna vrsta", "oblikoskladenjska oznaka"); + private static final String [] ALSO_VISUALIZE_ITEMS_NORMALIZED_WORDS_ARRAY = {"calculateFor.LEMMA", "calculateFor.WORD_TYPE", "calculateFor.MORPHOSYNTACTIC_SPECS"}; + private static final ArrayList ALSO_VISUALIZE_ITEMS_NORMALIZED_WORDS = new ArrayList<>(Arrays.asList(ALSO_VISUALIZE_ITEMS_NORMALIZED_WORDS_ARRAY)); +// private static final ObservableList alsoVisualizeItemsMsd = FXCollections.observableArrayList("besedna vrsta"); + private static final String [] ALSO_VISUALIZE_ITEMS_MSD_ARRAY = {"calculateFor.WORD_TYPE"}; + private static final ArrayList ALSO_VISUALIZE_ITEMS_MSD = new ArrayList<>(Arrays.asList(ALSO_VISUALIZE_ITEMS_MSD_ARRAY)); +// private static final ObservableList alsoVisualizeItemsEmpty = FXCollections.observableArrayList(); + private static final String [] ALSO_VISUALIZE_ITEMS_EMPTY_ARRAY = {}; + private static final ArrayList ALSO_VISUALIZE_ITEMS_EMPTY = new ArrayList<>(Arrays.asList(ALSO_VISUALIZE_ITEMS_EMPTY_ARRAY)); // TODO: pass observables for taxonomy based on header scan // after header scan @@ -133,33 +202,72 @@ public class WordLevelTab { wordLevelAnalysisTabPane.getStylesheets().add("style.css"); wordLevelAnalysisTabPane.getStyleClass().add("root"); + manageTranslations(); + currentMode = MODE.WORD; toggleMode(currentMode); AtomicBoolean writeMsdAtTheEndEnableCalculateFor = new AtomicBoolean(false); + if (calculateForListener != null){ + calculateForCB.valueProperty().removeListener(calculateForListener); + } + // calculateForCB - calculateForCB.valueProperty().addListener((observable, oldValue, newValue) -> { - calculateFor = CalculateFor.factory(newValue); - - alsoVisualizeCCB.getItems().removeAll(); - if(newValue.equals("lema")){ - alsoVisualizeCCB.getItems().setAll(alsoVisualizeItemsLemma); - } else if(newValue.equals("različnica")) { - if (corpus.getCorpusType() == CorpusType.GOS) - alsoVisualizeCCB.getItems().setAll(alsoVisualizeItemsWordGos); - else - alsoVisualizeCCB.getItems().setAll(alsoVisualizeItemsWord); - } else if(newValue.equals("normalizirana različnica")) { - alsoVisualizeCCB.getItems().setAll(alsoVisualizeItemsNormalizedWord); - } else if(newValue.equals("oblikoskladenjska oznaka")) { + + calculateForListener = new ChangeListener() { + boolean ignoreCode = false; + @Override + public void changed(ObservableValue observable, String oldValue, String newValue) { + if (ignoreCode){ + return; + } + boolean languageChanged = newValue == null; + ArrayList checkedIndices = new ArrayList<>(); + checkedIndices.addAll(alsoVisualizeCCB.getCheckModel().getCheckedIndices()); + if (languageChanged) { + ignoreCode = true; + if (corpus.getCorpusType() == CorpusType.GOS) { + newValue = I18N.getTranslatedValue(oldValue, N_GRAM_COMPUTE_FOR_WORDS_GOS); + calculateForCB.getSelectionModel().select(newValue); + } else { + newValue = I18N.getTranslatedValue(oldValue, N_GRAM_COMPUTE_FOR_WORDS); + calculateForCB.getSelectionModel().select(newValue); + } + + // override if orth mode, allow only word + if (corpus.isGosOrthMode()) { + newValue = I18N.getTranslatedValue(oldValue, N_GRAM_COMPUTE_FOR_WORDS_ORTH); + calculateForCB.getSelectionModel().select(newValue); + } + ignoreCode = false; + } + + calculateFor = CalculateFor.factory(newValue); + + if (alsoVisualizeListener != null) { + alsoVisualizeCCB.getCheckModel().getCheckedItems().removeListener(alsoVisualizeListener); + } + + alsoVisualizeCCB.getCheckModel().clearChecks(); + alsoVisualizeCCB.getItems().removeAll(); + if (newValue.equals(CalculateFor.LEMMA.toString())) { + alsoVisualizeCCB.getItems().setAll(I18N.translatedObservableList(ALSO_VISUALIZE_ITEMS_LEMMA)); + } else if (newValue.equals(CalculateFor.WORD.toString())) { + if (corpus.getCorpusType() == CorpusType.GOS) + alsoVisualizeCCB.getItems().setAll(I18N.translatedObservableList(ALSO_VISUALIZE_ITEMS_WORDS_GOS)); + else + alsoVisualizeCCB.getItems().setAll(I18N.translatedObservableList(ALSO_VISUALIZE_ITEMS_WORDS)); + } else if (newValue.equals(CalculateFor.NORMALIZED_WORD.toString())) { + alsoVisualizeCCB.getItems().setAll(I18N.translatedObservableList(ALSO_VISUALIZE_ITEMS_NORMALIZED_WORDS)); + } else if (newValue.equals(CalculateFor.MORPHOSYNTACTIC_SPECS.toString())) { // writeMsdAtTheEndEnableCalculateFor.set(true); // writeMsdAtTheEndChB.setDisable(false); - alsoVisualizeCCB.getItems().setAll(alsoVisualizeItemsMsd); - }else { + alsoVisualizeCCB.getItems().setAll(I18N.translatedObservableList(ALSO_VISUALIZE_ITEMS_MSD)); + } else { - alsoVisualizeCCB.getItems().setAll(alsoVisualizeItemsEmpty); - } + alsoVisualizeCCB.getItems().setAll(I18N.translatedObservableList(ALSO_VISUALIZE_ITEMS_EMPTY)); + } // if (!newValue.equals("oblikoskladenjska oznaka")){ // writeMsdAtTheEnd = false; @@ -168,16 +276,33 @@ public class WordLevelTab { // writeMsdAtTheEndEnableCalculateFor.set(false); // } - alsoVisualizeCCB.getCheckModel().getCheckedItems().addListener((ListChangeListener) c -> { - alsoVisualize = new ArrayList<>(); - ObservableList checkedItems = alsoVisualizeCCB.getCheckModel().getCheckedItems(); - alsoVisualize.addAll(checkedItems); - logger.info(String.format("Selected also visualize items: %s", StringUtils.join(checkedItems, ","))); - }); - alsoVisualizeCCB.getCheckModel().clearChecks(); + alsoVisualizeListener = new ListChangeListener() { + @Override + public void onChanged(Change c) { + alsoVisualize = new ArrayList<>(); + ObservableList checkedItems = alsoVisualizeCCB.getCheckModel().getCheckedItems(); + alsoVisualize.addAll(checkedItems); + logger.info(String.format("Selected also visualize items: %s", StringUtils.join(checkedItems, ","))); + } + }; - logger.info("calculateForCB:", calculateFor.toString()); - }); +// alsoVisualizeCCB.getCheckModel().clearChecks(); +// alsoVisualizeCCB.getItems().removeAll(); +// alsoVisualizeCCB.getItems().setAll(I18N.translatedObservableList(ALSO_VISUALIZE_ITEMS_LEMMA)); + + alsoVisualizeCCB.getCheckModel().getCheckedItems().addListener(alsoVisualizeListener); + + if (languageChanged) { + for (int i : checkedIndices) { + alsoVisualizeCCB.getCheckModel().check(i); + } + } + + logger.info("calculateForCB:", calculateFor.toString()); + } + }; + + calculateForCB.valueProperty().addListener(calculateForListener); calculateForCB.getSelectionModel().select(0); @@ -302,7 +427,7 @@ public class WordLevelTab { int nOfRequiredMsdTokens = 1; if (msdTmp.size() != nOfRequiredMsdTokens) { - String msg = String.format(Messages.WARNING_MISMATCHED_NGRAM_AND_TOKENS_VALUES, nOfRequiredMsdTokens, msdTmp.size()); + String msg = String.format(I18N.get("message.WARNING_MISMATCHED_NGRAM_AND_TOKENS_VALUES"), nOfRequiredMsdTokens, msdTmp.size()); logAlert(msg); showAlert(Alert.AlertType.ERROR, msg); } @@ -324,29 +449,34 @@ public class WordLevelTab { msdTF.setText(""); msd = new ArrayList<>(); - alsoVisualizeCCB.getItems().removeAll(); - alsoVisualizeCCB.getItems().setAll(alsoVisualizeItemsLemma); - alsoVisualizeCCB.getCheckModel().getCheckedItems().addListener((ListChangeListener) c -> { - alsoVisualize = new ArrayList<>(); - ObservableList checkedItems = alsoVisualizeCCB.getCheckModel().getCheckedItems(); - alsoVisualize.addAll(checkedItems); -// if (checkedItems.contains("oblikoskladenjska oznaka") || writeMsdAtTheEndEnableCalculateFor.get()){ -// writeMsdAtTheEndChB.setDisable(false); -// } else { -// writeMsdAtTheEnd = false; -// writeMsdAtTheEndChB.setSelected(false); -// writeMsdAtTheEndChB.setDisable(true); -// } - logger.info(String.format("Selected also visualize items: %s", StringUtils.join(checkedItems, ","))); - }); + if (alsoVisualizeListener != null){ + alsoVisualizeCCB.getCheckModel().getCheckedItems().removeListener(alsoVisualizeListener); + } + + alsoVisualizeListener = new ListChangeListener() { + @Override + public void onChanged(Change c) { + alsoVisualize = new ArrayList<>(); + ObservableList checkedItems = alsoVisualizeCCB.getCheckModel().getCheckedItems(); + alsoVisualize.addAll(checkedItems); + + logger.info(String.format("Selected also visualize items: %s", StringUtils.join(checkedItems, ","))); + } + }; + alsoVisualizeCCB.getCheckModel().clearChecks(); + alsoVisualizeCCB.getItems().removeAll(); + alsoVisualizeCCB.getItems().setAll(I18N.translatedObservableList(ALSO_VISUALIZE_ITEMS_LEMMA)); + + alsoVisualizeCCB.getCheckModel().getCheckedItems().addListener(alsoVisualizeListener); // taxonomy if (Tax.getCorpusTypesWithTaxonomy().contains(corpus.getCorpusType())) { - taxonomyCCB.setDisable(false); - taxonomyCCB.getItems().removeAll(); - taxonomyCCB.getItems().setAll(corpus.getTaxonomy()); - taxonomyCCB.getCheckModel().getCheckedItems().addListener(new ListChangeListener() { + if (taxonomyListener != null){ + taxonomyCCB.getCheckModel().getCheckedItems().removeListener(taxonomyListener); + } + + taxonomyListener = new ListChangeListener() { boolean changing = true; @Override @@ -373,8 +503,14 @@ public class WordLevelTab { logger.info(String.format("Selected taxonomy: %s", StringUtils.join(checkedItems, ","))); } } - }); + }; + taxonomyCCB.getCheckModel().clearChecks(); + taxonomyCCB.setDisable(false); + taxonomyCCB.getItems().removeAll(); + taxonomyCCB.getItems().setAll(corpus.getTaxonomy()); + + taxonomyCCB.getCheckModel().getCheckedItems().addListener(taxonomyListener); } else { taxonomyCCB.setDisable(true); } @@ -396,7 +532,7 @@ public class WordLevelTab { } logger.info("display taxonomy: ", displayTaxonomy); }); - displayTaxonomyChB.setTooltip(new Tooltip(TOOLTIP_readDisplayTaxonomyChB)); + displayTaxonomyChB.setTooltip(new Tooltip(I18N.get("message.TOOLTIP_readDisplayTaxonomyChB"))); } else { displayTaxonomyChB.setDisable(true); } @@ -425,8 +561,8 @@ public class WordLevelTab { String value = minimalOccurrencesTF.getText(); if (!ValidationUtil.isEmpty(value)) { if (!ValidationUtil.isNumber(value)) { - logAlert("minimalOccurrencesTF: " + WARNING_ONLY_NUMBERS_ALLOWED); - GUIController.showAlert(Alert.AlertType.ERROR, WARNING_ONLY_NUMBERS_ALLOWED); + logAlert("minimalOccurrencesTF: " + I18N.get("message.WARNING_ONLY_NUMBERS_ALLOWED")); + GUIController.showAlert(Alert.AlertType.ERROR, I18N.get("message.WARNING_ONLY_NUMBERS_ALLOWED")); } else { minimalOccurrences = Integer.parseInt(value); } @@ -443,8 +579,8 @@ public class WordLevelTab { String value = minimalTaxonomyTF.getText(); if (!ValidationUtil.isEmpty(value)) { if (!ValidationUtil.isNumber(value)) { - logAlert("minimalTaxonomyTF: " + WARNING_ONLY_NUMBERS_ALLOWED); - GUIController.showAlert(Alert.AlertType.ERROR, WARNING_ONLY_NUMBERS_ALLOWED); + logAlert("minimalTaxonomyTF: " + I18N.get("message.WARNING_ONLY_NUMBERS_ALLOWED")); + GUIController.showAlert(Alert.AlertType.ERROR, I18N.get("message.WARNING_ONLY_NUMBERS_ALLOWED")); } else { minimalTaxonomy = Integer.parseInt(value); } @@ -455,6 +591,17 @@ public class WordLevelTab { } }); + changeLanguageB.setOnAction(e -> { + if (I18N.getLocale() == new Locale.Builder().setLanguage("sl").setRegion("SI").build()){ + I18N.setLocale(Locale.ENGLISH); + } else { + I18N.setLocale(new Locale.Builder().setLanguage("sl").setRegion("SI").build()); + } + Messages.reload(); + Messages.updateChooseCorpusL(); + logger.info("change language"); + }); + computeNgramsB.setDisable(true); computeNgramsB.setOnAction(e -> { @@ -545,6 +692,32 @@ public class WordLevelTab { // // } + private void manageTranslations(){ + helpH.textProperty().bind(I18N.createStringBinding("hyperlink.help")); + changeLanguageB.textProperty().bind(I18N.createStringBinding("button.language")); + computeNgramsB.textProperty().bind(I18N.createStringBinding("button.computeNgrams")); + cancel.textProperty().bind(I18N.createStringBinding("button.cancel")); + + calculateForL.textProperty().bind(I18N.createStringBinding("label.calculateFor")); + alsoVisualizeL.textProperty().bind(I18N.createStringBinding("label.alsoVisualize")); + displayTaxonomyL.textProperty().bind(I18N.createStringBinding("label.displayTaxonomy")); + + lengthSearchL.textProperty().bind(I18N.createStringBinding("label.lengthSearch")); + prefixLengthL.textProperty().bind(I18N.createStringBinding("label.prefixLength")); + suffixLengthL.textProperty().bind(I18N.createStringBinding("label.suffixLength")); + listSearchL.textProperty().bind(I18N.createStringBinding("label.listSearch")); + prefixListL.textProperty().bind(I18N.createStringBinding("label.prefixList")); + suffixListL.textProperty().bind(I18N.createStringBinding("label.suffixList")); + + dataLimitL.textProperty().bind(I18N.createStringBinding("label.dataLimit")); + msdL.textProperty().bind(I18N.createStringBinding("label.msd")); + taxonomyL.textProperty().bind(I18N.createStringBinding("label.taxonomy")); + minimalOccurrencesL.textProperty().bind(I18N.createStringBinding("label.minimalOccurrences")); + minimalTaxonomyL.textProperty().bind(I18N.createStringBinding("label.minimalTaxonomy")); + solarFilters.textProperty().bind(I18N.createStringBinding("label.solarFilters")); + + } + /** * Toggles visibility for panes which hold fields for skipgram value (not applicable when calculating for letters) etc., * sets combobox values to what is applicable ... @@ -559,25 +732,22 @@ public class WordLevelTab { logger.info("mode: ", mode.toString()); if (mode == MODE.WORD) { - if (corpus.getCorpusType() == CorpusType.GOS) - calculateForCB.getItems().setAll(N_GRAM_COMPUTE_FOR_WORDS_GOS); - else - calculateForCB.getItems().setAll(N_GRAM_COMPUTE_FOR_WORDS); - } else if (mode == MODE.LETTER) { - calculateForCB.getItems().setAll(N_GRAM_COMPUTE_FOR_LETTERS); - - - // if calculateFor was selected for something other than a word or a lemma -> reset - if (!(calculateFor == CalculateFor.WORD || calculateFor == CalculateFor.LEMMA)) { - // if the user selected something else before selecting ngram for letters, reset that choice - calculateFor = CalculateFor.WORD; - calculateForCB.getSelectionModel().select("različnica"); + if (corpus.getCorpusType() == CorpusType.GOS) { + calculateForCB.itemsProperty().unbind(); + calculateForCB.itemsProperty().bind(I18N.createObjectBinding(N_GRAM_COMPUTE_FOR_WORDS_GOS)); +// calculateForCB.getItems().setAll(N_GRAM_COMPUTE_FOR_WORDS_GOS); + } else { + calculateForCB.itemsProperty().unbind(); + calculateForCB.itemsProperty().bind(I18N.createObjectBinding(N_GRAM_COMPUTE_FOR_WORDS)); +// calculateForCB.getItems().setAll(N_GRAM_COMPUTE_FOR_WORDS); } } // override if orth mode, allow only word if (corpus.isGosOrthMode()) { - calculateForCB.getItems().setAll(N_GRAM_COMPUTE_FOR_WORDS_ORTH); + calculateForCB.itemsProperty().unbind(); + calculateForCB.itemsProperty().bind(I18N.createObjectBinding(N_GRAM_COMPUTE_FOR_WORDS_ORTH)); +// calculateForCB.getItems().setAll(N_GRAM_COMPUTE_FOR_WORDS_ORTH); msdTF.setDisable(true); } else { msdTF.setDisable(false); @@ -668,11 +838,11 @@ public class WordLevelTab { readXML(f.toString(), statistic); i++; if (isCancelled()) { - updateMessage(CANCELING_NOTIFICATION); + updateMessage(I18N.get("message.CANCELING_NOTIFICATION")); break; } this.updateProgress(i, corpusFiles.size()); - this.updateMessage(String.format(ONGOING_NOTIFICATION_ANALYZING_FILE_X_OF_Y, i, corpusFiles.size(), f.getName())); + this.updateMessage(String.format(I18N.get("message.ONGOING_NOTIFICATION_ANALYZING_FILE_X_OF_Y"), i, corpusFiles.size(), f.getName())); } return null; @@ -686,12 +856,12 @@ public class WordLevelTab { try { boolean successullySaved = statistic.saveResultToDisk(); if (successullySaved) { - showAlert(Alert.AlertType.INFORMATION, Messages.NOTIFICATION_ANALYSIS_COMPLETED); + showAlert(Alert.AlertType.INFORMATION, I18N.get("message.NOTIFICATION_ANALYSIS_COMPLETED")); } else { - showAlert(Alert.AlertType.INFORMATION, Messages.NOTIFICATION_ANALYSIS_COMPLETED_NO_RESULTS); + showAlert(Alert.AlertType.INFORMATION, I18N.get("message.NOTIFICATION_ANALYSIS_COMPLETED_NO_RESULTS")); } } catch (UnsupportedEncodingException e1) { - showAlert(Alert.AlertType.ERROR, ERROR_WHILE_SAVING_RESULTS_TO_CSV); + showAlert(Alert.AlertType.ERROR, I18N.get("message.ERROR_WHILE_SAVING_RESULTS_TO_CSV")); logger.error("Error while saving", e1); } @@ -703,7 +873,7 @@ public class WordLevelTab { }); task.setOnFailed(e -> { - showAlert(Alert.AlertType.ERROR, ERROR_WHILE_EXECUTING); + showAlert(Alert.AlertType.ERROR, I18N.get("message.ERROR_WHILE_EXECUTING")); logger.error("Error while executing", e); ngramProgressBar.progressProperty().unbind(); ngramProgressBar.setProgress(0.0); @@ -714,7 +884,7 @@ public class WordLevelTab { }); task.setOnCancelled(e -> { - showAlert(Alert.AlertType.INFORMATION, Messages.NOTIFICATION_ANALYSIS_CANCLED); + showAlert(Alert.AlertType.INFORMATION, I18N.get("message.NOTIFICATION_ANALYSIS_CANCELED")); ngramProgressBar.progressProperty().unbind(); ngramProgressBar.setProgress(0.0); ngramProgressBar.setStyle(Settings.FX_ACCENT_OK); diff --git a/src/main/java/util/Export.java b/src/main/java/util/Export.java index d68a2b9..fafac1b 100755 --- a/src/main/java/util/Export.java +++ b/src/main/java/util/Export.java @@ -10,6 +10,7 @@ import java.util.concurrent.ConcurrentMap; import java.util.concurrent.atomic.AtomicLong; import data.*; +import gui.I18N; import gui.ValidationUtil; import org.apache.commons.csv.CSVFormat; import org.apache.commons.csv.CSVPrinter; @@ -90,23 +91,23 @@ public class Export { //CSV file header if (!ValidationUtil.isEmpty(filter.getSkipValue()) && filter.getSkipValue() > 0) { - FILE_HEADER_AL.add("Izpuščene besede"); + FILE_HEADER_AL.add(I18N.get("exportTable.skippedWords")); } FILE_HEADER_AL.add(filter.getCalculateFor().toHeaderString(filter.getNgramValue())); if (filter.getCalculateFor().equals(CalculateFor.LEMMA)) { if(filter.getNgramValue() == 0) { - FILE_HEADER_AL.add("Črkovni niz (male črke)"); + FILE_HEADER_AL.add(I18N.get("exportTable.lettersSmall")); } else if(filter.getNgramValue() >= 1) { - FILE_HEADER_AL.add("Lema (male črke)"); + FILE_HEADER_AL.add(I18N.get("exportTable.wordsSmall")); } } if (filter.getSuffixLength() != null && filter.getSuffixList() != null && filter.getPrefixLength() != null && filter.getPrefixList() != null) { if (filter.getPrefixLength() > 0 || filter.getPrefixList().size() > 0) { - FILE_HEADER_AL.add("Začetni del besede"); + FILE_HEADER_AL.add(I18N.get("exportTable.wordBeginning")); } - FILE_HEADER_AL.add("Preostali del besede"); + FILE_HEADER_AL.add(I18N.get("exportTable.wordRest")); if (filter.getSuffixLength() > 0 || filter.getSuffixList().size() > 0) { - FILE_HEADER_AL.add("Končni del besede"); + FILE_HEADER_AL.add(I18N.get("exportTable.wordEnding")); } } @@ -117,14 +118,14 @@ public class Export { for (CalculateFor otherKey : filter.getMultipleKeys()) { FILE_HEADER_AL.add(otherKey.toHeaderString(filter.getNgramValue())); if (otherKey.equals(CalculateFor.LEMMA)) - FILE_HEADER_AL.add("Lema (male črke)"); + FILE_HEADER_AL.add(I18N.get("exportTable.wordsSmall")); } FILE_HEADER_AL.add(filter.getCalculateFor().totalAbsoluteFrequencyString(filter.getNgramValue())); FILE_HEADER_AL.add(filter.getCalculateFor().shareOfTotalString(filter.getNgramValue())); - FILE_HEADER_AL.add("Skupna relativna pogostost (na milijon pojavitev)"); + FILE_HEADER_AL.add(I18N.get("exportTable.totalRelativeFrequency")); if (filter.getCollocability().size() > 0){ for (Collocability c : filter.getCollocability()) { @@ -134,9 +135,9 @@ public class Export { for (Taxonomy key : taxonomyResults.keySet()) { if(!key.equals(Taxonomy.TOTAL) && num_taxonomy_frequencies.containsKey(key) && num_taxonomy_frequencies.get(key).longValue() > 0) { - FILE_HEADER_AL.add("Absolutna pogostost [" + key.toString() + "]"); - FILE_HEADER_AL.add("Delež [" + key.toString() + "]"); - FILE_HEADER_AL.add("Relativna pogostost [" + key.toString() + "]"); + FILE_HEADER_AL.add(I18N.get("exportTable.absoluteFrequency") + " [" + key.toString() + "]"); + FILE_HEADER_AL.add(I18N.get("exportTable.percentage") + " [" + key.toString() + "]"); + FILE_HEADER_AL.add(I18N.get("exportTable.relativeFrequency") + " [" + key.toString() + "]"); } } @@ -150,7 +151,7 @@ public class Export { } } for(int i = 0; i < maxMsdLength; i++){ - FILE_HEADER_AL.add("msd" + String.format("%02d", i + 1)); + FILE_HEADER_AL.add(I18N.get("exportTable.msd") + String.format("%02d", i + 1)); } } diff --git a/src/main/resources/gui/CharacterAnalysisTab.fxml b/src/main/resources/gui/CharacterAnalysisTab.fxml index 03b50e4..e3fa9b2 100755 --- a/src/main/resources/gui/CharacterAnalysisTab.fxml +++ b/src/main/resources/gui/CharacterAnalysisTab.fxml @@ -18,18 +18,18 @@ -