Skip to content

Commit c399248

Browse files
committed
Add shitty translation autocomplete
1 parent fe97bde commit c399248

4 files changed

Lines changed: 161 additions & 4 deletions

File tree

src/ladysnake/translatorhelper/application/TranslationHelper.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import javafx.scene.control.TableCell;
1414
import javafx.scene.control.TableColumn;
1515
import javafx.scene.control.TableView;
16+
import javafx.scene.control.Tooltip;
1617
import javafx.scene.control.cell.MapValueFactory;
1718
import javafx.scene.control.cell.TextFieldTableCell;
1819
import javafx.scene.layout.BorderPane;
@@ -21,7 +22,6 @@
2122
import javafx.util.Callback;
2223
import javafx.util.StringConverter;
2324
import ladysnake.translatorhelper.controller.ControllerFx;
24-
import ladysnake.translatorhelper.model.Data;
2525

2626

2727
public class TranslationHelper extends Application {
@@ -31,6 +31,7 @@ public class TranslationHelper extends Application {
3131
private BorderPane borderPane;
3232
private ContextMenu contextMenu;
3333
private TableView<Map<String, String>> trTable;
34+
private Button wimpTrnslBtn;
3435

3536
@Override
3637
public void start(Stage primaryStage) {
@@ -64,6 +65,15 @@ public void start(Stage primaryStage) {
6465
savebtn.setOnAction(control::onSave);
6566
grid.add(savebtn, 2, 0);
6667
}
68+
69+
{
70+
wimpTrnslBtn = new Button();
71+
wimpTrnslBtn.setText("Joker");
72+
wimpTrnslBtn.setOnAction(control::onJoker);
73+
Tooltip.install(wimpTrnslBtn, new Tooltip("Uses Google Translate to complete the cell based on the english value."));
74+
wimpTrnslBtn.setDisable(true);
75+
grid.add(wimpTrnslBtn, 3, 0);
76+
}
6777

6878
{ // context menu (right click)
6979
contextMenu = new ContextMenu();
@@ -87,6 +97,7 @@ public void generateTable(ObservableList<Map<String, String>> allTranslations, S
8797
trTable = new TableView<Map<String, String>>(allTranslations);
8898
trTable.setEditable(true);
8999
trTable.setContextMenu(contextMenu);
100+
wimpTrnslBtn.setDisable(false);
90101

91102
Callback<TableColumn<Map<String, String>, String>, TableCell<Map<String, String>, String>>
92103
cellFactoryForMap = p -> new TextFieldTableCell<Map<String, String>, String>(new StringConverter<String>() {

src/ladysnake/translatorhelper/controller/ControllerFx.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
package ladysnake.translatorhelper.controller;
22

33
import java.io.File;
4-
import java.util.HashMap;
54
import java.util.Map;
65
import java.util.regex.Pattern;
76

87
import javafx.event.ActionEvent;
8+
import javafx.scene.control.Alert;
9+
import javafx.scene.control.Alert.AlertType;
910
import javafx.scene.control.Dialog;
1011
import javafx.scene.control.TableColumn.CellEditEvent;
1112
import javafx.scene.control.TextInputDialog;
@@ -49,6 +50,19 @@ public void onSave(ActionEvent event) {
4950
data.save(langFolder);
5051
}
5152

53+
public void onJoker(ActionEvent event) {
54+
try {
55+
data.generateTranslation(view.getTable().getSelectionModel().getSelectedCells().get(0).getTableColumn().getText(),
56+
view.getTable().getSelectionModel().getSelectedIndex());
57+
view.getTable().refresh();
58+
} catch (NullPointerException | IndexOutOfBoundsException e) {
59+
Alert d = new Alert(AlertType.WARNING);
60+
d.setTitle("No cell selected");
61+
d.setContentText("Please select a cell to autocomplete");
62+
d.showAndWait();
63+
}
64+
}
65+
5266
public void onEditCommitKey(CellEditEvent<Map<String, String>, String> event) {
5367
data.updateTranslationKey(event.getOldValue(), event.getNewValue(), event.getTablePosition().getRow());
5468
}

src/ladysnake/translatorhelper/model/Data.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import java.io.File;
66
import java.io.IOException;
77
import java.nio.file.Files;
8-
import java.util.Comparator;
98
import java.util.HashMap;
109
import java.util.Map;
1110
import java.util.TreeMap;
@@ -14,20 +13,21 @@
1413

1514
import javafx.collections.FXCollections;
1615
import javafx.collections.ObservableList;
17-
import javafx.scene.shape.Path;
1816

1917
public class Data {
2018

2119
public static final String TRANSLATION_KEY = "translation key";
2220

2321
private static final Pattern TRANSLATION_PATTERN = Pattern.compile("(.*?)=(.*)");
22+
private static final Pattern languageISO = Pattern.compile("^(\\w*?)_(.*)");
2423

2524
private Map<String, Boolean> editedFiles;
2625
private ObservableList<Map<String, String>> translationList;
2726

2827
public Data() {
2928
editedFiles = new HashMap<>();
3029
translationList = FXCollections.observableArrayList();
30+
new TranslateAPI();
3131
}
3232

3333
public void load(File[] langFiles) {
@@ -103,6 +103,7 @@ public void updateTranslationKey(String oldKey, String newKey, int selectedRow)
103103
}
104104

105105
public void updateTranslation(int selectedRow, String newValue, String lang) {
106+
System.out.println(selectedRow + " " + newValue + " " + lang);
106107
editedFiles.put(lang, true);
107108
translationList.get(selectedRow).put(lang, newValue);
108109
}
@@ -118,4 +119,12 @@ public void addTranslation(String key) {
118119
translationList.sort((o1, o2) -> o1.get(TRANSLATION_KEY).compareTo(o2.get(TRANSLATION_KEY)));
119120
}
120121

122+
public void generateTranslation(String lang, int selectedRow) {
123+
Matcher m1 = languageISO.matcher(lang);
124+
if(!m1.matches())
125+
return;
126+
String badTransl = TranslateAPI.translate(translationList.get(selectedRow).get("en_us.lang"), m1.group(1));
127+
updateTranslation(selectedRow, badTransl, lang);
128+
}
129+
121130
}
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
package ladysnake.translatorhelper.model;
2+
3+
import java.io.BufferedReader;
4+
import java.io.IOException;
5+
import java.io.InputStreamReader;
6+
import java.net.URL;
7+
import java.net.URLConnection;
8+
import java.net.URLEncoder;
9+
import java.util.regex.Matcher;
10+
import java.util.regex.Pattern;
11+
12+
/**
13+
* This class allows simple translation operations
14+
* @author Fabien
15+
*
16+
*/
17+
public class TranslateAPI {
18+
19+
private static final Pattern resultParser = Pattern.compile(".*?\"(.*?)\".*");
20+
private static final String userAgent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/53.0.2785.143 Chrome/53.0.2785.143 Safari/537.36";
21+
22+
23+
public static String translate(String sourceText, String targetLang) {
24+
return translate(sourceText, targetLang, "en");
25+
}
26+
27+
public static String translate(String sourceText, String targetLang, String sourceLang) {
28+
String ret = "";
29+
try {
30+
String uriString = "https://translate.googleapis.com/translate_a/single?client=gtx&sl="
31+
+ sourceLang + "&tl=" + targetLang + "&dt=t&q=" + URLEncoder.encode(sourceText, "UTF-8");
32+
System.out.println(uriString);
33+
URL url = new URL(uriString);
34+
URLConnection conn = url.openConnection();
35+
conn.setRequestProperty("User-Agent", userAgent);
36+
try(BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()))) {
37+
String res = "";
38+
while(reader.ready())
39+
res += reader.readLine();
40+
Matcher m3 = resultParser.matcher(res);
41+
if(m3.matches())
42+
ret = m3.group(1);
43+
} catch (IOException e) {
44+
System.err.println("Failed to retrieve answer. Maybe you are offline ?");
45+
e.printStackTrace();
46+
}
47+
} catch (IOException e) {
48+
e.printStackTrace();
49+
}
50+
return ret;
51+
}
52+
53+
/*
54+
"af_za", "Afrikaans",
55+
"ar_sa", "Arabic",
56+
"en_us", "English",
57+
"az_az", "Azerbaijani",
58+
"bg_bg", "Bulgarian",
59+
"ca_es", "Catalan",
60+
"cs_cz", "Czech",
61+
"da_dk", "Denmark",
62+
"de_de", "German",
63+
"el_gr", "Greek",
64+
"en_au", "English",
65+
"en_ca", "English",
66+
"en_gb", "English",
67+
"en_nz", "English",
68+
"en_us", "English",
69+
"eo_uy", "Esperanto",
70+
"es_ar", "Spanish",
71+
"es_es", "Spanish",
72+
"es_mx", "Spanish",
73+
"es_uy", "Spanish",
74+
"es_ve", "Spanish",
75+
"et_ee", "Estonian",
76+
"fa_ir", "Persian",
77+
"fi_fi", "Finnish",
78+
"fil_ph", "Filipino",
79+
"fr_ca", "French",
80+
"fr_fr", "French",
81+
"fy_nl", "frysian",
82+
"ga_ie", "Irish",
83+
"gl_es", "Galician",
84+
"hr_hr", "Croatian",
85+
"hu_hu", "Hungarian",
86+
"id_id", "Indonesian",
87+
"is_is", "Icelandic",
88+
"it_it", "Italian",
89+
"ja_jp", "Japanese",
90+
"ka_ge", "Georgian",
91+
"ko_kr", "Korean",
92+
"la_va", "Latin",
93+
"lb_lu", "Luxembourgish",
94+
"li_li", "Limburgish",
95+
"lt_lt", "Lithuanian",
96+
"lv_lv", "Latvian",
97+
"mi_nz", "Maori",
98+
"mk_mk", "Macedonian",
99+
"mn_mn", "Mongolian",
100+
"ms_my", "Malay",
101+
"mt_mt", "Maltese",
102+
"nb_no", "Norwegian",
103+
"nl_nl", "Dutch",
104+
"pl_pl", "Polish",
105+
"pt_br", "Portuguese",
106+
"pt_pt", "Portuguese",
107+
"ro_ro", "Romanian",
108+
"ru_ru", "Russian",
109+
"sk_sk", "Slovak",
110+
"sl_sl", "Slovenian",
111+
"so_so", "Somali",
112+
"sq_al", "Albanian",
113+
"sr_sp", "Serbian",
114+
"sv_se", "Swedish",
115+
"th_th", "Thai",
116+
"tr_tr", "Turkish",
117+
"uk_ua", "Ukrainian",
118+
"vi_vn", "Vietnamese",
119+
"zh_cn", "Chinese Simplified",
120+
"zh_tw", "Chinese Traditional"
121+
*/
122+
123+
}

0 commit comments

Comments
 (0)