From bba39a5337de39f14cff1923a2886ab753f2a4a1 Mon Sep 17 00:00:00 2001 From: cyian-1756 Date: Thu, 10 May 2018 12:42:15 -0400 Subject: [PATCH 01/14] Added getResourceBundle func --- .../java/com/rarchives/ripme/utils/Utils.java | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/rarchives/ripme/utils/Utils.java b/src/main/java/com/rarchives/ripme/utils/Utils.java index 9517c528..156c6ac0 100644 --- a/src/main/java/com/rarchives/ripme/utils/Utils.java +++ b/src/main/java/com/rarchives/ripme/utils/Utils.java @@ -1,9 +1,6 @@ package com.rarchives.ripme.utils; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.UnsupportedEncodingException; +import java.io.*; import java.lang.reflect.Constructor; import java.net.URISyntaxException; import java.net.URL; @@ -579,4 +576,14 @@ public class Utils { } return domainCookies; } + + public static ResourceBundle getResourceBundle() { + try { + ResourceBundle rb = ResourceBundle.getBundle("LabelsBundle", Locale.getDefault()); + return rb; + } catch (MissingResourceException e) { + ResourceBundle rb = ResourceBundle.getBundle("LabelsBundle", Locale.ROOT); + return rb; + } + } } From c51710b8335d4a14f6ec6d379b1d461ef60a0b33 Mon Sep 17 00:00:00 2001 From: cyian-1756 Date: Thu, 10 May 2018 12:43:01 -0400 Subject: [PATCH 02/14] Started using resourceBUndle --- .../com/rarchives/ripme/ui/MainWindow.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/rarchives/ripme/ui/MainWindow.java b/src/main/java/com/rarchives/ripme/ui/MainWindow.java index 016d25f3..f76964bf 100644 --- a/src/main/java/com/rarchives/ripme/ui/MainWindow.java +++ b/src/main/java/com/rarchives/ripme/ui/MainWindow.java @@ -16,9 +16,7 @@ import java.net.URL; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.Collections; -import java.util.Date; -import java.util.Enumeration; +import java.util.*; import java.util.List; import javax.imageio.ImageIO; @@ -138,6 +136,8 @@ public final class MainWindow implements Runnable, RipStatusHandler { private static AbstractRipper ripper; + private ResourceBundle rb = Utils.getResourceBundle(); + private static void addCheckboxListener(JCheckBox checkBox, String configString) { checkBox.addActionListener(arg0 -> { Utils.setConfigBoolean(configString, checkBox.isSelected()); @@ -462,17 +462,17 @@ public final class MainWindow implements Runnable, RipStatusHandler { configUpdateButton = new JButton("Check for updates"); configUpdateLabel = new JLabel("Current version: " + UpdateUtils.getThisJarVersion(), JLabel.RIGHT); JLabel configThreadsLabel = new JLabel("Maximum download threads:", JLabel.RIGHT); - JLabel configTimeoutLabel = new JLabel("Timeout (in milliseconds):", JLabel.RIGHT); - JLabel configRetriesLabel = new JLabel("Retry download count:", JLabel.RIGHT); + JLabel configTimeoutLabel = new JLabel(rb.getString("timeout.mill"), JLabel.RIGHT); + JLabel configRetriesLabel = new JLabel(rb.getString("retry.download.count"), JLabel.RIGHT); configThreadsText = new JTextField(Integer.toString(Utils.getConfigInteger("threads.size", 3))); configTimeoutText = new JTextField(Integer.toString(Utils.getConfigInteger("download.timeout", 60000))); configRetriesText = new JTextField(Integer.toString(Utils.getConfigInteger("download.retries", 3))); - configOverwriteCheckbox = addNewCheckbox("Overwrite existing files?", "file.overwrite", false); - configAutoupdateCheckbox = addNewCheckbox("Auto-update?", "auto.update", true); - configPlaySound = addNewCheckbox("Sound when rip completes", "play.sound", false); + configOverwriteCheckbox = addNewCheckbox(rb.getString("overwrite.existing.files"), "file.overwrite", false); + configAutoupdateCheckbox = addNewCheckbox(rb.getString("auto.update"), "auto.update", true); + configPlaySound = addNewCheckbox(rb.getString("sound.when.rip.completes"), "play.sound", false); configShowPopup = addNewCheckbox("Notification when rip starts", "download.show_popup", false); - configSaveOrderCheckbox = addNewCheckbox("Preserve order", "download.save_order", true); - configSaveLogs = addNewCheckbox("Save logs", "log.save", false); + configSaveOrderCheckbox = addNewCheckbox(rb.getString("preserve.order"), "download.save_order", true); + configSaveLogs = addNewCheckbox(rb.getString("save.logs"), "log.save", false); configSaveURLsOnly = addNewCheckbox("Save URLs only", "urls_only.save", false); configSaveAlbumTitles = addNewCheckbox("Save album titles", "album_titles.save", true); configClipboardAutorip = addNewCheckbox("Autorip from Clipboard", "clipboard.autorip", false); From fe503e71b89b19929e21f53f90f69aad8311a039 Mon Sep 17 00:00:00 2001 From: cyian-1756 Date: Thu, 10 May 2018 12:44:18 -0400 Subject: [PATCH 03/14] Started building ResourceBundle --- src/main/resources/LabelsBundle.properties | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/main/resources/LabelsBundle.properties diff --git a/src/main/resources/LabelsBundle.properties b/src/main/resources/LabelsBundle.properties new file mode 100644 index 00000000..ba884030 --- /dev/null +++ b/src/main/resources/LabelsBundle.properties @@ -0,0 +1,18 @@ +Log = Log +History = History +created = created +modified = modified +Queue = Queue +Configuration = Configuration + +# Keys for the Configuration menu + +current.version = Current version: +auto.update = Auto-update? +max.download.threads = Maximum download threads +timeout.mill = Timeout (in milliseconds): +retry.download.count = Retry download count +overwrite.existing.files = Overwrite existing files? +sound.when.rip.completes = Sound when rip completes +preserve.order = Preserve order +save.logs = Save logs \ No newline at end of file From c4ce162b481440825ffcf662207e499ce9cf59dd Mon Sep 17 00:00:00 2001 From: cyian-1756 Date: Thu, 10 May 2018 13:22:27 -0400 Subject: [PATCH 04/14] Extended RB --- src/main/resources/LabelsBundle.properties | 23 ++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/main/resources/LabelsBundle.properties b/src/main/resources/LabelsBundle.properties index ba884030..3a42ab0c 100644 --- a/src/main/resources/LabelsBundle.properties +++ b/src/main/resources/LabelsBundle.properties @@ -7,7 +7,8 @@ Configuration = Configuration # Keys for the Configuration menu -current.version = Current version: +current.version = Current version +check.for.updates = Check for updates auto.update = Auto-update? max.download.threads = Maximum download threads timeout.mill = Timeout (in milliseconds): @@ -15,4 +16,22 @@ retry.download.count = Retry download count overwrite.existing.files = Overwrite existing files? sound.when.rip.completes = Sound when rip completes preserve.order = Preserve order -save.logs = Save logs \ No newline at end of file +save.logs = Save logs +notification.when.rip.starts = Notification when rip starts +save.urls.only = Save URLs only +save.album.titles = Save album titles +autorip.from.clipboard = Autorip from Clipboard +save.descriptions = Save descriptions +prefer.mp4.over.gif = Prefer MP4 over GIF +restore.window.position = Restore window position +remember.url.history = Remember URL history +loading.history.from = Loading history from + +# Misc UI keys + +loading.history.from.configuration = Loading history from configuration +interrupted.while.waiting.to.rip.next.album = Interrupted while waiting to rip next album +inactive = Inactive +re-rip.checked = Re-rip Checked +remove = Remove +clear = Clear \ No newline at end of file From dc9f7ea33ee72c3fcf4cdef6114e39fedaea5fa5 Mon Sep 17 00:00:00 2001 From: cyian-1756 Date: Thu, 10 May 2018 13:24:14 -0400 Subject: [PATCH 05/14] Now using RB for more UI elements --- .../com/rarchives/ripme/ui/MainWindow.java | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/rarchives/ripme/ui/MainWindow.java b/src/main/java/com/rarchives/ripme/ui/MainWindow.java index f76964bf..f360351a 100644 --- a/src/main/java/com/rarchives/ripme/ui/MainWindow.java +++ b/src/main/java/com/rarchives/ripme/ui/MainWindow.java @@ -289,7 +289,7 @@ public final class MainWindow implements Runnable, RipStatusHandler { gbc.gridx = 3; ripPanel.add(stopButton, gbc); gbc.weightx = 1; - statusLabel = new JLabel("Inactive"); + statusLabel = new JLabel(rb.getString("inactive")); statusLabel.setHorizontalAlignment(JLabel.CENTER); openButton = new JButton(); openButton.setVisible(false); @@ -402,9 +402,9 @@ public final class MainWindow implements Runnable, RipStatusHandler { historyTable.getColumnModel().getColumn(i).setPreferredWidth(width); } JScrollPane historyTableScrollPane = new JScrollPane(historyTable); - historyButtonRemove = new JButton("Remove"); - historyButtonClear = new JButton("Clear"); - historyButtonRerip = new JButton("Re-rip Checked"); + historyButtonRemove = new JButton(rb.getString("remove")); + historyButtonClear = new JButton(rb.getString("clear")); + historyButtonRerip = new JButton(rb.getString("re-rip.checked")); gbc.gridx = 0; // History List Panel JPanel historyTablePanel = new JPanel(new GridBagLayout()); @@ -459,9 +459,9 @@ public final class MainWindow implements Runnable, RipStatusHandler { configurationPanel.setBorder(emptyBorder); configurationPanel.setVisible(false); // TODO Configuration components - configUpdateButton = new JButton("Check for updates"); - configUpdateLabel = new JLabel("Current version: " + UpdateUtils.getThisJarVersion(), JLabel.RIGHT); - JLabel configThreadsLabel = new JLabel("Maximum download threads:", JLabel.RIGHT); + configUpdateButton = new JButton(rb.getString("check.for.updates")); + configUpdateLabel = new JLabel( rb.getString("current.version") + ": " + UpdateUtils.getThisJarVersion(), JLabel.RIGHT); + JLabel configThreadsLabel = new JLabel(rb.getString("max.download.threads") + ":", JLabel.RIGHT); JLabel configTimeoutLabel = new JLabel(rb.getString("timeout.mill"), JLabel.RIGHT); JLabel configRetriesLabel = new JLabel(rb.getString("retry.download.count"), JLabel.RIGHT); configThreadsText = new JTextField(Integer.toString(Utils.getConfigInteger("threads.size", 3))); @@ -470,16 +470,16 @@ public final class MainWindow implements Runnable, RipStatusHandler { configOverwriteCheckbox = addNewCheckbox(rb.getString("overwrite.existing.files"), "file.overwrite", false); configAutoupdateCheckbox = addNewCheckbox(rb.getString("auto.update"), "auto.update", true); configPlaySound = addNewCheckbox(rb.getString("sound.when.rip.completes"), "play.sound", false); - configShowPopup = addNewCheckbox("Notification when rip starts", "download.show_popup", false); + configShowPopup = addNewCheckbox(rb.getString("notification.when.rip.starts"), "download.show_popup", false); configSaveOrderCheckbox = addNewCheckbox(rb.getString("preserve.order"), "download.save_order", true); configSaveLogs = addNewCheckbox(rb.getString("save.logs"), "log.save", false); - configSaveURLsOnly = addNewCheckbox("Save URLs only", "urls_only.save", false); - configSaveAlbumTitles = addNewCheckbox("Save album titles", "album_titles.save", true); - configClipboardAutorip = addNewCheckbox("Autorip from Clipboard", "clipboard.autorip", false); - configSaveDescriptions = addNewCheckbox("Save descriptions", "descriptions.save", true); - configPreferMp4 = addNewCheckbox("Prefer MP4 over GIF","prefer.mp4", false); - configWindowPosition = addNewCheckbox("Restore window position", "window.position", true); - configURLHistoryCheckbox = addNewCheckbox("Remember URL history", "remember.url_history", true); + configSaveURLsOnly = addNewCheckbox(rb.getString("save.urls.only"), "urls_only.save", false); + configSaveAlbumTitles = addNewCheckbox(rb.getString("save.album.titles"), "album_titles.save", true); + configClipboardAutorip = addNewCheckbox(rb.getString("autorip.from.clipboard"), "clipboard.autorip", false); + configSaveDescriptions = addNewCheckbox(rb.getString("save.descriptions"), "descriptions.save", true); + configPreferMp4 = addNewCheckbox(rb.getString("prefer.mp4.over.gif"),"prefer.mp4", false); + configWindowPosition = addNewCheckbox(rb.getString("restore.window.position"), "window.position", true); + configURLHistoryCheckbox = addNewCheckbox(rb.getString("remember.url.history"), "remember.url_history", true); configLogLevelCombobox = new JComboBox(new String[] {"Log level: Error", "Log level: Warn", "Log level: Info", "Log level: Debug"}); configLogLevelCombobox.setSelectedItem(Utils.getConfigString("log.level", "Log level: Debug")); @@ -966,7 +966,7 @@ public final class MainWindow implements Runnable, RipStatusHandler { HISTORY.clear(); if (historyFile.exists()) { try { - logger.info("Loading history from " + historyFile.getCanonicalPath()); + logger.info(rb.getString("loading.history.from") + " " + historyFile.getCanonicalPath()); HISTORY.fromFile(historyFile.getCanonicalPath()); } catch (IOException e) { logger.error("Failed to load history from file " + historyFile, e); @@ -979,7 +979,7 @@ public final class MainWindow implements Runnable, RipStatusHandler { JOptionPane.ERROR_MESSAGE); } } else { - logger.info("Loading history from configuration"); + logger.info(rb.getString("loading.history.from.configuration")); HISTORY.fromList(Utils.getConfigList("download.history")); if (HISTORY.toList().size() == 0) { // Loaded from config, still no entries. @@ -1035,7 +1035,7 @@ public final class MainWindow implements Runnable, RipStatusHandler { try { Thread.sleep(500); } catch (InterruptedException ie) { - logger.error("Interrupted while waiting to rip next album", ie); + logger.error(rb.getString("interrupted.while.waiting.to.rip.next.album"), ie); } ripNextAlbum(); } else { From 4a160deaa5ffaf4247b07845fb1ef7fc4ac69135 Mon Sep 17 00:00:00 2001 From: cyian-1756 Date: Sat, 12 May 2018 03:00:25 -0400 Subject: [PATCH 06/14] Now uses translation for more strings --- .../com/rarchives/ripme/ui/MainWindow.java | 35 +++++++++---------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/rarchives/ripme/ui/MainWindow.java b/src/main/java/com/rarchives/ripme/ui/MainWindow.java index f360351a..95961f44 100644 --- a/src/main/java/com/rarchives/ripme/ui/MainWindow.java +++ b/src/main/java/com/rarchives/ripme/ui/MainWindow.java @@ -138,6 +138,15 @@ public final class MainWindow implements Runnable, RipStatusHandler { private ResourceBundle rb = Utils.getResourceBundle(); + private void updateQueueLabel() { + if (queueListModel.size() > 0) { + optionQueue.setText( rb.getString("Queue") + " (" + queueListModel.size() + ")"); + } else { + optionQueue.setText(rb.getString("Queue")); + } + } + + private static void addCheckboxListener(JCheckBox checkBox, String configString) { checkBox.addActionListener(arg0 -> { Utils.setConfigBoolean(configString, checkBox.isSelected()); @@ -307,10 +316,10 @@ public final class MainWindow implements Runnable, RipStatusHandler { JPanel optionsPanel = new JPanel(new GridBagLayout()); optionsPanel.setBorder(emptyBorder); - optionLog = new JButton("Log"); - optionHistory = new JButton("History"); - optionQueue = new JButton("Queue"); - optionConfiguration = new JButton("Configuration"); + optionLog = new JButton(rb.getString("Log")); + optionHistory = new JButton(rb.getString("History")); + optionQueue = new JButton(rb.getString("Queue")); + optionConfiguration = new JButton(rb.getString("Configuration")); optionLog.setFont(optionLog.getFont().deriveFont(Font.PLAIN)); optionHistory.setFont(optionLog.getFont().deriveFont(Font.PLAIN)); optionQueue.setFont(optionLog.getFont().deriveFont(Font.PLAIN)); @@ -440,11 +449,7 @@ public final class MainWindow implements Runnable, RipStatusHandler { for (String item : Utils.getConfigList("queue")) { queueListModel.addElement(item); } - if (queueListModel.size() > 0) { - optionQueue.setText("Queue (" + queueListModel.size() + ")"); - } else { - optionQueue.setText("Queue"); - } + updateQueueLabel(); gbc.gridx = 0; JPanel queueListPanel = new JPanel(new GridBagLayout()); gbc.fill = GridBagConstraints.BOTH; @@ -785,11 +790,7 @@ public final class MainWindow implements Runnable, RipStatusHandler { queueListModel.addListDataListener(new ListDataListener() { @Override public void intervalAdded(ListDataEvent arg0) { - if (queueListModel.size() > 0) { - optionQueue.setText("Queue (" + queueListModel.size() + ")"); - } else { - optionQueue.setText("Queue"); - } + updateQueueLabel(); if (!isRipping) { ripNextAlbum(); } @@ -1025,11 +1026,7 @@ public final class MainWindow implements Runnable, RipStatusHandler { return; } String nextAlbum = (String) queueListModel.remove(0); - if (queueListModel.isEmpty()) { - optionQueue.setText("Queue"); - } else { - optionQueue.setText("Queue (" + queueListModel.size() + ")"); - } + updateQueueLabel(); Thread t = ripAlbum(nextAlbum); if (t == null) { try { From c1dfb1e5d8f9028e52b7c3d8d44fda4d7d455eef Mon Sep 17 00:00:00 2001 From: cyian-1756 Date: Sat, 12 May 2018 03:01:01 -0400 Subject: [PATCH 07/14] Added spainish UI translation --- .../resources/LabelsBundle_es_ES.properties | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 src/main/resources/LabelsBundle_es_ES.properties diff --git a/src/main/resources/LabelsBundle_es_ES.properties b/src/main/resources/LabelsBundle_es_ES.properties new file mode 100644 index 00000000..a1aa5a4a --- /dev/null +++ b/src/main/resources/LabelsBundle_es_ES.properties @@ -0,0 +1,37 @@ +Log = Log +History = Historia +created = creado +modified = modificado +Queue = Cola +Configuration = Configuracion + +# Keys for the Configuration menu + +current.version = Version Actual +check.for.updates = Buscar actualizaciones +auto.update = Auto-actualizar? +max.download.threads = Maximos procesos de descarga +timeout.mill = Timeout (in milliseconds): +retry.download.count = Numero de reintentos de descarga +overwrite.existing.files = Sobreescribir archivos existentes? +sound.when.rip.completes = Sonar cuando el Rip termina +preserve.order = Mantener orden +save.logs = Guardar logs +notification.when.rip.starts = Notificar cuando el Rip comienza +save.urls.only = Guardar solamente URLs +save.album.titles = Guardar titulos de albunes +autorip.from.clipboard = Autorip desde Portapapeles +save.descriptions = Guardar descripciones +prefer.mp4.over.gif = Preferir MP4 sobre GIF +restore.window.position = Restaurar posicion de ventana +remember.url.history = Recordar historia URL +loading.history.from = Cargando historia desde + +# Misc UI keys + +loading.history.from.configuration = Cargando historia desde la configuracion +interrupted.while.waiting.to.rip.next.album = Interrumpido esperando el Rip del proximo album +inactive = Inactivo +re-rip.checked = Re-rip marcado +remove = Quitar +clear = Limpiar \ No newline at end of file From 89119d48f916f41ed8e87b6a0f0570445c40ea40 Mon Sep 17 00:00:00 2001 From: TheRec Date: Sat, 12 May 2018 13:00:54 +0200 Subject: [PATCH 08/14] Added French (Switzerland) translation. --- .../resources/LabelsBundle_fr_CH.properties | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 src/main/resources/LabelsBundle_fr_CH.properties diff --git a/src/main/resources/LabelsBundle_fr_CH.properties b/src/main/resources/LabelsBundle_fr_CH.properties new file mode 100644 index 00000000..2b568891 --- /dev/null +++ b/src/main/resources/LabelsBundle_fr_CH.properties @@ -0,0 +1,37 @@ +Log = Journal +History = Historique +created = créé le +modified = modifié le +Queue = File d'attente +Configuration = Configuration + +# Keys for the Configuration menu + +current.version = Version actuelle +check.for.updates = Vérifier mises à jour +auto.update = Mises à jour automatiques? +max.download.threads = Maximum download threads +timeout.mill = Délai d'expiration (en millisecondes): +retry.download.count = Nombre d'essais téléchargement +overwrite.existing.files = Remplacer fichiers existants ? +sound.when.rip.completes = Son lorsque le rip est terminé +preserve.order = Conserver l'ordre +save.logs = Enregistrer journaux +notification.when.rip.starts = Notification lorsqu'un rip commence +save.urls.only = Enregistrer URL uniquement +save.album.titles = Enregistrer titres d'album +autorip.from.clipboard = Autorip depuis presse-papier +save.descriptions = Enregistrer descriptions +prefer.mp4.over.gif = Préférer MP4 à GIF +restore.window.position = Restaurer la position de la fenêtre +remember.url.history = Se souvenir de l'historique des URL +loading.history.from = Charger l'historique depuis + +# Misc UI keys + +loading.history.from.configuration = Charger l'historique depuis la configuration +interrupted.while.waiting.to.rip.next.album = Interrompu lors de l'attente pour ripper le prochain album +inactive = Inactif +re-rip.checked = Re-rip vérifié +remove = Enlever +clear = Effacer \ No newline at end of file From 3061125b5ba4fd2954d91da0abfa81a7add0ec27 Mon Sep 17 00:00:00 2001 From: TheRec Date: Sat, 12 May 2018 13:10:47 +0200 Subject: [PATCH 09/14] Added missing translation to French (Switzerland) --- src/main/resources/LabelsBundle_fr_CH.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/LabelsBundle_fr_CH.properties b/src/main/resources/LabelsBundle_fr_CH.properties index 2b568891..e2cedff6 100644 --- a/src/main/resources/LabelsBundle_fr_CH.properties +++ b/src/main/resources/LabelsBundle_fr_CH.properties @@ -10,7 +10,7 @@ Configuration = Configuration current.version = Version actuelle check.for.updates = Vérifier mises à jour auto.update = Mises à jour automatiques? -max.download.threads = Maximum download threads +max.download.threads = Nombre de téléchargements parallèles maximum timeout.mill = Délai d'expiration (en millisecondes): retry.download.count = Nombre d'essais téléchargement overwrite.existing.files = Remplacer fichiers existants ? From def01bfb45fc47e94cdc95fe8ceb882c4f5454ec Mon Sep 17 00:00:00 2001 From: cyian-1756 Date: Sat, 12 May 2018 10:49:31 -0400 Subject: [PATCH 10/14] Added German translation --- .../rarchives/ripme/utils/UTF8Control.java | 44 +++++++++++++++++++ .../java/com/rarchives/ripme/utils/Utils.java | 2 +- .../resources/LabelsBundle_de_DE.properties | 38 ++++++++++++++++ 3 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/rarchives/ripme/utils/UTF8Control.java create mode 100644 src/main/resources/LabelsBundle_de_DE.properties diff --git a/src/main/java/com/rarchives/ripme/utils/UTF8Control.java b/src/main/java/com/rarchives/ripme/utils/UTF8Control.java new file mode 100644 index 00000000..2441ed7c --- /dev/null +++ b/src/main/java/com/rarchives/ripme/utils/UTF8Control.java @@ -0,0 +1,44 @@ +package com.rarchives.ripme.utils; + +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.URL; +import java.net.URLConnection; +import java.util.Locale; +import java.util.PropertyResourceBundle; +import java.util.ResourceBundle; + +public class UTF8Control extends ResourceBundle.Control { + public ResourceBundle newBundle + (String baseName, Locale locale, String format, ClassLoader loader, boolean reload) + throws IllegalAccessException, InstantiationException, IOException + { + // The below is a copy of the default implementation. + String bundleName = toBundleName(baseName, locale); + String resourceName = toResourceName(bundleName, "properties"); + ResourceBundle bundle = null; + InputStream stream = null; + if (reload) { + URL url = loader.getResource(resourceName); + if (url != null) { + URLConnection connection = url.openConnection(); + if (connection != null) { + connection.setUseCaches(false); + stream = connection.getInputStream(); + } + } + } else { + stream = loader.getResourceAsStream(resourceName); + } + if (stream != null) { + try { + // Only this line is changed to make it to read properties files as UTF-8. + bundle = new PropertyResourceBundle(new InputStreamReader(stream, "UTF-8")); + } finally { + stream.close(); + } + } + return bundle; + } +} \ No newline at end of file diff --git a/src/main/java/com/rarchives/ripme/utils/Utils.java b/src/main/java/com/rarchives/ripme/utils/Utils.java index 156c6ac0..e6617f46 100644 --- a/src/main/java/com/rarchives/ripme/utils/Utils.java +++ b/src/main/java/com/rarchives/ripme/utils/Utils.java @@ -579,7 +579,7 @@ public class Utils { public static ResourceBundle getResourceBundle() { try { - ResourceBundle rb = ResourceBundle.getBundle("LabelsBundle", Locale.getDefault()); + ResourceBundle rb = ResourceBundle.getBundle("LabelsBundle", Locale.getDefault(), new UTF8Control()); return rb; } catch (MissingResourceException e) { ResourceBundle rb = ResourceBundle.getBundle("LabelsBundle", Locale.ROOT); diff --git a/src/main/resources/LabelsBundle_de_DE.properties b/src/main/resources/LabelsBundle_de_DE.properties new file mode 100644 index 00000000..da1fc8e2 --- /dev/null +++ b/src/main/resources/LabelsBundle_de_DE.properties @@ -0,0 +1,38 @@ +Log = Log +History = Verlauf +created = erstellt +modified = geändert +Queue = Queue +Configuration = Konfiguration + +# Keys for the Configuration menu + +current.version = Aktuelle Version +check.for.updates = Suche nach Aktualisierungen +auto.update = Automatisch Aktualisieren? +max.download.threads = Maximum download threads +timeout.mill = Timeout (in milliseconds): +retry.download.count = Anzahl der Downloadversuche +overwrite.existing.files = Ãœberschreibe bereits existierende Dateien? +sound.when.rip.completes = Ton abspielen bei fertigem Download +preserve.order = Reihenfolge beibehalten +save.logs = Speichere Logs +notification.when.rip.starts = Benachrichtigung wenn Download startet +save.urls.only = Speicher nur URLs +save.album.titles = Speichere Albumtitels +autorip.from.clipboard = Automatisch Downloaden von der Zwischenablage +save.descriptions = Speichere Beschreibungen +prefer.mp4.over.gif = Bevorzuge MP4 über GIF +restore.window.position = Wieder herstellen der Fensterposition +remember.url.history = Erinnere URL Verlauf +loading.history.from = Lade Verlauf von + +# Misc UI keys + +loading.history.from.configuration = Lade Verlauf aus Konfiguration +interrupted.while.waiting.to.rip.next.album = Unterbrochen während Download des nächsten Albums +inactive = Inaktiv +re-rip.checked = Re-rip Ãœberprüft +remove = Entfernen +clear = Leeren + From 1fe3f10be72e85406ad7620591f43ce954d12b31 Mon Sep 17 00:00:00 2001 From: cyian-1756 Date: Sat, 12 May 2018 10:54:15 -0400 Subject: [PATCH 11/14] Added comment showing where the code is from --- src/main/java/com/rarchives/ripme/utils/UTF8Control.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/rarchives/ripme/utils/UTF8Control.java b/src/main/java/com/rarchives/ripme/utils/UTF8Control.java index 2441ed7c..6cd81bbb 100644 --- a/src/main/java/com/rarchives/ripme/utils/UTF8Control.java +++ b/src/main/java/com/rarchives/ripme/utils/UTF8Control.java @@ -9,6 +9,8 @@ import java.util.Locale; import java.util.PropertyResourceBundle; import java.util.ResourceBundle; +// Code taken from https://stackoverflow.com/questions/4659929/how-to-use-utf-8-in-resource-properties-with-resourcebundle/4660195#4660195 + public class UTF8Control extends ResourceBundle.Control { public ResourceBundle newBundle (String baseName, Locale locale, String format, ClassLoader loader, boolean reload) From ee27d69280c14844cefbafe27616a8e6d1aa3948 Mon Sep 17 00:00:00 2001 From: Jason <37483675+jasonpw@users.noreply.github.com> Date: Sat, 12 May 2018 17:25:01 +0200 Subject: [PATCH 12/14] Portuguese from Portugal translation I decided to help with the portuguese translation, I hope it's just as accurate as the english version! --- .../resources/LabelsBundle_pt_PT.properties | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 src/main/resources/LabelsBundle_pt_PT.properties diff --git a/src/main/resources/LabelsBundle_pt_PT.properties b/src/main/resources/LabelsBundle_pt_PT.properties new file mode 100644 index 00000000..61581728 --- /dev/null +++ b/src/main/resources/LabelsBundle_pt_PT.properties @@ -0,0 +1,37 @@ +Log = Registo +History = Histórico +created = criado +modified = modificado +Queue = Fila +Configuration = Configuração + +# Keys for the Configuration menu + +current.version = Versão atual +check.for.updates = Verificar atualizações +auto.update = Atualização automática? +max.download.threads = Número máximo de processos de transferência +timeout.mill = Timeout (em milissegundos): +retry.download.count = Número de novas tentativas de transferência +overwrite.existing.files = Sobrescrever ficheiros existentes? +sound.when.rip.completes = Notificar quando o rip é concluído +preserve.order = Manter a ordem +save.logs = Guardar registos +notification.when.rip.starts = Notificar quando o rip começar +save.urls.only = Apenas guardar URLs +save.album.titles = Guardar os títulos de álbuns +autorip.from.clipboard = Autorip da área de transferência +save.descriptions = Guardar descrições +prefer.mp4.over.gif = Preferir MP4 a GIF +restore.window.position = Restaurar posição da janela +remember.url.history = Lembrar histórico de URL +loading.history.from = Carregar histórico de + +# Misc UI keys + +loading.history.from.configuration = A carregar o histórico da configuração +interrupted.while.waiting.to.rip.next.album = Interrompido durante a espera do rip do próximo álbum +inactive = Inativo +re-rip.checked = Re-rip verificado +remove = Remover +clear = Limpar From 14acc08aa188fb6b22e34855b52ca8be2eb58e2c Mon Sep 17 00:00:00 2001 From: TheRec Date: Sat, 12 May 2018 23:35:02 +0200 Subject: [PATCH 13/14] Converted French (Switzerland) translation from ANSI to UTF-8 --- .../resources/LabelsBundle_fr_CH.properties | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/main/resources/LabelsBundle_fr_CH.properties b/src/main/resources/LabelsBundle_fr_CH.properties index e2cedff6..1e23645b 100644 --- a/src/main/resources/LabelsBundle_fr_CH.properties +++ b/src/main/resources/LabelsBundle_fr_CH.properties @@ -1,20 +1,20 @@ Log = Journal History = Historique -created = créé le -modified = modifié le +created = créé le +modified = modifié le Queue = File d'attente Configuration = Configuration # Keys for the Configuration menu current.version = Version actuelle -check.for.updates = Vérifier mises à jour -auto.update = Mises à jour automatiques? -max.download.threads = Nombre de téléchargements parallèles maximum -timeout.mill = Délai d'expiration (en millisecondes): -retry.download.count = Nombre d'essais téléchargement +check.for.updates = Vérifier mises à jour +auto.update = Mises à jour automatiques? +max.download.threads = Nombre de téléchargements parallèles maximum +timeout.mill = Délai d'expiration (en millisecondes): +retry.download.count = Nombre d'essais téléchargement overwrite.existing.files = Remplacer fichiers existants ? -sound.when.rip.completes = Son lorsque le rip est terminé +sound.when.rip.completes = Son lorsque le rip est terminé preserve.order = Conserver l'ordre save.logs = Enregistrer journaux notification.when.rip.starts = Notification lorsqu'un rip commence @@ -22,8 +22,8 @@ save.urls.only = Enregistrer URL uniquement save.album.titles = Enregistrer titres d'album autorip.from.clipboard = Autorip depuis presse-papier save.descriptions = Enregistrer descriptions -prefer.mp4.over.gif = Préférer MP4 à GIF -restore.window.position = Restaurer la position de la fenêtre +prefer.mp4.over.gif = Préférer MP4 à GIF +restore.window.position = Restaurer la position de la fenêtre remember.url.history = Se souvenir de l'historique des URL loading.history.from = Charger l'historique depuis @@ -32,6 +32,6 @@ loading.history.from = Charger l'historique depuis loading.history.from.configuration = Charger l'historique depuis la configuration interrupted.while.waiting.to.rip.next.album = Interrompu lors de l'attente pour ripper le prochain album inactive = Inactif -re-rip.checked = Re-rip vérifié +re-rip.checked = Re-rip vérifié remove = Enlever clear = Effacer \ No newline at end of file From 00696c3450e6c0321a13786dfd044d16fe44a669 Mon Sep 17 00:00:00 2001 From: cyian-1756 Date: Sun, 13 May 2018 08:56:14 -0400 Subject: [PATCH 14/14] Can now set UI lang in config file --- src/main/java/com/rarchives/ripme/utils/Utils.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/com/rarchives/ripme/utils/Utils.java b/src/main/java/com/rarchives/ripme/utils/Utils.java index e6617f46..cd1048df 100644 --- a/src/main/java/com/rarchives/ripme/utils/Utils.java +++ b/src/main/java/com/rarchives/ripme/utils/Utils.java @@ -578,6 +578,11 @@ public class Utils { } public static ResourceBundle getResourceBundle() { + if (!getConfigString("lang", "").equals("")) { + String[] langCode = getConfigString("lang", "").split("_"); + logger.info("Setting locale to " + getConfigString("lang", "")); + return ResourceBundle.getBundle("LabelsBundle", new Locale(langCode[0], langCode[1]), new UTF8Control()); + } try { ResourceBundle rb = ResourceBundle.getBundle("LabelsBundle", Locale.getDefault(), new UTF8Control()); return rb;