diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..c5f3f6b
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,3 @@
+{
+ "java.configuration.updateBuildConfiguration": "interactive"
+}
\ No newline at end of file
diff --git a/BackupManager-1.0-SNAPSHOT-jar-with-dependencies.jar b/BackupManager-1.0-SNAPSHOT-jar-with-dependencies.jar
new file mode 100644
index 0000000..f2b211b
Binary files /dev/null and b/BackupManager-1.0-SNAPSHOT-jar-with-dependencies.jar differ
diff --git a/pom.xml b/pom.xml
index 6242a5f..ec025ab 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,13 +10,19 @@
19
-
+
com.googlecode.json-simple
json-simple
1.1.1
+
+ com.google.code.gson
+ gson
+ 2.8.9
+
+
junit
@@ -42,6 +48,11 @@
+
+ com.formdev
+ flatlaf-intellij-themes
+ 3.5.2
+
com.formdev
flatlaf
diff --git a/src/main/java/com/mycompany/autobackupprogram/BackupOperations.java b/src/main/java/com/mycompany/autobackupprogram/BackupOperations.java
index 6cc0619..347ce5e 100644
--- a/src/main/java/com/mycompany/autobackupprogram/BackupOperations.java
+++ b/src/main/java/com/mycompany/autobackupprogram/BackupOperations.java
@@ -1,8 +1,9 @@
package com.mycompany.autobackupprogram;
-import static com.mycompany.autobackupprogram.BackupManagerGUI.OpenExceptionMessage;
-import static com.mycompany.autobackupprogram.BackupManagerGUI.dateForfolderNameFormatter;
-import static com.mycompany.autobackupprogram.BackupManagerGUI.formatter;
+import static com.mycompany.autobackupprogram.GUI.BackupManagerGUI.OpenExceptionMessage;
+import static com.mycompany.autobackupprogram.GUI.BackupManagerGUI.dateForfolderNameFormatter;
+import static com.mycompany.autobackupprogram.GUI.BackupManagerGUI.formatter;
+
import java.awt.TrayIcon;
import java.io.File;
import java.io.FileOutputStream;
@@ -26,6 +27,13 @@
import javax.swing.JToggleButton;
import javax.swing.SwingUtilities;
+import com.mycompany.autobackupprogram.Entities.Backup;
+import com.mycompany.autobackupprogram.Enums.ConfigKey;
+import com.mycompany.autobackupprogram.Enums.TranslationLoaderEnum.TranslationCategory;
+import com.mycompany.autobackupprogram.Enums.TranslationLoaderEnum.TranslationKey;
+import com.mycompany.autobackupprogram.GUI.BackupManagerGUI;
+import com.mycompany.autobackupprogram.GUI.BackupProgressGUI;
+import com.mycompany.autobackupprogram.Entities.TimeInterval;
import com.mycompany.autobackupprogram.Logger.LogLevel;
public class BackupOperations{
@@ -62,7 +70,7 @@ public static void SingleBackup(Backup backup, TrayIcon trayIcon, BackupProgress
zipDirectory(path1, path2+".zip", backup, trayIcon, progressBar, singleBackupBtn, autoBackupBtn);
} catch (IOException e) {
Logger.logMessage("Error during the backup operation: the initial path is incorrect!", Logger.LogLevel.WARN);
- JOptionPane.showMessageDialog(null, "Error during the backup operation: the initial path is incorrect!", "Error", JOptionPane.ERROR_MESSAGE);
+ JOptionPane.showMessageDialog(null, TranslationCategory.DIALOGS.getTranslation(TranslationKey.ERROR_MESSAGE_FOR_INCORRECT_INITIAL_PATH), TranslationCategory.DIALOGS.getTranslation(TranslationKey.ERROR_GENERIC_TITLE), JOptionPane.ERROR_MESSAGE);
if (singleBackupBtn != null) singleBackupBtn.setEnabled(true);
if (autoBackupBtn != null) autoBackupBtn.setEnabled(true);
} catch (Exception ex) {
@@ -109,15 +117,15 @@ private static void updateAfterBackup(String path1, String path2, Backup backup,
updateBackup(backups, backup);
- if (trayIcon != null) {
- trayIcon.displayMessage("Backup Manager", "Backup: "+ backup.getBackupName() +"\nThe backup was successfully completed:\nFrom: " + path1 + "\nTo: " + path2, TrayIcon.MessageType.INFO);
+ if (trayIcon != null) {
+ trayIcon.displayMessage(TranslationCategory.GENERAL.getTranslation(TranslationKey.APP_NAME), TranslationCategory.GENERAL.getTranslation(TranslationKey.BACKUP) + ": " + backup.getBackupName() + TranslationCategory.TRAY_ICON.getTranslation(TranslationKey.SUCCESS_MESSAGE) + "\n" + TranslationCategory.GENERAL.getTranslation(TranslationKey.FROM) + ": " + path1 + "\n" + TranslationCategory.GENERAL.getTranslation(TranslationKey.TO) + ": " + path2, TrayIcon.MessageType.INFO);
}
} catch (IllegalArgumentException ex) {
Logger.logMessage("An error occurred: " + ex.getMessage(), Logger.LogLevel.ERROR, ex);
OpenExceptionMessage(ex.getMessage(), Arrays.toString(ex.getStackTrace()));
} catch (Exception e) {
Logger.logMessage("Error saving file", Logger.LogLevel.WARN);
- JOptionPane.showMessageDialog(null, "Error saving file", "Error", JOptionPane.ERROR_MESSAGE);
+ JOptionPane.showMessageDialog(null, TranslationCategory.DIALOGS.getTranslation(TranslationKey.ERROR_MESSAGE_SAVING_FILE), TranslationCategory.DIALOGS.getTranslation(TranslationKey.ERROR_GENERIC_TITLE), JOptionPane.ERROR_MESSAGE);
}
}
@@ -125,11 +133,11 @@ public static boolean CheckInputCorrect(String backupName, String path1, String
//check if inputs are null
if(path1.length() == 0 || path2.length() == 0) {
Logger.logMessage("Input Missing!", Logger.LogLevel.WARN);
-
- if (trayIcon != null){
- trayIcon.displayMessage("Backup Manager", "Backup: "+ backupName +"\nError during automatic backup.\nInput Missing!", TrayIcon.MessageType.ERROR);
+
+ if (trayIcon != null) {
+ trayIcon.displayMessage(TranslationCategory.GENERAL.getTranslation(TranslationKey.APP_NAME), TranslationCategory.GENERAL.getTranslation(TranslationKey.BACKUP) + ": " + backupName + TranslationCategory.TRAY_ICON.getTranslation(TranslationKey.ERROR_MESSAGE_INPUT_MISSING), TrayIcon.MessageType.ERROR);
} else {
- JOptionPane.showMessageDialog(null, "Input Missing!", "Error", JOptionPane.ERROR_MESSAGE);
+ JOptionPane.showMessageDialog(null, TranslationCategory.DIALOGS.getTranslation(TranslationKey.ERROR_MESSAGE_INPUT_MISSING_GENERIC), TranslationCategory.DIALOGS.getTranslation(TranslationKey.ERROR_GENERIC_TITLE), JOptionPane.ERROR_MESSAGE);
}
return false;
}
@@ -138,9 +146,9 @@ public static boolean CheckInputCorrect(String backupName, String path1, String
Logger.logMessage("Input Error! One or both paths do not exist.", Logger.LogLevel.WARN);
if (trayIcon != null) {
- trayIcon.displayMessage("Backup Manager", "Backup: "+ backupName +"\nError during automatic backup.\nOne or both paths do not exist!", TrayIcon.MessageType.ERROR);
+ trayIcon.displayMessage(TranslationCategory.GENERAL.getTranslation(TranslationKey.APP_NAME), TranslationCategory.GENERAL.getTranslation(TranslationKey.BACKUP) + ": " + backupName + TranslationCategory.TRAY_ICON.getTranslation(TranslationKey.ERROR_MESSAGE_FILES_NOT_EXISTING), TrayIcon.MessageType.ERROR);
} else {
- JOptionPane.showMessageDialog(null, "One or both paths do not exist!", "Error", JOptionPane.ERROR_MESSAGE);
+ JOptionPane.showMessageDialog(null, TranslationCategory.DIALOGS.getTranslation(TranslationKey.ERROR_MESSAGE_PATH_NOT_EXISTING), TranslationCategory.DIALOGS.getTranslation(TranslationKey.ERROR_GENERIC_TITLE), JOptionPane.ERROR_MESSAGE);
}
return false;
}
@@ -149,9 +157,9 @@ public static boolean CheckInputCorrect(String backupName, String path1, String
Logger.logMessage("The initial path and destination path cannot be the same. Please choose different paths", Logger.LogLevel.WARN);
if (trayIcon != null) {
- trayIcon.displayMessage("Backup Manager", "Backup: "+ backupName +"\nError during automatic backup.\nThe initial path and destination path cannot be the same. Please choose different paths!", TrayIcon.MessageType.ERROR);
+ trayIcon.displayMessage(TranslationCategory.GENERAL.getTranslation(TranslationKey.APP_NAME), TranslationCategory.GENERAL.getTranslation(TranslationKey.BACKUP) + ": " + backupName + TranslationCategory.TRAY_ICON.getTranslation(TranslationKey.ERROR_MESSAGE_SAME_PATHS), TrayIcon.MessageType.ERROR);
} else {
- JOptionPane.showMessageDialog(null, "The initial path and destination path cannot be the same. Please choose different paths!", "Error", JOptionPane.ERROR_MESSAGE);
+ JOptionPane.showMessageDialog(null, TranslationCategory.DIALOGS.getTranslation(TranslationKey.ERROR_MESSAGE_SAME_PATHS_GENERIC), TranslationCategory.DIALOGS.getTranslation(TranslationKey.ERROR_GENERIC_TITLE), JOptionPane.ERROR_MESSAGE);
}
return false;
}
diff --git a/src/main/java/com/mycompany/autobackupprogram/BackupService.java b/src/main/java/com/mycompany/autobackupprogram/BackupService.java
index 3081aa8..6c1d00a 100644
--- a/src/main/java/com/mycompany/autobackupprogram/BackupService.java
+++ b/src/main/java/com/mycompany/autobackupprogram/BackupService.java
@@ -13,10 +13,14 @@
import java.util.concurrent.TimeUnit;
import javax.swing.JFrame;
+import com.mycompany.autobackupprogram.Entities.Backup;
+import com.mycompany.autobackupprogram.Enums.ConfigKey;
+import com.mycompany.autobackupprogram.GUI.BackupManagerGUI;
+
public class BackupService {
private ScheduledExecutorService scheduler;
private final JSONAutoBackup json = new JSONAutoBackup();
- private final JSONConfigReader jsonConfig = new JSONConfigReader(ConfigKey.CONFIG_FILE_STRING.getValue(), ConfigKey.RES_DIRECTORY_STRING.getValue());
+ private final JSONConfigReader jsonConfig = new JSONConfigReader(ConfigKey.CONFIG_FILE_STRING.getValue(), ConfigKey.CONFIG_DIRECTORY_STRING.getValue());
private TrayIcon trayIcon = null;
private BackupManagerGUI guiInstance = null;
diff --git a/src/main/java/com/mycompany/autobackupprogram/Dialogs/PreferencesDialog.form b/src/main/java/com/mycompany/autobackupprogram/Dialogs/PreferencesDialog.form
new file mode 100644
index 0000000..ca18cce
--- /dev/null
+++ b/src/main/java/com/mycompany/autobackupprogram/Dialogs/PreferencesDialog.form
@@ -0,0 +1,124 @@
+
+
+
diff --git a/src/main/java/com/mycompany/autobackupprogram/Dialogs/PreferencesDialog.java b/src/main/java/com/mycompany/autobackupprogram/Dialogs/PreferencesDialog.java
new file mode 100644
index 0000000..c74aae7
--- /dev/null
+++ b/src/main/java/com/mycompany/autobackupprogram/Dialogs/PreferencesDialog.java
@@ -0,0 +1,203 @@
+package com.mycompany.autobackupprogram.Dialogs;
+
+import com.formdev.flatlaf.FlatIntelliJLaf;
+import com.mycompany.autobackupprogram.Entities.Preferences;
+import com.mycompany.autobackupprogram.Enums.ConfigKey;
+import com.mycompany.autobackupprogram.Enums.LanguagesEnum;
+import com.mycompany.autobackupprogram.Enums.ThemesEnum;
+import com.mycompany.autobackupprogram.Enums.TranslationLoaderEnum;
+import com.mycompany.autobackupprogram.Enums.TranslationLoaderEnum.TranslationCategory;
+import com.mycompany.autobackupprogram.Enums.TranslationLoaderEnum.TranslationKey;
+import com.mycompany.autobackupprogram.Managers.ThemeManager;
+
+import static com.mycompany.autobackupprogram.GUI.BackupManagerGUI.OpenExceptionMessage;
+import java.awt.Image;
+import java.io.IOException;
+import java.util.Arrays;
+import javax.swing.ImageIcon;
+import javax.swing.UIManager;
+import javax.swing.UnsupportedLookAndFeelException;
+
+import org.json.simple.parser.ParseException;
+
+public class PreferencesDialog extends javax.swing.JDialog {
+
+ private boolean isApply = false;
+
+ public PreferencesDialog(java.awt.Frame parent, boolean modal) {
+ super(parent, modal);
+ initComponents();
+
+ // logo application
+ Image icon = new ImageIcon(this.getClass().getResource(ConfigKey.LOGO_IMG.getValue())).getImage();
+ this.setIconImage(icon);
+
+ ThemeManager.updateThemeDialog(this);
+ setLanguages();
+ setThemes();
+ setTranslations();
+ }
+
+ public void changeTheme() {
+
+ }
+
+ /**
+ * This method is called from within the constructor to initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is always
+ * regenerated by the Form Editor.
+ */
+ @SuppressWarnings("unchecked")
+ // //GEN-BEGIN:initComponents
+ private void initComponents() {
+
+ languagesComboBox = new javax.swing.JComboBox<>();
+ jLabel1 = new javax.swing.JLabel();
+ jLabel2 = new javax.swing.JLabel();
+ themesComboBox = new javax.swing.JComboBox<>();
+ applyBtn = new javax.swing.JButton();
+ closeBtn = new javax.swing.JButton();
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
+ setTitle("Preferences");
+ setAlwaysOnTop(true);
+ setResizable(false);
+
+ languagesComboBox.setToolTipText("");
+
+ jLabel1.setText("Language");
+
+ jLabel2.setText("Theme");
+
+ themesComboBox.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ themesComboBoxActionPerformed(evt);
+ }
+ });
+
+ applyBtn.setText("Apply");
+ applyBtn.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ applyBtnActionPerformed(evt);
+ }
+ });
+
+ closeBtn.setText("Close");
+ closeBtn.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ closeBtnActionPerformed(evt);
+ }
+ });
+
+ javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
+ getContentPane().setLayout(layout);
+ layout.setHorizontalGroup(
+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(layout.createSequentialGroup()
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
+ .addGroup(layout.createSequentialGroup()
+ .addContainerGap(223, Short.MAX_VALUE)
+ .addComponent(applyBtn)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+ .addComponent(closeBtn))
+ .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
+ .addGap(22, 22, 22)
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
+ .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addComponent(jLabel2, javax.swing.GroupLayout.DEFAULT_SIZE, 345, Short.MAX_VALUE)
+ .addComponent(themesComboBox, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addComponent(languagesComboBox, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))
+ .addContainerGap(13, Short.MAX_VALUE))
+ );
+ layout.setVerticalGroup(
+ layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(layout.createSequentialGroup()
+ .addGap(20, 20, 20)
+ .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 16, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(languagesComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 34, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addGap(18, 18, 18)
+ .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 16, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(themesComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 34, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 109, Short.MAX_VALUE)
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(applyBtn)
+ .addComponent(closeBtn))
+ .addGap(14, 14, 14))
+ );
+
+ pack();
+ setLocationRelativeTo(null);
+ }// //GEN-END:initComponents
+
+ private void themesComboBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_themesComboBoxActionPerformed
+ // TODO add your handling code here:
+ }//GEN-LAST:event_themesComboBoxActionPerformed
+
+ private void applyBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_applyBtnActionPerformed
+ isApply = true;
+ try {
+ // translactions
+ Preferences.setLanguage((String) languagesComboBox.getSelectedItem());
+ TranslationLoaderEnum.loadTranslations(ConfigKey.LANGUAGES_DIRECTORY_STRING.getValue() + Preferences.getLanguage().getFileName());
+ setTranslations();
+
+ // theme
+ Preferences.setTheme((String) themesComboBox.getSelectedItem());
+ ThemeManager.updateThemeDialog(this);
+ } catch (IOException | ParseException e) {
+ e.printStackTrace();
+ }
+ }//GEN-LAST:event_applyBtnActionPerformed
+
+ private void closeBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_closeBtnActionPerformed
+ this.dispose();
+ }//GEN-LAST:event_closeBtnActionPerformed
+
+ private void setLanguages() {
+ languagesComboBox.addItem(LanguagesEnum.ENG.getLanguageName());
+ languagesComboBox.addItem(LanguagesEnum.ITA.getLanguageName());
+ languagesComboBox.addItem(LanguagesEnum.ESP.getLanguageName());
+ languagesComboBox.addItem(LanguagesEnum.DEU.getLanguageName());
+ languagesComboBox.addItem(LanguagesEnum.FRA.getLanguageName());
+
+ languagesComboBox.setSelectedItem(Preferences.getLanguage().getLanguageName());
+ }
+
+ private void setThemes() {
+ themesComboBox.addItem(ThemesEnum.INTELLIJ.getThemeName());
+ themesComboBox.addItem(ThemesEnum.DRACULA.getThemeName());
+ themesComboBox.addItem(ThemesEnum.CARBON.getThemeName());
+ themesComboBox.addItem(ThemesEnum.ARC_ORAGE.getThemeName());
+ themesComboBox.addItem(ThemesEnum.ARC_DARK_ORANGE.getThemeName());
+ themesComboBox.addItem(ThemesEnum.CYAN_LIGHT.getThemeName());
+ themesComboBox.addItem(ThemesEnum.NORD.getThemeName());
+ themesComboBox.addItem(ThemesEnum.HIGH_CONTRAST.getThemeName());
+ themesComboBox.addItem(ThemesEnum.SOLARIZED_DARK.getThemeName());
+ themesComboBox.addItem(ThemesEnum.SOLARIZED_LIGHT.getThemeName());
+
+ themesComboBox.setSelectedItem(Preferences.getTheme().getThemeName());
+ }
+
+ private void setTranslations() {
+ setTitle(TranslationCategory.PREFERENCES_DIALOG.getTranslation(TranslationKey.PREFERENCES_TITLE));
+ applyBtn.setText(TranslationCategory.GENERAL.getTranslation(TranslationKey.APPLY_BUTTON));
+ closeBtn.setText(TranslationCategory.GENERAL.getTranslation(TranslationKey.CLOSE_BUTTON));
+ jLabel1.setText(TranslationCategory.PREFERENCES_DIALOG.getTranslation(TranslationKey.LANGUAGE));
+ jLabel2.setText(TranslationCategory.PREFERENCES_DIALOG.getTranslation(TranslationKey.THEME));
+ }
+
+ public boolean isApply() {
+ return isApply;
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JButton applyBtn;
+ private javax.swing.JButton closeBtn;
+ private javax.swing.JLabel jLabel1;
+ private javax.swing.JLabel jLabel2;
+ private javax.swing.JComboBox languagesComboBox;
+ private javax.swing.JComboBox themesComboBox;
+ // End of variables declaration//GEN-END:variables
+}
diff --git a/src/main/java/com/mycompany/autobackupprogram/TimePicker.form b/src/main/java/com/mycompany/autobackupprogram/Dialogs/TimePicker.form
similarity index 100%
rename from src/main/java/com/mycompany/autobackupprogram/TimePicker.form
rename to src/main/java/com/mycompany/autobackupprogram/Dialogs/TimePicker.form
diff --git a/src/main/java/com/mycompany/autobackupprogram/TimePicker.java b/src/main/java/com/mycompany/autobackupprogram/Dialogs/TimePicker.java
similarity index 87%
rename from src/main/java/com/mycompany/autobackupprogram/TimePicker.java
rename to src/main/java/com/mycompany/autobackupprogram/Dialogs/TimePicker.java
index 097f1f6..1dd39ef 100644
--- a/src/main/java/com/mycompany/autobackupprogram/TimePicker.java
+++ b/src/main/java/com/mycompany/autobackupprogram/Dialogs/TimePicker.java
@@ -1,7 +1,14 @@
-package com.mycompany.autobackupprogram;
+package com.mycompany.autobackupprogram.Dialogs;
import com.formdev.flatlaf.FlatIntelliJLaf;
-import static com.mycompany.autobackupprogram.BackupManagerGUI.OpenExceptionMessage;
+import com.mycompany.autobackupprogram.Enums.ConfigKey;
+import com.mycompany.autobackupprogram.Enums.TranslationLoaderEnum.TranslationCategory;
+import com.mycompany.autobackupprogram.Enums.TranslationLoaderEnum.TranslationKey;
+import com.mycompany.autobackupprogram.Managers.ThemeManager;
+import com.mycompany.autobackupprogram.Entities.TimeInterval;
+
+import static com.mycompany.autobackupprogram.GUI.BackupManagerGUI.OpenExceptionMessage;
+
import java.awt.Image;
import java.util.Arrays;
import javax.swing.ImageIcon;
@@ -30,6 +37,8 @@ public TimePicker(java.awt.Frame parent, TimeInterval timeInterval, boolean moda
// logo application
Image icon = new ImageIcon(this.getClass().getResource(ConfigKey.LOGO_IMG.getValue())).getImage();
this.setIconImage(icon);
+
+ setTranslations();
}
public TimeInterval getTimeInterval() {
@@ -248,7 +257,7 @@ private void btnOkActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:e
this.dispose();
}
else {
- JOptionPane.showMessageDialog(null, "The time interval is not correct", "Error", JOptionPane.ERROR_MESSAGE);
+ JOptionPane.showMessageDialog(null, TranslationCategory.DIALOGS.getTranslation(TranslationKey.ERROR_WRONG_TIME_INTERVAL), TranslationCategory.DIALOGS.getTranslation(TranslationKey.ERROR_GENERIC_TITLE), JOptionPane.ERROR_MESSAGE);
}
}//GEN-LAST:event_btnOkActionPerformed
@@ -269,26 +278,17 @@ private void minutesSpinnerStateChanged(javax.swing.event.ChangeEvent evt) {//GE
minutesIntervalSpinnerChange();
}//GEN-LAST:event_minutesSpinnerStateChanged
- public static void main(String args[]) {
- try {
- UIManager.setLookAndFeel(new FlatIntelliJLaf());
- } catch (UnsupportedLookAndFeelException ex) {
- System.err.println("Exception (main) --> " + ex);
- OpenExceptionMessage(ex.getMessage(), Arrays.toString(ex.getStackTrace()));
- }
-
- java.awt.EventQueue.invokeLater(new Runnable() {
- public void run() {
- TimePicker dialog = new TimePicker(new javax.swing.JFrame(), null, true);
- dialog.addWindowListener(new java.awt.event.WindowAdapter() {
- @Override
- public void windowClosing(java.awt.event.WindowEvent e) {
- System.exit(0);
- }
- });
- dialog.setVisible(true);
- }
- });
+ private void setTranslations() {
+ setTitle(TranslationCategory.TIME_PICKER_DIALOG.getTranslation(TranslationKey.TIME_INTERVAL_TITLE));
+ jTextArea1.setText(TranslationCategory.TIME_PICKER_DIALOG.getTranslation(TranslationKey.DESCRIPTION));
+ daysSpinner.setToolTipText(TranslationCategory.TIME_PICKER_DIALOG.getTranslation(TranslationKey.SPINNER_TOOLTIP));
+ hoursSpinner.setToolTipText(TranslationCategory.TIME_PICKER_DIALOG.getTranslation(TranslationKey.SPINNER_TOOLTIP));
+ minutesSpinner.setToolTipText(TranslationCategory.TIME_PICKER_DIALOG.getTranslation(TranslationKey.SPINNER_TOOLTIP));
+ btnOk.setText(TranslationCategory.TIME_PICKER_DIALOG.getTranslation(TranslationKey.OK_BUTTON));
+ jButton2.setText(TranslationCategory.GENERAL.getTranslation(TranslationKey.CANCEL_BUTTON));
+ jLabel1.setText(TranslationCategory.TIME_PICKER_DIALOG.getTranslation(TranslationKey.DAYS));
+ jLabel2.setText(TranslationCategory.TIME_PICKER_DIALOG.getTranslation(TranslationKey.HOURS));
+ jLabel3.setText(TranslationCategory.TIME_PICKER_DIALOG.getTranslation(TranslationKey.MINUTES));
}
// Variables declaration - do not modify//GEN-BEGIN:variables
diff --git a/src/main/java/com/mycompany/autobackupprogram/Backup.java b/src/main/java/com/mycompany/autobackupprogram/Entities/Backup.java
similarity index 98%
rename from src/main/java/com/mycompany/autobackupprogram/Backup.java
rename to src/main/java/com/mycompany/autobackupprogram/Entities/Backup.java
index f1fc903..9d06e08 100644
--- a/src/main/java/com/mycompany/autobackupprogram/Backup.java
+++ b/src/main/java/com/mycompany/autobackupprogram/Entities/Backup.java
@@ -1,7 +1,8 @@
-package com.mycompany.autobackupprogram;
+package com.mycompany.autobackupprogram.Entities;
import java.time.LocalDateTime;
+
public class Backup {
private String _backupName;
diff --git a/src/main/java/com/mycompany/autobackupprogram/Entities/Preferences.java b/src/main/java/com/mycompany/autobackupprogram/Entities/Preferences.java
new file mode 100644
index 0000000..30fa9b4
--- /dev/null
+++ b/src/main/java/com/mycompany/autobackupprogram/Entities/Preferences.java
@@ -0,0 +1,113 @@
+package com.mycompany.autobackupprogram.Entities;
+
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import com.mycompany.autobackupprogram.Logger;
+import com.mycompany.autobackupprogram.Logger.LogLevel;
+import com.mycompany.autobackupprogram.Enums.ConfigKey;
+import com.mycompany.autobackupprogram.Enums.LanguagesEnum;
+import com.mycompany.autobackupprogram.Enums.ThemesEnum;
+
+public class Preferences {
+ private static LanguagesEnum language = LanguagesEnum.ENG;
+ private static ThemesEnum theme = ThemesEnum.INTELLIJ;
+
+ public static void loadPreferencesFromJSON() {
+ try (FileReader reader = new FileReader(ConfigKey.CONFIG_DIRECTORY_STRING.getValue() + ConfigKey.PREFERENCES_FILE_STRING.getValue())) {
+ JsonElement jsonElement = JsonParser.parseReader(reader);
+ JsonObject jsonObject = jsonElement.getAsJsonObject();
+
+ // Map the "Language" JSON value to the LanguagesEnum
+ String languageFileName = jsonObject.get("Language").getAsString();
+ for (LanguagesEnum lang : LanguagesEnum.values()) {
+ if (lang.getFileName().equals(languageFileName)) {
+ language = lang;
+ break;
+ }
+ }
+
+ // Map the "Theme" JSON value to the ThemesEnum
+ String themeName = jsonObject.get("Theme").getAsString();
+ for (ThemesEnum t : ThemesEnum.values()) {
+ if (t.getThemeName().equals(themeName)) {
+ theme = t;
+ break;
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ public static void updatePreferencesToJSON() {
+ try (FileWriter writer = new FileWriter(ConfigKey.CONFIG_DIRECTORY_STRING.getValue() + ConfigKey.PREFERENCES_FILE_STRING.getValue())) {
+ JsonObject jsonObject = new JsonObject();
+
+ jsonObject.addProperty("Language", language.getFileName());
+ jsonObject.addProperty("Theme", theme.getThemeName());
+
+ // Convert JsonObject to JSON string using Gson
+ Gson gson = new Gson();
+ gson.toJson(jsonObject, writer);
+
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public static LanguagesEnum getLanguage() {
+ return language;
+ }
+ public static ThemesEnum getTheme() {
+ return theme;
+ }
+ public static void setLanguage(LanguagesEnum language) {
+ Preferences.language = language;
+ }
+ public static void setTheme(ThemesEnum theme) {
+ Preferences.theme = theme;
+ }
+ public static void setLanguage(String selectedLanguage) {
+ try {
+ for (LanguagesEnum lang : LanguagesEnum.values()) {
+ if (lang.getLanguageName().equalsIgnoreCase(selectedLanguage)) {
+ language = lang;
+ Logger.logMessage("Language set to: " + language.getLanguageName(), LogLevel.INFO);
+ return;
+ }
+ }
+ Logger.logMessage("Invalid language name: " + selectedLanguage, LogLevel.ERROR);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ public static void setTheme(String selectedTheme) {
+ try {
+ for (ThemesEnum t : ThemesEnum.values()) {
+ if (t.getThemeName().equalsIgnoreCase(selectedTheme)) {
+ theme = t;
+ Logger.logMessage("Theme set to: " + theme.getThemeName(), LogLevel.INFO);
+ return;
+ }
+ }
+ Logger.logMessage("Invalid theme name: " + selectedTheme, LogLevel.ERROR);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ // for test
+ public static void main(String[] args) {
+ String CONFIG = "src/main/resources/res/config/config.json";
+ ConfigKey.loadFromJson(CONFIG);
+ loadPreferencesFromJSON();
+ updatePreferencesToJSON();
+ }
+
+}
diff --git a/src/main/java/com/mycompany/autobackupprogram/TimeInterval.java b/src/main/java/com/mycompany/autobackupprogram/Entities/TimeInterval.java
similarity index 98%
rename from src/main/java/com/mycompany/autobackupprogram/TimeInterval.java
rename to src/main/java/com/mycompany/autobackupprogram/Entities/TimeInterval.java
index 62ea30a..1ffa3b9 100644
--- a/src/main/java/com/mycompany/autobackupprogram/TimeInterval.java
+++ b/src/main/java/com/mycompany/autobackupprogram/Entities/TimeInterval.java
@@ -1,4 +1,4 @@
-package com.mycompany.autobackupprogram;
+package com.mycompany.autobackupprogram.Entities;
public class TimeInterval {
private int days;
diff --git a/src/main/java/com/mycompany/autobackupprogram/ConfigKey.java b/src/main/java/com/mycompany/autobackupprogram/Enums/ConfigKey.java
similarity index 89%
rename from src/main/java/com/mycompany/autobackupprogram/ConfigKey.java
rename to src/main/java/com/mycompany/autobackupprogram/Enums/ConfigKey.java
index 1b7185f..3a53b85 100644
--- a/src/main/java/com/mycompany/autobackupprogram/ConfigKey.java
+++ b/src/main/java/com/mycompany/autobackupprogram/Enums/ConfigKey.java
@@ -1,4 +1,4 @@
-package com.mycompany.autobackupprogram;
+package com.mycompany.autobackupprogram.Enums;
import java.io.FileReader;
import java.io.IOException;
@@ -12,7 +12,10 @@ public enum ConfigKey {
LOG_FILE_STRING,
BACKUP_FILE_STRING,
CONFIG_FILE_STRING,
+ PREFERENCES_FILE_STRING,
RES_DIRECTORY_STRING,
+ LANGUAGES_DIRECTORY_STRING,
+ CONFIG_DIRECTORY_STRING,
DONATE_PAGE_LINK,
ISSUE_PAGE_LINK,
INFO_PAGE_LINK,
diff --git a/src/main/java/com/mycompany/autobackupprogram/Enums/LanguagesEnum.java b/src/main/java/com/mycompany/autobackupprogram/Enums/LanguagesEnum.java
new file mode 100644
index 0000000..5386edd
--- /dev/null
+++ b/src/main/java/com/mycompany/autobackupprogram/Enums/LanguagesEnum.java
@@ -0,0 +1,25 @@
+package com.mycompany.autobackupprogram.Enums;
+
+public enum LanguagesEnum {
+ ITA("Italiano", "ita.json"),
+ ENG("English", "eng.json"),
+ DEU("Deutsch", "deu.json"),
+ ESP("Español", "esp.json"),
+ FRA("Français", "fra.json");
+
+ private final String languageName;
+ private final String fileName;
+
+ LanguagesEnum(String languageName, String fileName) {
+ this.languageName = languageName;
+ this.fileName = fileName;
+ }
+
+ public String getLanguageName() {
+ return languageName;
+ }
+
+ public String getFileName() {
+ return fileName;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/mycompany/autobackupprogram/MenuItems.java b/src/main/java/com/mycompany/autobackupprogram/Enums/MenuItems.java
similarity index 73%
rename from src/main/java/com/mycompany/autobackupprogram/MenuItems.java
rename to src/main/java/com/mycompany/autobackupprogram/Enums/MenuItems.java
index c325e78..2ea6bc0 100644
--- a/src/main/java/com/mycompany/autobackupprogram/MenuItems.java
+++ b/src/main/java/com/mycompany/autobackupprogram/Enums/MenuItems.java
@@ -1,7 +1,8 @@
-package com.mycompany.autobackupprogram;
+package com.mycompany.autobackupprogram.Enums;
public enum MenuItems {
BugReport,
+ Preferences,
Clear,
Donate,
History,
diff --git a/src/main/java/com/mycompany/autobackupprogram/Enums/ThemesEnum.java b/src/main/java/com/mycompany/autobackupprogram/Enums/ThemesEnum.java
new file mode 100644
index 0000000..3a3ba27
--- /dev/null
+++ b/src/main/java/com/mycompany/autobackupprogram/Enums/ThemesEnum.java
@@ -0,0 +1,24 @@
+package com.mycompany.autobackupprogram.Enums;
+
+public enum ThemesEnum {
+ INTELLIJ("Light"),
+ DRACULA("Dark"),
+ CARBON("Carbon"),
+ ARC_ORAGE("Arc - Orange"),
+ ARC_DARK_ORANGE("Arc Dark - Orange"),
+ CYAN_LIGHT("Cyan light"),
+ NORD("Nord"),
+ HIGH_CONTRAST("High contrast"),
+ SOLARIZED_DARK("Solarized dark"),
+ SOLARIZED_LIGHT("Solarized light");
+
+ private final String themeName;
+
+ ThemesEnum(String themeName) {
+ this.themeName = themeName;
+ }
+
+ public String getThemeName() {
+ return themeName;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/mycompany/autobackupprogram/Enums/TranslationLoaderEnum.java b/src/main/java/com/mycompany/autobackupprogram/Enums/TranslationLoaderEnum.java
new file mode 100644
index 0000000..6a0a9e8
--- /dev/null
+++ b/src/main/java/com/mycompany/autobackupprogram/Enums/TranslationLoaderEnum.java
@@ -0,0 +1,296 @@
+package com.mycompany.autobackupprogram.Enums;
+
+import org.json.simple.JSONObject;
+import org.json.simple.parser.JSONParser;
+import org.json.simple.parser.ParseException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+public class TranslationLoaderEnum {
+
+ public enum TranslationCategory {
+ GENERAL("General"),
+ MENU("Menu"),
+ TABBED_FRAMES("TabbedFrames"),
+ BACKUP_ENTRY("BackupEntry"),
+ BACKUP_LIST("BackupList"),
+ TIME_PICKER_DIALOG("TimePickerDialog"),
+ PREFERENCES_DIALOG("PreferencesDialog"),
+ PROGRESS_BACKUP_FRAME("ProgressBackupFrame"),
+ TRAY_ICON("TrayIcon"),
+ DIALOGS("Dialogs");
+
+ private final String categoryName;
+ private final Map translations = new HashMap<>();
+
+ TranslationCategory(String categoryName) {
+ this.categoryName = categoryName;
+ }
+
+ public String getCategoryName() {
+ return categoryName;
+ }
+
+ public void addTranslation(TranslationKey key, String value) {
+ translations.put(key, value);
+ }
+
+ // Updated getTranslation method
+ public String getTranslation(TranslationKey key) {
+ return translations.getOrDefault(key, key.getDefaultValue());
+ }
+ }
+
+ public enum TranslationKey {
+ // General
+ APP_NAME("AppName", "Backup Manager"),
+ VERSION("Version", "Version"),
+ BACKUP("Backup", "Backup"),
+ FROM("From", "From"),
+ TO("To", "To"),
+ CLOSE_BUTTON("CloseButton", "Close"),
+ OK_BUTTON("OkButton", "Ok"),
+ CANCEL_BUTTON("CancelButton", "Cancel"),
+ APPLY_BUTTON("ApplyButton", "Apply"),
+
+ // Menu
+ FILE("File", "File"),
+ OPTIONS("Options", "Options"),
+ ABOUT("About", "About"),
+ HELP("Help", "Help"),
+ BUG_REPORT("BugReport", "Report a bug"),
+ CLEAR("Clear", "Clear"),
+ DONATE("Donate", "Donate"),
+ HISTORY("History", "History"),
+ INFO_PAGE("InfoPage", "Info"),
+ NEW("New", "New"),
+ QUIT("Quit", "Quit"),
+ SAVE("Save", "Save"),
+ SAVE_WITH_NAME("SaveWithName", "Save with name"),
+ SHARE("Share", "Share"),
+ SUPPORT("Support", "Support"),
+ WEBSITE("Website", "Website"),
+
+ // TabbedFrames
+ BACKUP_ENTRY("BackupEntry", "Backup Entry"),
+ BACKUP_LIST("BackupList", "Backup List"),
+
+ // BackupEntry
+ PAGE_TITLE("PageTitle", "Backup Entry"),
+ CURRENT_FILE("CurrentFile", "Current file"),
+ NOTES("Notes", "Notes"),
+ LAST_BACKUP("LastBackup", "Last backup"),
+ SINGLE_BACKUP_BUTTON("SingleBackupButton", "Single Backup"),
+ AUTO_BACKUP_BUTTON("AutoBackupButton", "Auto Backup"),
+ AUTO_BACKUP_BUTTON_ON("AutoBackupButtonON", "Auto Backup (ON)"),
+ AUTO_BACKUP_BUTTON_OFF("AutoBackupButtonOFF", "Auto Backup (OFF)"),
+ INITIAL_PATH_PLACEHOLDER("InitialPathPlaceholder", "Initial path"),
+ DESTINATION_PATH_PLACEHOLDER("DestinationPathPlaceholder", "Destination path"),
+ INITIAL_PATH_TOOLTIP("InitialPathTooltip", "(Required) Initial path"),
+ DESTINATION_PATH_TOOLTIP("DestinationPathTooltip", "(Required) Destination path"),
+ INITIAL_FILE_CHOOSER_TOOLTIP("InitialFileChooserTooltip", "Open file explorer"),
+ DESTINATION_FILE_CHOOSER_TOOLTIP("DestinationFileChooserTooltip", "Open file explorer"),
+ NOTES_TOOLTIP("NotesTooltip", "(Optional) Backup description"),
+ SINGLE_BACKUP_TOOLTIP("SingleBackupTooltip", "Perform the backup"),
+ AUTO_BACKUP_TOOLTIP("AutoBackupTooltip", "Enable/Disable automatic backup"),
+ TIME_PICKER_TOOLTIP("TimePickerTooltip", "Time picker"),
+
+ // BackupList
+ BACKUP_NAME_COLUMN("BackupNameColumn", "Backup Name"),
+ INITIAL_PATH_COLUMN("InitialPathColumn", "Initial Path"),
+ DESTINATION_PATH_COLUMN("DestinationPathColumn", "Destination Path"),
+ LAST_BACKUP_COLUMN("LastBackupColumn", "Last Backup"),
+ AUTOMATIC_BACKUP_COLUMN("AutomaticBackupColumn", "Automatic Backup"),
+ NEXT_BACKUP_DATE_COLUMN("NextBackupDateColumn", "Next Backup Date"),
+ TIME_INTERVAL_COLUMN("TimeIntervalColumn", "Time Interval"),
+ BACKUP_NAME_DETAIL("BackupNameDetail", "BackupName"),
+ INITIAL_PATH_DETAIL("InitialPathDetail", "InitialPath"),
+ DESTINATION_PATH_DETAIL("DestinationPathDetail", "DestinationPath"),
+ LAST_BACKUP_DETAIL("LastBackupDetail", "LastBackup"),
+ NEXT_BACKUP_DATE_DETAIL("NextBackupDateDetail", "NextBackup"),
+ TIME_INTERVAL_DETAIL("TimeIntervalDetail", "TimeInterval"),
+ CREATION_DATE_DETAIL("CreationDateDetail", "CreationDate"),
+ LAST_UPDATE_DATE_DETAIL("LastUpdateDateDetail", "LastUpdateDate"),
+ BACKUP_COUNT_DETAIL("BackupCountDetail", "BackupCount"),
+ NOTES_DETAIL("NotesDetail", "Notes"),
+ ADD_BACKUP_TOOLTIP("AddBackupTooltip", "Add new backup"),
+ RESEARCH_BAR_TOOLTIP("ResearchBarTooltip", "Research bar"),
+ RESEARCH_BAR_PLACEHOLDER("ResearchBarPlaceholder", "Search..."),
+ EDIT_POPUP("EditPopup", "Edit"),
+ DELETE_POPUP("DeletePopup", "Delete"),
+ DUPLICATE_POPUP("DuplicatePopup", "Duplicate"),
+ RENAME_BACKUP_POPUP("RenameBackupPopup", "Rename backup"),
+ OPEN_INITIAL_FOLDER_POPUP("OpenInitialFolderPopup", "Open initial path"),
+ OPEN_DESTINATION_FOLDER_POPUP("OpenDestinationFolderPopup", "Open destination path"),
+ BACKUP_POPUP("BackupPopup", "Backup"),
+ SINGLE_BACKUP_POPUP("SingleBackupPopup", "Run single backup"),
+ AUTO_BACKUP_POPUP("AutoBackupPopup", "Auto backup"),
+ COPY_TEXT_POPUP("CopyTextPopup", "Copy text"),
+ COPY_BACKUP_NAME_POPUP("CopyBackupNamePopup", "Copy backup name"),
+ COPY_INITIAL_PATH_POPUP("CopyInitialPathPopup", "Copy initial path"),
+ COPY_DESTINATION_PATH_BACKUP("CopyDestinationPathPopup", "Copy destination path"),
+
+ // TimePickerDialog
+ TIME_INTERVAL_TITLE("TimeIntervalTitle", "Time interval for auto backup"),
+ DESCRIPTION("Description", "Select how often to perform the automatic backup by choosing the frequency in days, hours, and minutes."),
+ DAYS("Days", "Days"),
+ HOURS("Hours", "Hours"),
+ MINUTES("Minutes", "Minutes"),
+ SPINNER_TOOLTIP("SpinnerTooltip", "Mouse wheel to adjust the value"),
+
+ // PreferencesDialog
+ PREFERENCES_TITLE("PreferencesTitle", "Preferences"),
+ LANGUAGE("Language", "Language"),
+ THEME("Theme", "Theme"),
+
+ // ProgressBackupFrame
+ PROGRESS_BACKUP_TITLE("ProgressBackupTitle", "Backup in progress"),
+ STATUS_COMPLETED("StatusCompleted", "Backup completed!"),
+ STATUS_LOADING("StatusLoading", "Loading..."),
+
+ // TrayIcon
+ TRAY_TOOLTIP("TrayTooltip", "Backup Service"),
+ SUCCESS_MESSAGE("SuccessMessage", "\nThe backup was successfully completed:"),
+ ERROR_MESSAGE_INPUT_MISSING("ErrorMessageInputMissing", "\nError during automatic backup.\nInput Missing!"),
+ ERROR_MESSAGE_FILES_NOT_EXISTING("ErrorMessageFilesNotExisting", "\nError during automatic backup.\nOne or both paths do not exist!"),
+ ERROR_MESSAGE_SAME_PATHS("ErrorMessageSamePaths", "\nError during automatic backup.\nThe initial path and destination path cannot be the same. Please choose different paths!"),
+
+ // Dialogs
+ ERROR_GENERIC_TITLE("ErrorGenericTitle", "Error"),
+ ERROR_MESSAGE_FOR_FOLDER_NOT_EXISTING("ErrorMessageForFolderNotExisting", "The folder does not exist or is invalid"),
+ ERROR_MESSAGE_FOR_SAVING_FILE_WITH_PATHS_EMPTY("ErrorMessageForSavingFileWithPathsEmpty", "Unable to save the file. Both the initial and destination paths must be specified and cannot be empty"),
+ BACKUP_SAVED_CORRECTLY_TITLE("BackupSavedCorrectlyTitle", "Backup saved"),
+ BACKUP_SAVED_CORRECTLY_MESSAGE("BackupSavedCorrectlyMessage", "saved successfully!"),
+ ERROR_SAVING_BACKUP_MESSAGE("ErrorSavingBackupMessage", "Error saving backup"),
+ BACKUP_NAME_INPUT("BackupNameInput", "Name of the backup"),
+ CONFIRMATION_REQUIRED_TITLE("ConfirmationRequiredTitle", "Confirmation required"),
+ DUPLICATED_BACKUP_NAME_MESSAGE("DuplicatedBackupNameMessage", "A backup with the same name already exists, do you want to overwrite it?"),
+ BACKUP_NAME_ALREADY_USED_MESSAGE("BackupNameAlreadyUsedMessage", "Backup name already used!"),
+ ERROR_MESSAGE_FOR_INCORRECT_INITIAL_PATH("ErrorMessageForIncorrectInitialPath", "Error during the backup operation: the initial path is incorrect!"),
+ EXCEPTION_MESSAGE_TITLE("ExceptionMessageTitle", "Error..."),
+ EXCEPTION_MESSAGE_CLIPBOARD_MESSAGE("ExceptionMessageClipboardMessage", "Error text has been copied to the clipboard."),
+ EXCEPTION_MESSAGE_CLIPBOARD_BUTTON("ExceptionMessageClipboardButton", "Copy to clipboard"),
+ EXCEPTION_MESSAGE_REPORT_BUTTON("ExceptionMessageReportButton", "Report the Problem"),
+ EXCEPTION_MESSAGE_REPORT_MESSAGE("ExceptionMessageReportMessage", "Please report this error, either with an image of the screen or by copying the following error text (it is appreciable to provide a description of the operations performed before the error):"),
+ ERROR_MESSAGE_OPENING_WEBSITE("ErrorMessageOpeningWebsite", "Failed to open the web page. Please try again."),
+ CONFIRMATION_MESSAGE_FOR_CLEAR("ConfirmationMessageForClear", "Are you sure you want to clean the fields?"),
+ CONFIRMATION_MESSAGE_FOR_UNSAVED_CHANGES("ConfirmationMessageForUnsavedChanges", "There are unsaved changes, do you want to save them before moving to another backup?"),
+ ERROR_MESSAGE_OPEN_HISTORY_FILE("ErrorMessageOpenHistoryFile", "Error opening history file."),
+ CONFIRMATION_MESSAGE_BEFORE_DELETE_BACKUP("ConfirmationMessageBeforeDeleteBackup", "Are you sure you want to delete this item? Please note, this action cannot be undone"),
+ SHARE_LINK_COPIED_MESSAGE("ShareLinkCopiedMessage", "Share link copied to clipboard!"),
+ CONFIRMATION_MESSAGE_CANCEL_AUTO_BACKUP("ConfirmationMessageCancelAutoBackup", "Are you sure you want to cancel automatic backups for this entry?"),
+ CONFIRMATION_MESSAGE_CANCEL_SINGLE_BACKUP("ConfirmationMessageCancelSingleBackup", "Are you sure you want to cancel this backup?"),
+ CONFIRMATION_MESSAGE_BEFORE_EXIT("ConfirmationMessageBeforeExit", "Are you sure you want to exit?"),
+ ERROR_MESSAGE_UNEXPECTED("ErrorMessageUnexpected", "An unexpected error has occurred!"),
+ ERROR_MESSAGE_PATHS_CANNOT_BE_SAME("ErrorMessagePathsCannotBeSame", "The initial path and destination path cannot be the same!"),
+ ERROR_MESSAGE_PATHS_ARE_EMPTY("ErrorMessagePathsAreEmpty", "The initial path and destination path cannot be empty!"),
+ ERROR_MESSAGE_INVALID_PATH("ErrorMessageInvalidPath", "The selected path is invalid!"),
+ ERROR_MESSAGE_NOT_SUPPORTED_EMAIL("ErrorMessageNotSupportedEmail", "Your system does not support sending emails directly from this application."),
+ ERROR_MESSAGE_NOT_SUPPORTED_EMAIL_GENERIC("ErrorMessageNotSupportedEmailGeneric", "Your system does not support sending emails."),
+ ERROR_WRONG_TIME_INTERVAL("ErrorWrongTimeInterval", "The time interval is not correct"),
+ AUTO_BACKUP_ACTIVATED_MESSAGE("AutoBackupActivatedMessage", "Auto Backup has been activated"),
+ SETTED_EVERY_MESSAGE("SettedEveryMessage", "\nIs setted every"),
+ DAYS_MESSAGE("DaysMessage", " days"),
+ ERROR_MESSAGE_UNABLE_TO_SEND_EMAIL("ErrorMessageUnableToSendEmail", "Unable to send email. Please try again later."),
+ INTERRUPT_BACKUP_PROCESS_MESSAGE("InterruptBackupProcessMessage", "Are you sure you want to stop this backup?"),
+ ERROR_MESSAGE_INPUT_MISSING_GENERIC("ErrorMessageInputMissingGeneric", "Input Missing!"),
+ ERROR_MESSAGE_SAVING_FILE("ErrorMessageForSavingFile", "Error saving file"),
+ ERROR_MESSAGE_PATH_NOT_EXISTING("ErrorMessageForPathNotExisting", "One or both paths do not exist!"),
+ ERROR_MESSAGE_SAME_PATHS_GENERIC("ErrorMessageForSamePaths", "The initial path and destination path cannot be the same. Please choose different paths!"),
+
+ // InfoPage
+ INFO_PAGE_DESCRIPTION("InfoPageDescription", "Backup automatic system for files with the option to schedule and make backups regularly."),
+ INFO_PAGE_FEATURES_TITLE("InfoPageFeaturesTitle", "Features"),
+ INFO_PAGE_FEATURES_DESCRIPTION("InfoPageFeaturesDescription", "Backup files quickly and easily with automatic scheduling and periodic backups"),
+ INFO_PAGE_BUTTON_TITLE("InfoPageButtonTitle", "OK"),
+ INFO_PAGE_VERSION("InfoPageVersion", "Version: "),
+ INFO_PAGE_DEVELOPER("InfoPageDeveloper", "Developer: "),
+ INFO_PAGE_CREDITS("InfoPageCredits", "Credits"),
+ INFO_PAGE_LICENSE("InfoPageLicense", "License");
+
+ private final String keyName;
+ private final String defaultValue;
+
+ private static final Map lookup = new HashMap<>();
+
+ static {
+ for (TranslationKey key : TranslationKey.values()) {
+ lookup.put(key.keyName, key);
+ }
+ }
+
+ // Constructor to assign both key and default value
+ TranslationKey(String keyName, String defaultValue) {
+ this.keyName = keyName;
+ this.defaultValue = defaultValue;
+ }
+
+ public String getKeyName() {
+ return keyName;
+ }
+
+ public String getDefaultValue() {
+ return defaultValue;
+ }
+
+ // Lookup by keyName (JSON key)
+ public static TranslationKey fromKeyName(String keyName) {
+ return lookup.get(keyName);
+ }
+
+ @Override
+ public String toString() {
+ return keyName;
+ }
+ }
+
+ public static void loadTranslations(String filePath) throws IOException, ParseException {
+ JSONParser parser = new JSONParser();
+
+ try (FileReader reader = new FileReader(filePath)) {
+ JSONObject jsonObject = (JSONObject) parser.parse(reader);
+
+ for (TranslationCategory category : TranslationCategory.values()) {
+ JSONObject categoryTranslations = (JSONObject) jsonObject.get(category.getCategoryName());
+
+ if (categoryTranslations != null) {
+ for (Object keyObj : categoryTranslations.keySet()) {
+ String key = (String) keyObj;
+ String value = (String) categoryTranslations.get(key);
+
+ // Use fromKeyName to get the TranslationKey from the JSON key
+ TranslationKey translationKey = TranslationKey.fromKeyName(key);
+ if (translationKey != null) {
+ // If value is null or empty, fall back to the default value from the enum
+ String translationValue = (value != null && !value.isEmpty()) ? value : translationKey.getDefaultValue();
+ category.addTranslation(translationKey, translationValue);
+ } else {
+ // If the key is not recognized in the enum, log it and use the default value
+ System.err.println("Warning: Unrecognized key in JSON: " + key + ", using default value.");
+ category.addTranslation(translationKey, translationKey.getDefaultValue());
+ }
+ }
+ }
+ }
+ }
+ }
+
+ public static String getTranslation(TranslationCategory category, TranslationKey key) {
+ return category.translations.getOrDefault(key, key.getDefaultValue()); // Use default value if not found
+ }
+
+ // only for test
+ public static void main(String[] args) {
+ try {
+ loadTranslations("src/main/resources/res/languages/ita.json");
+
+ System.out.println(TranslationCategory.MENU.getTranslation(TranslationKey.FILE));
+ System.out.println(TranslationCategory.DIALOGS.getTranslation(TranslationKey.ERROR_GENERIC_TITLE));
+
+ } catch (IOException | ParseException e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/src/main/java/com/mycompany/autobackupprogram/BackupManagerGUI.form b/src/main/java/com/mycompany/autobackupprogram/GUI/BackupManagerGUI.form
similarity index 97%
rename from src/main/java/com/mycompany/autobackupprogram/BackupManagerGUI.form
rename to src/main/java/com/mycompany/autobackupprogram/GUI/BackupManagerGUI.form
index 9882f6e..9245087 100644
--- a/src/main/java/com/mycompany/autobackupprogram/BackupManagerGUI.form
+++ b/src/main/java/com/mycompany/autobackupprogram/GUI/BackupManagerGUI.form
@@ -165,6 +165,9 @@
-