From e70ea2303ac07f591a53459dd5e035f916b64d86 Mon Sep 17 00:00:00 2001 From: Edi Morales Date: Mon, 4 Mar 2024 03:42:12 -0600 Subject: [PATCH 01/12] Initial commit --- README.md | 16 ++++++++-------- src/main/java/jpass/ui/JPassFrame.java | 15 +++++++++++++++ .../resources/resources/images/check_mark.svg | 18 ++++++++++++++++++ 3 files changed, 41 insertions(+), 8 deletions(-) create mode 100644 src/main/resources/resources/images/check_mark.svg diff --git a/README.md b/README.md index 74b8cb23..a2e59eb7 100644 --- a/README.md +++ b/README.md @@ -55,15 +55,15 @@ Configuration Default configurations can be overridden in `jpass.properties` file: -| Configuration key | Value type | Default value | -| ---------------------------------- | ---------- | ---------------- | -| ui.theme.dark.mode.enabled | boolean | `false` | -| clear.clipboard.on.exit.enabled | boolean | `false` | -| default.password.generation.length | integer | `14` | -| date.format | string | `yyyy-MM-dd` | +| Configuration key | Value type | Default value | +| ---------------------------------- | ---------- | -------------- | +| ui.theme.dark.mode.enabled | boolean | `false` | +| clear.clipboard.on.exit.enabled | boolean | `false` | +| default.password.generation.length | integer | `14` | +| date.format | string | `yyyy-MM-dd` | | entry.details | list | `TITLE,MODIFIED` | -| file.chooser.directory | string | `./` | -| language.languageSetting | string | en-US | +| file.chooser.directory | string | `./` | +| language.languageSetting | string | `en-US` | Regarding `language.languageSetting` please check [languages](https://github.com/gaborbata/jpass/tree/master/src/main/resources/resources/languages) diff --git a/src/main/java/jpass/ui/JPassFrame.java b/src/main/java/jpass/ui/JPassFrame.java index 300f1366..e410f5ab 100644 --- a/src/main/java/jpass/ui/JPassFrame.java +++ b/src/main/java/jpass/ui/JPassFrame.java @@ -51,6 +51,7 @@ import java.util.stream.Stream; import javax.swing.JFrame; +import javax.swing.JMenuItem; import javax.swing.JTable; import javax.swing.JMenu; import javax.swing.JMenuBar; @@ -96,6 +97,7 @@ public final class JPassFrame extends JFrame { private final JMenu fileMenu; private final JMenu editMenu; private final JMenu toolsMenu; + private final JMenu settingsMenu; private final JMenu helpMenu; private final JToolBar toolBar; private final JScrollPane scrollPane; @@ -182,6 +184,18 @@ private JPassFrame(String fileName, Locale locale) { this.toolsMenu.add(MenuActionType.CLEAR_CLIPBOARD.getAction()); this.jpassMenuBar.add(this.toolsMenu); + this.settingsMenu = new JMenu("Settings"); + this.settingsMenu.setMnemonic(KeyEvent.VK_S); + JMenu languageMenu = new JMenu("Language"); + JMenuItem english = new JMenuItem("English"); + JMenuItem spanish = new JMenuItem("Spanish"); + english.addActionListener(e -> LOG.log(Level.INFO, "Click on english")); + english.setIcon(getIcon("check_mark")); + languageMenu.add(english); + languageMenu.add(spanish); + settingsMenu.add(languageMenu); + this.jpassMenuBar.add(this.settingsMenu); + this.helpMenu = new JMenu(localizedMessages.getString(HELP_MENU)); this.helpMenu.setMnemonic(KeyEvent.VK_H); this.helpMenu.add(MenuActionType.LICENSE.getAction()); @@ -374,6 +388,7 @@ public SearchPanel getSearchPanel() { /** * Gets the resource bundle for localization + * * @return resource bundle */ public static ResourceBundle getLocalizedMessages() { diff --git a/src/main/resources/resources/images/check_mark.svg b/src/main/resources/resources/images/check_mark.svg new file mode 100644 index 00000000..6f8a51d6 --- /dev/null +++ b/src/main/resources/resources/images/check_mark.svg @@ -0,0 +1,18 @@ + + + + + + + + From ed274b74e1ebe80c62446b61d69eddc78eb6844c Mon Sep 17 00:00:00 2001 From: Edi Morales Date: Thu, 7 Mar 2024 06:25:41 -0600 Subject: [PATCH 02/12] Adding supported languages dinamically --- src/main/java/jpass/ui/JPassFrame.java | 46 +++++++++++++++---- src/main/java/jpass/util/Constants.java | 3 ++ .../languages/languages_en_US.properties | 3 ++ .../languages/languages_es_MX.properties | 6 ++- 4 files changed, 49 insertions(+), 9 deletions(-) diff --git a/src/main/java/jpass/ui/JPassFrame.java b/src/main/java/jpass/ui/JPassFrame.java index e410f5ab..586d2d8a 100644 --- a/src/main/java/jpass/ui/JPassFrame.java +++ b/src/main/java/jpass/ui/JPassFrame.java @@ -38,12 +38,15 @@ import java.awt.BorderLayout; import java.awt.Dimension; +import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; +import java.util.HashMap; import java.util.List; import java.util.Locale; +import java.util.Map; import java.util.ResourceBundle; import java.util.logging.Level; import java.util.logging.Logger; @@ -71,6 +74,8 @@ import static jpass.util.Constants.EDIT_MENU; import static jpass.util.Constants.FILE_MENU; import static jpass.util.Constants.HELP_MENU; +import static jpass.util.Constants.LANGUAGE_EN_US; +import static jpass.util.Constants.LANGUAGE_ES_MX; import static jpass.util.Constants.PANEL_SAVE_MODIFIED_QUESTION_MESSAGE; import static jpass.util.Constants.TOOLS_MENU; @@ -82,10 +87,11 @@ */ public final class JPassFrame extends JFrame { - private static ResourceBundle localizedMessages; private static final Logger LOG = Logger.getLogger(JPassFrame.class.getName()); private static JPassFrame instance; + private static ResourceBundle localizedMessages; + private static final Map SUPPORTED_LANGUAGES = new HashMap<>(); public static final String PROGRAM_NAME = "JPass Password Manager"; public static final String PROGRAM_VERSION = "1.0.6-SNAPSHOT"; @@ -116,7 +122,8 @@ private JPassFrame(String fileName, Locale locale) { LOG.log(Level.CONFIG, "Could not set application icon.", e); } - localizedMessages = ResourceBundle.getBundle("resources.languages.languages", locale); + setLocalizedMessages(ResourceBundle.getBundle("resources.languages.languages", locale)); + setSupportedLanguages(); this.toolBar = new JToolBar(); this.toolBar.setFloatable(false); @@ -186,13 +193,22 @@ private JPassFrame(String fileName, Locale locale) { this.settingsMenu = new JMenu("Settings"); this.settingsMenu.setMnemonic(KeyEvent.VK_S); + JMenu languageMenu = new JMenu("Language"); - JMenuItem english = new JMenuItem("English"); - JMenuItem spanish = new JMenuItem("Spanish"); - english.addActionListener(e -> LOG.log(Level.INFO, "Click on english")); - english.setIcon(getIcon("check_mark")); - languageMenu.add(english); - languageMenu.add(spanish); + + ActionListener menuItemActionListener = e -> { + LOG.log(Level.INFO, "Clicking on language"); + String command = e.getActionCommand(); + LOG.log(Level.INFO, String.format("Calling AL with command %s", command)); + }; + + SUPPORTED_LANGUAGES.forEach((k, v) -> { + JMenuItem language = new JMenuItem(v); + language.setActionCommand(k); + language.addActionListener(menuItemActionListener); + languageMenu.add(language); + }); + settingsMenu.add(languageMenu); this.jpassMenuBar.add(this.settingsMenu); @@ -368,6 +384,15 @@ public void setProcessing(boolean processing) { this.statusPanel.setProcessing(processing); } + /** + * Sets the resource bundle for localization + * + * @param localizedMessages resource bundle + */ + public static void setLocalizedMessages(ResourceBundle localizedMessages) { + JPassFrame.localizedMessages = localizedMessages; + } + /** * Gets the processing state of this frame. * @@ -394,4 +419,9 @@ public SearchPanel getSearchPanel() { public static ResourceBundle getLocalizedMessages() { return localizedMessages; } + + public static void setSupportedLanguages() { + SUPPORTED_LANGUAGES.put("en-US", localizedMessages.getString(LANGUAGE_EN_US)); + SUPPORTED_LANGUAGES.put("es-MX", localizedMessages.getString(LANGUAGE_ES_MX)); + } } diff --git a/src/main/java/jpass/util/Constants.java b/src/main/java/jpass/util/Constants.java index a150f6bb..257ca085 100644 --- a/src/main/java/jpass/util/Constants.java +++ b/src/main/java/jpass/util/Constants.java @@ -93,4 +93,7 @@ private Constants() { public static final String PANEL_OPEN = "panel.open"; public static final String PANEL_SAVE_MODIFIED_QUESTION_MESSAGE = "panel.saveModifiedQuestionMessage"; public static final String PANEL_UNENCRYPTED_DATA_WARNING_MESSAGE = "panel.unencryptedDataWarningMessage"; + + public static final String LANGUAGE_EN_US = "language.en.us"; + public static final String LANGUAGE_ES_MX = "language.es.mx"; } diff --git a/src/main/resources/resources/languages/languages_en_US.properties b/src/main/resources/resources/languages/languages_en_US.properties index 9dd7bca7..87c2fb25 100644 --- a/src/main/resources/resources/languages/languages_en_US.properties +++ b/src/main/resources/resources/languages/languages_en_US.properties @@ -87,3 +87,6 @@ panel.save=Save panel.open=Open panel.saveModifiedQuestionMessage=The current file has been modified.\nDo you want to save the changes before closing? panel.unencryptedDataWarningMessage=Please note that all data will be stored unencrypted.\nMake sure you keep the exported file in a secure location. + +language.en.us=English +language.es.mx=Spanish diff --git a/src/main/resources/resources/languages/languages_es_MX.properties b/src/main/resources/resources/languages/languages_es_MX.properties index c2efa1ad..d6e42b17 100644 --- a/src/main/resources/resources/languages/languages_es_MX.properties +++ b/src/main/resources/resources/languages/languages_es_MX.properties @@ -14,6 +14,7 @@ fileMenu.changePassword=Cambiar Contrase fileMenu.exitMenu=Salir password.enterPasswordRequest=Por favor, introduce una contraseńa. +password.generatePasswordRequest=Por favor, genere una contraseńa. password.passwordNotModified=La contraseńa no ha sido modificada. password.successfullyModified=La contraseńa ha sido modificada exitosamente.\n\nGuarda el archivo ahora para asegurarse que la nueva contraseńa fue aplicada. password.passwordsNotIdentical=La contraseńa y contraseńa de confirmación no son identicas. @@ -67,7 +68,7 @@ buttonMessage.close=Cerrar entryDialog.showEntry=Mostrar entryDialog.generateEntry=Generar entryDialog.copyEntry=Copiar -entryDialog.fillTitleField=Please fill the title field. +entryDialog.fillTitleField=Por favor, complete el campo de título. entryDialog.titleAlreadyExists=El título ya existe,\nPor favor introduzca un título diferente. entryDialog.pleaseSelectEntry=Por favor, selecciona una entrada. entryDialog.wantDeleteEntry=żRealmente quieres eliminar esta entrada? @@ -86,3 +87,6 @@ panel.save=Guardar panel.open=Abrir panel.saveModifiedQuestionMessage=El archivo actual ha sido modificado.\nżDeseas guardar los cambios antes de cerrar el programa? panel.unencryptedDataWarningMessage=Note que toda la data se almancenará sin cifrar.\nAsegúrese de guardar el archivo exportado en un lugar seguro. + +language.en.us=Inglish +language.es.mx=Pikinglish From dede15d8812dc94fcffe6994202eb7efb89e41ee Mon Sep 17 00:00:00 2001 From: Edi Morales Date: Thu, 7 Mar 2024 07:03:31 -0600 Subject: [PATCH 03/12] Adding constants and first working version --- src/main/config/jpass.properties | 5 ++++- src/main/java/jpass/ui/JPassFrame.java | 20 ++++++++++++++----- src/main/java/jpass/util/Constants.java | 2 ++ .../languages/languages_en_US.properties | 2 ++ .../languages/languages_es_MX.properties | 6 ++++-- .../languages/languages_hu_HU.properties | 4 ++++ .../languages/languages_it_IT.properties | 5 +++++ 7 files changed, 36 insertions(+), 8 deletions(-) diff --git a/src/main/config/jpass.properties b/src/main/config/jpass.properties index 702c7dbd..0ea2fd32 100644 --- a/src/main/config/jpass.properties +++ b/src/main/config/jpass.properties @@ -44,4 +44,7 @@ date.format=yyyy-MM-dd file.chooser.directory=./ # Locale ID to set the program language -language.languageSetting=en-US \ No newline at end of file +#language.languageSetting=en-US +#language.languageSetting=es-MX +#language.languageSetting=hu-HU +language.languageSetting=it-IT \ No newline at end of file diff --git a/src/main/java/jpass/ui/JPassFrame.java b/src/main/java/jpass/ui/JPassFrame.java index 586d2d8a..76ed2f62 100644 --- a/src/main/java/jpass/ui/JPassFrame.java +++ b/src/main/java/jpass/ui/JPassFrame.java @@ -76,6 +76,8 @@ import static jpass.util.Constants.HELP_MENU; import static jpass.util.Constants.LANGUAGE_EN_US; import static jpass.util.Constants.LANGUAGE_ES_MX; +import static jpass.util.Constants.LANGUAGE_HU_HU; +import static jpass.util.Constants.LANGUAGE_IT_IT; import static jpass.util.Constants.PANEL_SAVE_MODIFIED_QUESTION_MESSAGE; import static jpass.util.Constants.TOOLS_MENU; @@ -122,7 +124,7 @@ private JPassFrame(String fileName, Locale locale) { LOG.log(Level.CONFIG, "Could not set application icon.", e); } - setLocalizedMessages(ResourceBundle.getBundle("resources.languages.languages", locale)); + setLocalizedMessages(locale); setSupportedLanguages(); this.toolBar = new JToolBar(); @@ -197,9 +199,9 @@ private JPassFrame(String fileName, Locale locale) { JMenu languageMenu = new JMenu("Language"); ActionListener menuItemActionListener = e -> { - LOG.log(Level.INFO, "Clicking on language"); String command = e.getActionCommand(); LOG.log(Level.INFO, String.format("Calling AL with command %s", command)); + refreshComponentsWithLanguage(command); }; SUPPORTED_LANGUAGES.forEach((k, v) -> { @@ -343,6 +345,12 @@ public void refreshAll() { refreshEntryTitleList(null); } + public void refreshComponentsWithLanguage(String localeTag) { + Locale locale = Locale.forLanguageTag(localeTag); + setLocalizedMessages(locale); + fileMenu.setText(localizedMessages.getString(FILE_MENU)); + } + /** * Exits the application. */ @@ -387,10 +395,10 @@ public void setProcessing(boolean processing) { /** * Sets the resource bundle for localization * - * @param localizedMessages resource bundle + * @param locale locale for the resources bundle */ - public static void setLocalizedMessages(ResourceBundle localizedMessages) { - JPassFrame.localizedMessages = localizedMessages; + public static void setLocalizedMessages(Locale locale) { + JPassFrame.localizedMessages = ResourceBundle.getBundle("resources.languages.languages", locale); } /** @@ -423,5 +431,7 @@ public static ResourceBundle getLocalizedMessages() { public static void setSupportedLanguages() { SUPPORTED_LANGUAGES.put("en-US", localizedMessages.getString(LANGUAGE_EN_US)); SUPPORTED_LANGUAGES.put("es-MX", localizedMessages.getString(LANGUAGE_ES_MX)); + SUPPORTED_LANGUAGES.put("hu-HU", localizedMessages.getString(LANGUAGE_HU_HU)); + SUPPORTED_LANGUAGES.put("it-IT", localizedMessages.getString(LANGUAGE_IT_IT)); } } diff --git a/src/main/java/jpass/util/Constants.java b/src/main/java/jpass/util/Constants.java index 257ca085..27ca1e6b 100644 --- a/src/main/java/jpass/util/Constants.java +++ b/src/main/java/jpass/util/Constants.java @@ -96,4 +96,6 @@ private Constants() { public static final String LANGUAGE_EN_US = "language.en.us"; public static final String LANGUAGE_ES_MX = "language.es.mx"; + public static final String LANGUAGE_HU_HU = "language.hu.hu"; + public static final String LANGUAGE_IT_IT = "language.it.it"; } diff --git a/src/main/resources/resources/languages/languages_en_US.properties b/src/main/resources/resources/languages/languages_en_US.properties index 87c2fb25..81c17169 100644 --- a/src/main/resources/resources/languages/languages_en_US.properties +++ b/src/main/resources/resources/languages/languages_en_US.properties @@ -90,3 +90,5 @@ panel.unencryptedDataWarningMessage=Please note that all data will be stored une language.en.us=English language.es.mx=Spanish +language.hu.hu=Hungarian +language.it.it=Italian diff --git a/src/main/resources/resources/languages/languages_es_MX.properties b/src/main/resources/resources/languages/languages_es_MX.properties index d6e42b17..2338f900 100644 --- a/src/main/resources/resources/languages/languages_es_MX.properties +++ b/src/main/resources/resources/languages/languages_es_MX.properties @@ -88,5 +88,7 @@ panel.open=Abrir panel.saveModifiedQuestionMessage=El archivo actual ha sido modificado.\nżDeseas guardar los cambios antes de cerrar el programa? panel.unencryptedDataWarningMessage=Note que toda la data se almancenará sin cifrar.\nAsegúrese de guardar el archivo exportado en un lugar seguro. -language.en.us=Inglish -language.es.mx=Pikinglish +language.en.us=Inglés +language.es.mx=Espańol +language.hu.hu=Húngaro +language.it.it=Italiano diff --git a/src/main/resources/resources/languages/languages_hu_HU.properties b/src/main/resources/resources/languages/languages_hu_HU.properties index ac609949..4f7c298b 100644 --- a/src/main/resources/resources/languages/languages_hu_HU.properties +++ b/src/main/resources/resources/languages/languages_hu_HU.properties @@ -87,3 +87,7 @@ panel.open=Megnyitás panel.saveModifiedQuestionMessage=A jelenlegi fájl mĂłdosĂ­tva lett.\nMenteni szeretnĂ© a változtatásokat bezárás elĹ‘tt? panel.unencryptedDataWarningMessage=FelhĂ­vjuk figyelmĂ©t, hogy az adatok titkosĂ­tás nĂ©lkĂĽl lesznek tárolva.\nBizonyosodjon meg rĂłla, hogy az exportált fájlt biztonságos helyre menti. +language.en.us=Angol +language.es.mx=Spanyol +language.hu.hu=Magyar +language.it.it=Olasz diff --git a/src/main/resources/resources/languages/languages_it_IT.properties b/src/main/resources/resources/languages/languages_it_IT.properties index 5a3f1d79..b1992ca5 100644 --- a/src/main/resources/resources/languages/languages_it_IT.properties +++ b/src/main/resources/resources/languages/languages_it_IT.properties @@ -87,3 +87,8 @@ panel.save=Salva panel.open=Apri panel.saveModifiedQuestionMessage=Il file attuale è stato modificato.\nVuoi salvare le modifiche prima della chiusura? panel.unencryptedDataWarningMessage=Nota che tutti i dati verranno archiviati non crittografati.\nAssicurati di conservare il file esportato in un luogo sicuro. + +language.en.us=Inglese +language.es.mx=Spagnolo +language.hu.hu=Ungherese +language.it.it=Italiano From 5c9e9d0109341242139c723452712a171b9a9eff Mon Sep 17 00:00:00 2001 From: Edi Morales Date: Thu, 7 Mar 2024 15:32:44 -0600 Subject: [PATCH 04/12] Adds refresh method --- src/main/config/jpass.properties | 5 +- src/main/java/jpass/ui/JPassFrame.java | 62 +++++++++++++------ src/main/java/jpass/util/Constants.java | 3 + .../languages/languages_en_US.properties | 3 + .../languages/languages_es_MX.properties | 3 + 5 files changed, 54 insertions(+), 22 deletions(-) diff --git a/src/main/config/jpass.properties b/src/main/config/jpass.properties index 0ea2fd32..07fe1904 100644 --- a/src/main/config/jpass.properties +++ b/src/main/config/jpass.properties @@ -44,7 +44,4 @@ date.format=yyyy-MM-dd file.chooser.directory=./ # Locale ID to set the program language -#language.languageSetting=en-US -#language.languageSetting=es-MX -#language.languageSetting=hu-HU -language.languageSetting=it-IT \ No newline at end of file +language.languageSetting=es-MX diff --git a/src/main/java/jpass/ui/JPassFrame.java b/src/main/java/jpass/ui/JPassFrame.java index 76ed2f62..ffea0e87 100644 --- a/src/main/java/jpass/ui/JPassFrame.java +++ b/src/main/java/jpass/ui/JPassFrame.java @@ -38,7 +38,6 @@ import java.awt.BorderLayout; import java.awt.Dimension; -import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.util.ArrayList; import java.util.Collections; @@ -53,6 +52,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import javax.swing.Action; import javax.swing.JFrame; import javax.swing.JMenuItem; import javax.swing.JTable; @@ -79,6 +79,8 @@ import static jpass.util.Constants.LANGUAGE_HU_HU; import static jpass.util.Constants.LANGUAGE_IT_IT; import static jpass.util.Constants.PANEL_SAVE_MODIFIED_QUESTION_MESSAGE; +import static jpass.util.Constants.SETTINGS_MENU; +import static jpass.util.Constants.SETTINGS_MENU_LANGUAGE; import static jpass.util.Constants.TOOLS_MENU; /** @@ -193,24 +195,20 @@ private JPassFrame(String fileName, Locale locale) { this.toolsMenu.add(MenuActionType.CLEAR_CLIPBOARD.getAction()); this.jpassMenuBar.add(this.toolsMenu); - this.settingsMenu = new JMenu("Settings"); + this.settingsMenu = new JMenu(localizedMessages.getString(SETTINGS_MENU)); this.settingsMenu.setMnemonic(KeyEvent.VK_S); - JMenu languageMenu = new JMenu("Language"); + JMenu languageMenu = new JMenu(localizedMessages.getString(SETTINGS_MENU_LANGUAGE)); - ActionListener menuItemActionListener = e -> { - String command = e.getActionCommand(); - LOG.log(Level.INFO, String.format("Calling AL with command %s", command)); - refreshComponentsWithLanguage(command); - }; - - SUPPORTED_LANGUAGES.forEach((k, v) -> { - JMenuItem language = new JMenuItem(v); - language.setActionCommand(k); - language.addActionListener(menuItemActionListener); + SUPPORTED_LANGUAGES.forEach((key, value) -> { + JMenuItem language = new JMenuItem(localizedMessages.getString(value)); + language.setActionCommand(key); + language.addActionListener(e -> { + String command = e.getActionCommand(); + refreshComponentsWithLanguage(command); + }); languageMenu.add(language); }); - settingsMenu.add(languageMenu); this.jpassMenuBar.add(this.settingsMenu); @@ -347,8 +345,36 @@ public void refreshAll() { public void refreshComponentsWithLanguage(String localeTag) { Locale locale = Locale.forLanguageTag(localeTag); + setLocalizedMessages(locale); + setSupportedLanguages(); + fileMenu.setText(localizedMessages.getString(FILE_MENU)); + editMenu.setText(localizedMessages.getString(EDIT_MENU)); + toolsMenu.setText(localizedMessages.getString(TOOLS_MENU)); + settingsMenu.setText(localizedMessages.getString(SETTINGS_MENU)); + helpMenu.setText(localizedMessages.getString(HELP_MENU)); + + updateMenuComponents(fileMenu); + updateMenuComponents(editMenu); + updateMenuComponents(toolsMenu); + updateMenuComponents(settingsMenu); + updateMenuComponents(helpMenu); + + refreshEntryTitleList(null); + } + + public void updateMenuComponents(JMenu menu) { + for (int i = 0; i < menu.getItemCount(); i++) { + JMenuItem item = menu.getItem(i); + if (null != item && null != item.getAction()) { + String actionName = (String) item.getAction().getValue(Action.NAME); + if (null != actionName) { + LOG.log(Level.INFO, String.format("ActionName: %s", actionName)); + item.setText(localizedMessages.getString(actionName)); + } + } + } } /** @@ -429,9 +455,9 @@ public static ResourceBundle getLocalizedMessages() { } public static void setSupportedLanguages() { - SUPPORTED_LANGUAGES.put("en-US", localizedMessages.getString(LANGUAGE_EN_US)); - SUPPORTED_LANGUAGES.put("es-MX", localizedMessages.getString(LANGUAGE_ES_MX)); - SUPPORTED_LANGUAGES.put("hu-HU", localizedMessages.getString(LANGUAGE_HU_HU)); - SUPPORTED_LANGUAGES.put("it-IT", localizedMessages.getString(LANGUAGE_IT_IT)); + SUPPORTED_LANGUAGES.put("en-US", LANGUAGE_EN_US); + SUPPORTED_LANGUAGES.put("es-MX", LANGUAGE_ES_MX); + SUPPORTED_LANGUAGES.put("hu-HU", LANGUAGE_HU_HU); + SUPPORTED_LANGUAGES.put("it-IT", LANGUAGE_IT_IT); } } diff --git a/src/main/java/jpass/util/Constants.java b/src/main/java/jpass/util/Constants.java index 27ca1e6b..62bb6240 100644 --- a/src/main/java/jpass/util/Constants.java +++ b/src/main/java/jpass/util/Constants.java @@ -8,6 +8,7 @@ private Constants() { public static final String FILE_MENU = "menuBar.fileMenu"; public static final String EDIT_MENU = "menuBar.editMenu"; public static final String TOOLS_MENU = "menuBar.toolsMenu"; + public static final String SETTINGS_MENU = "menuBar.settingsMenu"; public static final String HELP_MENU = "menuBar.helpMenu"; public static final String FILE_MENU_NEW = "fileMenu.new"; @@ -41,6 +42,8 @@ private Constants() { public static final String TOOLS_MENU_GENERATE_PASSWORD = "toolsMenu.generatePassword"; + public static final String SETTINGS_MENU_LANGUAGE = "settingsMenu.language"; + public static final String HELP_MENU_LICENSE = "helpMenu.license"; public static final String HELP_MENU_ABOUT_JPASS = "helpMenu.aboutJpass"; diff --git a/src/main/resources/resources/languages/languages_en_US.properties b/src/main/resources/resources/languages/languages_en_US.properties index 81c17169..0ab1b4e9 100644 --- a/src/main/resources/resources/languages/languages_en_US.properties +++ b/src/main/resources/resources/languages/languages_en_US.properties @@ -2,6 +2,7 @@ menuBar.fileMenu=File menuBar.editMenu=Edit menuBar.toolsMenu=Tools +menuBar.settingsMenu=Settings menuBar.helpMenu=Help fileMenu.new=New @@ -35,6 +36,8 @@ editMenu.findEntry=Find Entry toolsMenu.generatePassword=Generate Password... +settingsMenu.language=Language + helpMenu.license=License helpMenu.aboutJpass=About JPass... diff --git a/src/main/resources/resources/languages/languages_es_MX.properties b/src/main/resources/resources/languages/languages_es_MX.properties index 2338f900..b2bc22e1 100644 --- a/src/main/resources/resources/languages/languages_es_MX.properties +++ b/src/main/resources/resources/languages/languages_es_MX.properties @@ -2,6 +2,7 @@ menuBar.fileMenu=Archivo menuBar.editMenu=Editar menuBar.toolsMenu=Herramientas +menuBar.settingsMenu=Ajustes menuBar.helpMenu=Ayuda fileMenu.new=Nuevo @@ -35,6 +36,8 @@ editMenu.findEntry=Buscar Entrada toolsMenu.generatePassword=Generar Contraseńa... +settingsMenu.language=Idioma + helpMenu.license=Licencia helpMenu.aboutJpass=Acerca de JPass... From 411b4e13bee4183f23955d7941f603346cc6f1bb Mon Sep 17 00:00:00 2001 From: Edi Morales Date: Thu, 7 Mar 2024 15:34:22 -0600 Subject: [PATCH 05/12] Sets en-US as default --- src/main/config/jpass.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/config/jpass.properties b/src/main/config/jpass.properties index 07fe1904..5df42fb7 100644 --- a/src/main/config/jpass.properties +++ b/src/main/config/jpass.properties @@ -44,4 +44,4 @@ date.format=yyyy-MM-dd file.chooser.directory=./ # Locale ID to set the program language -language.languageSetting=es-MX +language.languageSetting=en-US From 9583a466dd9eaa2da579a2ba61f5e4f3c9c1d135 Mon Sep 17 00:00:00 2001 From: Edi Morales Date: Fri, 8 Mar 2024 00:54:22 -0600 Subject: [PATCH 06/12] Updates GUI when user selects a language --- src/main/java/jpass/ui/JPassFrame.java | 44 ++++++++++-------- .../jpass/ui/action/AbstractMenuAction.java | 10 ++-- .../java/jpass/ui/action/MenuActionType.java | 46 +++++++++---------- .../languages/languages_hu_HU.properties | 3 ++ .../languages/languages_it_IT.properties | 3 ++ 5 files changed, 59 insertions(+), 47 deletions(-) diff --git a/src/main/java/jpass/ui/JPassFrame.java b/src/main/java/jpass/ui/JPassFrame.java index ffea0e87..3cc1772c 100644 --- a/src/main/java/jpass/ui/JPassFrame.java +++ b/src/main/java/jpass/ui/JPassFrame.java @@ -52,7 +52,6 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import javax.swing.Action; import javax.swing.JFrame; import javax.swing.JMenuItem; import javax.swing.JTable; @@ -126,8 +125,8 @@ private JPassFrame(String fileName, Locale locale) { LOG.log(Level.CONFIG, "Could not set application icon.", e); } - setLocalizedMessages(locale); setSupportedLanguages(); + setLocalizedMessages(locale); this.toolBar = new JToolBar(); this.toolBar.setFloatable(false); @@ -199,13 +198,13 @@ private JPassFrame(String fileName, Locale locale) { this.settingsMenu.setMnemonic(KeyEvent.VK_S); JMenu languageMenu = new JMenu(localizedMessages.getString(SETTINGS_MENU_LANGUAGE)); + languageMenu.setActionCommand(SETTINGS_MENU_LANGUAGE); SUPPORTED_LANGUAGES.forEach((key, value) -> { - JMenuItem language = new JMenuItem(localizedMessages.getString(value)); + JMenuItem language = new JMenuItem(localizedMessages.getString(key)); language.setActionCommand(key); language.addActionListener(e -> { - String command = e.getActionCommand(); - refreshComponentsWithLanguage(command); + refreshComponentsWithLanguage(e.getActionCommand()); }); languageMenu.add(language); }); @@ -343,11 +342,9 @@ public void refreshAll() { refreshEntryTitleList(null); } - public void refreshComponentsWithLanguage(String localeTag) { - Locale locale = Locale.forLanguageTag(localeTag); - + private void refreshComponentsWithLanguage(String actionCommand) { + Locale locale = Locale.forLanguageTag(getSupportedLanguages().get(actionCommand)); setLocalizedMessages(locale); - setSupportedLanguages(); fileMenu.setText(localizedMessages.getString(FILE_MENU)); editMenu.setText(localizedMessages.getString(EDIT_MENU)); @@ -364,14 +361,17 @@ public void refreshComponentsWithLanguage(String localeTag) { refreshEntryTitleList(null); } - public void updateMenuComponents(JMenu menu) { + private void updateMenuComponents(JMenu menu) { for (int i = 0; i < menu.getItemCount(); i++) { JMenuItem item = menu.getItem(i); - if (null != item && null != item.getAction()) { - String actionName = (String) item.getAction().getValue(Action.NAME); - if (null != actionName) { - LOG.log(Level.INFO, String.format("ActionName: %s", actionName)); - item.setText(localizedMessages.getString(actionName)); + if (null != item) { + if (null != item.getActionCommand()) { + LOG.log(Level.INFO, String.format("ActionCommand: %s ", item.getActionCommand())); + item.setText(localizedMessages.getString(item.getActionCommand())); + } + + if (item instanceof JMenu) { + updateMenuComponents((JMenu) item); } } } @@ -454,10 +454,14 @@ public static ResourceBundle getLocalizedMessages() { return localizedMessages; } - public static void setSupportedLanguages() { - SUPPORTED_LANGUAGES.put("en-US", LANGUAGE_EN_US); - SUPPORTED_LANGUAGES.put("es-MX", LANGUAGE_ES_MX); - SUPPORTED_LANGUAGES.put("hu-HU", LANGUAGE_HU_HU); - SUPPORTED_LANGUAGES.put("it-IT", LANGUAGE_IT_IT); + private static void setSupportedLanguages() { + SUPPORTED_LANGUAGES.put(LANGUAGE_EN_US, "en-US"); + SUPPORTED_LANGUAGES.put(LANGUAGE_ES_MX, "es-MX"); + SUPPORTED_LANGUAGES.put(LANGUAGE_HU_HU, "hu-HU"); + SUPPORTED_LANGUAGES.put(LANGUAGE_IT_IT, "it-IT"); + } + + private static Map getSupportedLanguages() { + return SUPPORTED_LANGUAGES; } } diff --git a/src/main/java/jpass/ui/action/AbstractMenuAction.java b/src/main/java/jpass/ui/action/AbstractMenuAction.java index 8e61d602..56ea1ad4 100644 --- a/src/main/java/jpass/ui/action/AbstractMenuAction.java +++ b/src/main/java/jpass/ui/action/AbstractMenuAction.java @@ -43,12 +43,14 @@ public abstract class AbstractMenuAction extends AbstractAction { /** * Creates a new menu action. * - * @param text title of the action that appears on UI - * @param icon icon of action - * @param accelerator accelerator key + * @param text title of the action that appears on UI + * @param actionCommandKey + * @param icon icon of action + * @param accelerator accelerator key */ - public AbstractMenuAction(String text, Icon icon, KeyStroke accelerator) { + public AbstractMenuAction(String text, String actionCommandKey, Icon icon, KeyStroke accelerator) { super(text, icon); + putValue(ACTION_COMMAND_KEY, actionCommandKey); putValue(SHORT_DESCRIPTION, text); if (accelerator != null) { putValue(ACCELERATOR_KEY, accelerator); diff --git a/src/main/java/jpass/ui/action/MenuActionType.java b/src/main/java/jpass/ui/action/MenuActionType.java index 58714f13..250908a1 100644 --- a/src/main/java/jpass/ui/action/MenuActionType.java +++ b/src/main/java/jpass/ui/action/MenuActionType.java @@ -41,7 +41,6 @@ import jpass.ui.JPassFrame; import jpass.ui.MessageDialog; import jpass.ui.helper.EntryHelper; -import jpass.util.Constants; import jpass.xml.bind.Entry; import static javax.swing.KeyStroke.getKeyStroke; @@ -56,8 +55,6 @@ import static java.awt.event.InputEvent.CTRL_DOWN_MASK; import static java.awt.event.InputEvent.ALT_DOWN_MASK; -import static jpass.util.Constants.PASSWORD_PASSWORD_NOT_MODIFIED; -import static jpass.util.Constants.PASSWORD_SUCCESSFULLY_MODIFIED; import static jpass.util.Constants.EDIT_MENU_ADD_ENTRY; import static jpass.util.Constants.EDIT_MENU_CLEAR_CLIPBOARD; import static jpass.util.Constants.EDIT_MENU_COPY_PASSWORD; @@ -71,11 +68,14 @@ import static jpass.util.Constants.FILE_MENU_EXIT; import static jpass.util.Constants.FILE_MENU_EXPORT_TO_XML; import static jpass.util.Constants.FILE_MENU_IMPORT_FROM_XML; +import static jpass.util.Constants.FILE_MENU_OPEN_FILE; import static jpass.util.Constants.FILE_MENU_NEW; import static jpass.util.Constants.FILE_MENU_SAVE; import static jpass.util.Constants.FILE_MENU_SAVE_AS; import static jpass.util.Constants.HELP_MENU_ABOUT_JPASS; import static jpass.util.Constants.HELP_MENU_LICENSE; +import static jpass.util.Constants.PASSWORD_PASSWORD_NOT_MODIFIED; +import static jpass.util.Constants.PASSWORD_SUCCESSFULLY_MODIFIED; import static jpass.util.Constants.TOOLS_MENU_GENERATE_PASSWORD; /** @@ -85,43 +85,43 @@ * */ public enum MenuActionType { - NEW_FILE(new AbstractMenuAction(getLocalizedMessages().getString(FILE_MENU_NEW), getIcon("new"), getKeyStroke(KeyEvent.VK_N, CTRL_DOWN_MASK)) { + NEW_FILE(new AbstractMenuAction(getLocalizedMessages().getString(FILE_MENU_NEW), FILE_MENU_NEW, getIcon("new"), getKeyStroke(KeyEvent.VK_N, CTRL_DOWN_MASK)) { @Override public void actionPerformed(ActionEvent ev) { createNew(JPassFrame.getInstance()); } }), - OPEN_FILE(new AbstractMenuAction(getLocalizedMessages().getString(Constants.FILE_MENU_OPEN_FILE), getIcon("open"), getKeyStroke(KeyEvent.VK_O, CTRL_DOWN_MASK)) { + OPEN_FILE(new AbstractMenuAction(getLocalizedMessages().getString(FILE_MENU_OPEN_FILE), FILE_MENU_OPEN_FILE, getIcon("open"), getKeyStroke(KeyEvent.VK_O, CTRL_DOWN_MASK)) { @Override public void actionPerformed(ActionEvent ev) { openFile(JPassFrame.getInstance()); } }), - SAVE_FILE(new AbstractMenuAction(getLocalizedMessages().getString(FILE_MENU_SAVE), getIcon("save"), getKeyStroke(KeyEvent.VK_S, CTRL_DOWN_MASK)) { + SAVE_FILE(new AbstractMenuAction(getLocalizedMessages().getString(FILE_MENU_SAVE), FILE_MENU_SAVE, getIcon("save"), getKeyStroke(KeyEvent.VK_S, CTRL_DOWN_MASK)) { @Override public void actionPerformed(ActionEvent ev) { saveFile(JPassFrame.getInstance(), false); } }), - SAVE_AS_FILE(new AbstractMenuAction(getLocalizedMessages().getString(FILE_MENU_SAVE_AS), getIcon("save_as"), null) { + SAVE_AS_FILE(new AbstractMenuAction(getLocalizedMessages().getString(FILE_MENU_SAVE_AS), FILE_MENU_SAVE_AS, getIcon("save_as"), null) { @Override public void actionPerformed(ActionEvent ev) { saveFile(JPassFrame.getInstance(), true); } }), - EXPORT_XML(new AbstractMenuAction(getLocalizedMessages().getString(FILE_MENU_EXPORT_TO_XML), getIcon("export"), null) { + EXPORT_XML(new AbstractMenuAction(getLocalizedMessages().getString(FILE_MENU_EXPORT_TO_XML), FILE_MENU_EXPORT_TO_XML, getIcon("export"), null) { @Override public void actionPerformed(ActionEvent ev) { exportFile(JPassFrame.getInstance()); } }), - IMPORT_XML(new AbstractMenuAction(getLocalizedMessages().getString(FILE_MENU_IMPORT_FROM_XML), getIcon("import"), null) { + IMPORT_XML(new AbstractMenuAction(getLocalizedMessages().getString(FILE_MENU_IMPORT_FROM_XML), FILE_MENU_IMPORT_FROM_XML, getIcon("import"), null) { @Override public void actionPerformed(ActionEvent ev) { importFile(JPassFrame.getInstance()); } }), - CHANGE_PASSWORD(new AbstractMenuAction(getLocalizedMessages().getString(FILE_MENU_CHANGE_PASSWORD), getIcon("lock"), null) { + CHANGE_PASSWORD(new AbstractMenuAction(getLocalizedMessages().getString(FILE_MENU_CHANGE_PASSWORD), FILE_MENU_CHANGE_PASSWORD, getIcon("lock"), null) { @Override public void actionPerformed(ActionEvent ev) { JPassFrame parent = JPassFrame.getInstance(); @@ -137,19 +137,19 @@ public void actionPerformed(ActionEvent ev) { } } }), - GENERATE_PASSWORD(new AbstractMenuAction(getLocalizedMessages().getString(TOOLS_MENU_GENERATE_PASSWORD), getIcon("generate"), getKeyStroke(KeyEvent.VK_Z, CTRL_DOWN_MASK)) { + GENERATE_PASSWORD(new AbstractMenuAction(getLocalizedMessages().getString(TOOLS_MENU_GENERATE_PASSWORD), TOOLS_MENU_GENERATE_PASSWORD, getIcon("generate"), getKeyStroke(KeyEvent.VK_Z, CTRL_DOWN_MASK)) { @Override public void actionPerformed(ActionEvent ev) { new GeneratePasswordDialog(JPassFrame.getInstance()); } }), - EXIT(new AbstractMenuAction(getLocalizedMessages().getString(FILE_MENU_EXIT), getIcon("exit"), getKeyStroke(KeyEvent.VK_F4, ALT_DOWN_MASK)) { + EXIT(new AbstractMenuAction(getLocalizedMessages().getString(FILE_MENU_EXIT), FILE_MENU_EXIT, getIcon("exit"), getKeyStroke(KeyEvent.VK_F4, ALT_DOWN_MASK)) { @Override public void actionPerformed(ActionEvent ev) { JPassFrame.getInstance().exitFrame(); } }), - ABOUT(new AbstractMenuAction(getLocalizedMessages().getString(HELP_MENU_ABOUT_JPASS), getIcon("info"), getKeyStroke(KeyEvent.VK_F1, 0)) { + ABOUT(new AbstractMenuAction(getLocalizedMessages().getString(HELP_MENU_ABOUT_JPASS), HELP_MENU_ABOUT_JPASS, getIcon("info"), getKeyStroke(KeyEvent.VK_F1, 0)) { @Override public void actionPerformed(ActionEvent ev) { StringBuilder sb = new StringBuilder(); @@ -162,37 +162,37 @@ public void actionPerformed(ActionEvent ev) { MessageDialog.showInformationMessage(JPassFrame.getInstance(), sb.toString()); } }), - LICENSE(new AbstractMenuAction(getLocalizedMessages().getString(HELP_MENU_LICENSE), getIcon("license"), null) { + LICENSE(new AbstractMenuAction(getLocalizedMessages().getString(HELP_MENU_LICENSE), HELP_MENU_LICENSE, getIcon("license"), null) { @Override public void actionPerformed(ActionEvent ev) { MessageDialog.showTextFile(JPassFrame.getInstance(), getLocalizedMessages().getString(HELP_MENU_LICENSE), "license.txt"); } }), - ADD_ENTRY(new AbstractMenuAction(getLocalizedMessages().getString(EDIT_MENU_ADD_ENTRY), getIcon("entry_new"), getKeyStroke(KeyEvent.VK_Y, CTRL_DOWN_MASK)) { + ADD_ENTRY(new AbstractMenuAction(getLocalizedMessages().getString(EDIT_MENU_ADD_ENTRY), EDIT_MENU_ADD_ENTRY, getIcon("entry_new"), getKeyStroke(KeyEvent.VK_Y, CTRL_DOWN_MASK)) { @Override public void actionPerformed(ActionEvent ev) { EntryHelper.addEntry(JPassFrame.getInstance()); } }), - EDIT_ENTRY(new AbstractMenuAction(getLocalizedMessages().getString(EDIT_MENU_EDIT_ENTRY), getIcon("entry_edit"), getKeyStroke(KeyEvent.VK_E, CTRL_DOWN_MASK)) { + EDIT_ENTRY(new AbstractMenuAction(getLocalizedMessages().getString(EDIT_MENU_EDIT_ENTRY), EDIT_MENU_EDIT_ENTRY, getIcon("entry_edit"), getKeyStroke(KeyEvent.VK_E, CTRL_DOWN_MASK)) { @Override public void actionPerformed(ActionEvent ev) { EntryHelper.editEntry(JPassFrame.getInstance()); } }), - DUPLICATE_ENTRY(new AbstractMenuAction(getLocalizedMessages().getString(EDIT_MENU_DUPLICATE_ENTRY), getIcon("entry_duplicate"), getKeyStroke(KeyEvent.VK_K, CTRL_DOWN_MASK)) { + DUPLICATE_ENTRY(new AbstractMenuAction(getLocalizedMessages().getString(EDIT_MENU_DUPLICATE_ENTRY), EDIT_MENU_DUPLICATE_ENTRY, getIcon("entry_duplicate"), getKeyStroke(KeyEvent.VK_K, CTRL_DOWN_MASK)) { @Override public void actionPerformed(ActionEvent ev) { EntryHelper.duplicateEntry(JPassFrame.getInstance()); } }), - DELETE_ENTRY(new AbstractMenuAction(getLocalizedMessages().getString(EDIT_MENU_DELETE_ENTRY), getIcon("entry_delete"), getKeyStroke(KeyEvent.VK_D, CTRL_DOWN_MASK)) { + DELETE_ENTRY(new AbstractMenuAction(getLocalizedMessages().getString(EDIT_MENU_DELETE_ENTRY), EDIT_MENU_DELETE_ENTRY, getIcon("entry_delete"), getKeyStroke(KeyEvent.VK_D, CTRL_DOWN_MASK)) { @Override public void actionPerformed(ActionEvent ev) { EntryHelper.deleteEntry(JPassFrame.getInstance()); } }), - COPY_URL(new AbstractMenuAction(getLocalizedMessages().getString(EDIT_MENU_COPY_URL), getIcon("url"), getKeyStroke(KeyEvent.VK_U, CTRL_DOWN_MASK)) { + COPY_URL(new AbstractMenuAction(getLocalizedMessages().getString(EDIT_MENU_COPY_URL), EDIT_MENU_COPY_URL, getIcon("url"), getKeyStroke(KeyEvent.VK_U, CTRL_DOWN_MASK)) { @Override public void actionPerformed(ActionEvent ev) { JPassFrame parent = JPassFrame.getInstance(); @@ -202,7 +202,7 @@ public void actionPerformed(ActionEvent ev) { } } }), - COPY_USER(new AbstractMenuAction(getLocalizedMessages().getString(EDIT_MENU_COPY_USERNAME), getIcon("user"), getKeyStroke(KeyEvent.VK_B, CTRL_DOWN_MASK)) { + COPY_USER(new AbstractMenuAction(getLocalizedMessages().getString(EDIT_MENU_COPY_USERNAME), EDIT_MENU_COPY_USERNAME, getIcon("user"), getKeyStroke(KeyEvent.VK_B, CTRL_DOWN_MASK)) { @Override public void actionPerformed(ActionEvent ev) { JPassFrame parent = JPassFrame.getInstance(); @@ -212,7 +212,7 @@ public void actionPerformed(ActionEvent ev) { } } }), - COPY_PASSWORD(new AbstractMenuAction(getLocalizedMessages().getString(EDIT_MENU_COPY_PASSWORD), getIcon("keyring"), getKeyStroke(KeyEvent.VK_C, CTRL_DOWN_MASK)) { + COPY_PASSWORD(new AbstractMenuAction(getLocalizedMessages().getString(EDIT_MENU_COPY_PASSWORD), EDIT_MENU_COPY_PASSWORD, getIcon("keyring"), getKeyStroke(KeyEvent.VK_C, CTRL_DOWN_MASK)) { @Override public void actionPerformed(ActionEvent ev) { JPassFrame parent = JPassFrame.getInstance(); @@ -222,13 +222,13 @@ public void actionPerformed(ActionEvent ev) { } } }), - CLEAR_CLIPBOARD(new AbstractMenuAction(getLocalizedMessages().getString(EDIT_MENU_CLEAR_CLIPBOARD), getIcon("clear"), getKeyStroke(KeyEvent.VK_X, CTRL_DOWN_MASK)) { + CLEAR_CLIPBOARD(new AbstractMenuAction(getLocalizedMessages().getString(EDIT_MENU_CLEAR_CLIPBOARD), EDIT_MENU_CLEAR_CLIPBOARD, getIcon("clear"), getKeyStroke(KeyEvent.VK_X, CTRL_DOWN_MASK)) { @Override public void actionPerformed(ActionEvent ev) { EntryHelper.copyEntryField(JPassFrame.getInstance(), null); } }), - FIND_ENTRY(new AbstractMenuAction(getLocalizedMessages().getString(EDIT_MENU_FIND_ENTRY), getIcon("find"), getKeyStroke(KeyEvent.VK_F, CTRL_DOWN_MASK)) { + FIND_ENTRY(new AbstractMenuAction(getLocalizedMessages().getString(EDIT_MENU_FIND_ENTRY), EDIT_MENU_FIND_ENTRY, getIcon("find"), getKeyStroke(KeyEvent.VK_F, CTRL_DOWN_MASK)) { @Override public void actionPerformed(ActionEvent ev) { JPassFrame.getInstance().getSearchPanel().setVisible(true); diff --git a/src/main/resources/resources/languages/languages_hu_HU.properties b/src/main/resources/resources/languages/languages_hu_HU.properties index 4f7c298b..8866c968 100644 --- a/src/main/resources/resources/languages/languages_hu_HU.properties +++ b/src/main/resources/resources/languages/languages_hu_HU.properties @@ -1,6 +1,7 @@ menuBar.fileMenu=Fájl menuBar.editMenu=SzerkesztĂ©s menuBar.toolsMenu=Eszközök +menuBar.settingsMenu=Settings menuBar.helpMenu=SĂşgĂł fileMenu.new=Ăšj @@ -34,6 +35,8 @@ editMenu.findEntry=BejegyzĂ©s keresĂ©se toolsMenu.generatePassword=JelszĂł generálás... +settingsMenu.language=Language + helpMenu.license=Licenc helpMenu.aboutJpass=JPass nĂ©vjegy... diff --git a/src/main/resources/resources/languages/languages_it_IT.properties b/src/main/resources/resources/languages/languages_it_IT.properties index b1992ca5..88d008fe 100644 --- a/src/main/resources/resources/languages/languages_it_IT.properties +++ b/src/main/resources/resources/languages/languages_it_IT.properties @@ -2,6 +2,7 @@ menuBar.fileMenu=File menuBar.editMenu=Modifica menuBar.toolsMenu=Strumenti +menuBar.settingsMenu=Settings menuBar.helpMenu=Aiuto fileMenu.new=Nuovo @@ -35,6 +36,8 @@ editMenu.findEntry=Trova elemento toolsMenu.generatePassword=Genera password... +settingsMenu.language=Language + helpMenu.license=Licenza helpMenu.aboutJpass=Info su JPass... From 7deb07e3d6e9fcf2b206f5ec0729cdf2019b25ba Mon Sep 17 00:00:00 2001 From: Edi Morales Date: Fri, 8 Mar 2024 02:12:00 -0600 Subject: [PATCH 07/12] Sets new icon. Sets JFileChooser CANCEL button based on language selected --- src/main/java/jpass/ui/JPassFrame.java | 15 +++++++++++---- src/main/java/jpass/util/Constants.java | 2 ++ src/main/resources/resources/images/world.svg | 2 ++ 3 files changed, 15 insertions(+), 4 deletions(-) create mode 100644 src/main/resources/resources/images/world.svg diff --git a/src/main/java/jpass/ui/JPassFrame.java b/src/main/java/jpass/ui/JPassFrame.java index 3cc1772c..5522b937 100644 --- a/src/main/java/jpass/ui/JPassFrame.java +++ b/src/main/java/jpass/ui/JPassFrame.java @@ -61,6 +61,7 @@ import javax.swing.JPopupMenu; import javax.swing.JScrollPane; import javax.swing.JToolBar; +import javax.swing.UIManager; import javax.swing.WindowConstants; import static jpass.ui.MessageDialog.NO_OPTION; @@ -70,7 +71,9 @@ import static jpass.ui.MessageDialog.showQuestionMessage; import static jpass.util.Constants.BOTTOM_MENU_ENTRIES_COUNT; import static jpass.util.Constants.BOTTOM_MENU_ENTRIES_FOUND; +import static jpass.util.Constants.BUTTON_MESSAGE_CANCEL; import static jpass.util.Constants.EDIT_MENU; +import static jpass.util.Constants.FILE_CHOOSER_CANCEL_BUTTON_TEXT; import static jpass.util.Constants.FILE_MENU; import static jpass.util.Constants.HELP_MENU; import static jpass.util.Constants.LANGUAGE_EN_US; @@ -127,6 +130,7 @@ private JPassFrame(String fileName, Locale locale) { setSupportedLanguages(); setLocalizedMessages(locale); + UIManager.put("FileChooser.cancelButtonText", localizedMessages.getString(BUTTON_MESSAGE_CANCEL)); this.toolBar = new JToolBar(); this.toolBar.setFloatable(false); @@ -199,13 +203,12 @@ private JPassFrame(String fileName, Locale locale) { JMenu languageMenu = new JMenu(localizedMessages.getString(SETTINGS_MENU_LANGUAGE)); languageMenu.setActionCommand(SETTINGS_MENU_LANGUAGE); + languageMenu.setIcon(getIcon("world")); SUPPORTED_LANGUAGES.forEach((key, value) -> { JMenuItem language = new JMenuItem(localizedMessages.getString(key)); language.setActionCommand(key); - language.addActionListener(e -> { - refreshComponentsWithLanguage(e.getActionCommand()); - }); + language.addActionListener(e -> refreshComponentsWithLanguage(e.getActionCommand())); languageMenu.add(language); }); settingsMenu.add(languageMenu); @@ -346,6 +349,8 @@ private void refreshComponentsWithLanguage(String actionCommand) { Locale locale = Locale.forLanguageTag(getSupportedLanguages().get(actionCommand)); setLocalizedMessages(locale); + UIManager.put(FILE_CHOOSER_CANCEL_BUTTON_TEXT, localizedMessages.getString(BUTTON_MESSAGE_CANCEL)); + fileMenu.setText(localizedMessages.getString(FILE_MENU)); editMenu.setText(localizedMessages.getString(EDIT_MENU)); toolsMenu.setText(localizedMessages.getString(TOOLS_MENU)); @@ -357,8 +362,11 @@ private void refreshComponentsWithLanguage(String actionCommand) { updateMenuComponents(toolsMenu); updateMenuComponents(settingsMenu); updateMenuComponents(helpMenu); + //updateMenuComponents(toolBar); refreshEntryTitleList(null); + + MessageDialog.showInformationMessage(this, "Language has been changed"); } private void updateMenuComponents(JMenu menu) { @@ -366,7 +374,6 @@ private void updateMenuComponents(JMenu menu) { JMenuItem item = menu.getItem(i); if (null != item) { if (null != item.getActionCommand()) { - LOG.log(Level.INFO, String.format("ActionCommand: %s ", item.getActionCommand())); item.setText(localizedMessages.getString(item.getActionCommand())); } diff --git a/src/main/java/jpass/util/Constants.java b/src/main/java/jpass/util/Constants.java index 62bb6240..598b450f 100644 --- a/src/main/java/jpass/util/Constants.java +++ b/src/main/java/jpass/util/Constants.java @@ -5,6 +5,8 @@ private Constants() { // not intended to be instantiated } + public static final String FILE_CHOOSER_CANCEL_BUTTON_TEXT = "FileChooser.cancelButtonText"; + public static final String FILE_MENU = "menuBar.fileMenu"; public static final String EDIT_MENU = "menuBar.editMenu"; public static final String TOOLS_MENU = "menuBar.toolsMenu"; diff --git a/src/main/resources/resources/images/world.svg b/src/main/resources/resources/images/world.svg new file mode 100644 index 00000000..a1a9d037 --- /dev/null +++ b/src/main/resources/resources/images/world.svg @@ -0,0 +1,2 @@ + +world \ No newline at end of file From 2b8284663ae14b4dd67107e402214f4b3ead4074 Mon Sep 17 00:00:00 2001 From: Edi Morales Date: Fri, 8 Mar 2024 02:15:10 -0600 Subject: [PATCH 08/12] Updates README.md --- README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index a2e59eb7..6436ebd9 100644 --- a/README.md +++ b/README.md @@ -55,15 +55,15 @@ Configuration Default configurations can be overridden in `jpass.properties` file: -| Configuration key | Value type | Default value | -| ---------------------------------- | ---------- | -------------- | -| ui.theme.dark.mode.enabled | boolean | `false` | -| clear.clipboard.on.exit.enabled | boolean | `false` | -| default.password.generation.length | integer | `14` | -| date.format | string | `yyyy-MM-dd` | +| Configuration key | Value type | Default value | +| ---------------------------------- | ---------- |------------------| +| ui.theme.dark.mode.enabled | boolean | `false` | +| clear.clipboard.on.exit.enabled | boolean | `false` | +| default.password.generation.length | integer | `14` | +| date.format | string | `yyyy-MM-dd` | | entry.details | list | `TITLE,MODIFIED` | -| file.chooser.directory | string | `./` | -| language.languageSetting | string | `en-US` | +| file.chooser.directory | string | `./` | +| language.languageSetting | string | `en-US` | Regarding `language.languageSetting` please check [languages](https://github.com/gaborbata/jpass/tree/master/src/main/resources/resources/languages) From b3c5f7bf977eab300e3112d65067d0ed27592ecf Mon Sep 17 00:00:00 2001 From: Edi Morales Date: Sat, 9 Mar 2024 18:52:29 -0600 Subject: [PATCH 09/12] Completes user-selected language implementation --- src/main/java/jpass/ui/EntryDetailsTable.java | 22 +-- src/main/java/jpass/ui/JPassFrame.java | 136 ++++++++++++++++-- src/main/java/jpass/ui/SearchPanel.java | 8 ++ src/main/java/jpass/util/Configuration.java | 19 ++- src/main/java/jpass/util/Constants.java | 1 + 5 files changed, 159 insertions(+), 27 deletions(-) diff --git a/src/main/java/jpass/ui/EntryDetailsTable.java b/src/main/java/jpass/ui/EntryDetailsTable.java index 388cc650..b01cb124 100644 --- a/src/main/java/jpass/ui/EntryDetailsTable.java +++ b/src/main/java/jpass/ui/EntryDetailsTable.java @@ -60,12 +60,12 @@ public class EntryDetailsTable extends JTable { private static final DateTimeFormatter FORMATTER = DateUtils.createFormatter(Configuration.getInstance().get("date.format", "yyyy-MM-dd")); - private enum DetailType { - TITLE(getLocalizedMessages().getString(VIEW_WINDOW_TITLE), Entry::getTitle), - URL(getLocalizedMessages().getString(VIEW_WINDOW_URL), Entry::getUrl), - USER(getLocalizedMessages().getString(VIEW_WINDOW_USER), Entry::getUser), - MODIFIED(getLocalizedMessages().getString(VIEW_WINDOW_MODIFIED), entry -> DateUtils.formatIsoDateTime(entry.getLastModification(), FORMATTER)), - CREATED(getLocalizedMessages().getString(VIEW_WINDOW_CREATED), entry -> DateUtils.formatIsoDateTime(entry.getCreationDate(), FORMATTER)); + public enum DetailType { + TITLE(VIEW_WINDOW_TITLE, Entry::getTitle), + URL(VIEW_WINDOW_URL, Entry::getUrl), + USER(VIEW_WINDOW_USER, Entry::getUser), + MODIFIED(VIEW_WINDOW_MODIFIED, entry -> DateUtils.formatIsoDateTime(entry.getLastModification(), FORMATTER)), + CREATED(VIEW_WINDOW_CREATED, entry -> DateUtils.formatIsoDateTime(entry.getCreationDate(), FORMATTER)); private final String description; private final Function valueMapper; @@ -111,7 +111,7 @@ public EntryDetailsTable() { } tableModel = new DefaultTableModel(); - detailsToDisplay.forEach(detail -> tableModel.addColumn(detail.getDescription())); + detailsToDisplay.forEach(detail -> tableModel.addColumn(getLocalizedMessages().getString(detail.getDescription()))); setModel(tableModel); getTableHeader().setReorderingAllowed(false); addMouseListener(new TableListener()); @@ -135,6 +135,10 @@ public Component prepareRenderer(TableCellRenderer renderer, int row, int column return component; } + public List getDetailsToDisplay() { + return detailsToDisplay; + } + public void clear() { tableModel.setRowCount(0); } @@ -144,8 +148,4 @@ public void addRow(Entry entry) { .map(detail -> detail.getValue(entry)) .toArray(Object[]::new)); } - - public int rowCount() { - return tableModel.getRowCount(); - } } diff --git a/src/main/java/jpass/ui/JPassFrame.java b/src/main/java/jpass/ui/JPassFrame.java index 5522b937..cbb8ec4e 100644 --- a/src/main/java/jpass/ui/JPassFrame.java +++ b/src/main/java/jpass/ui/JPassFrame.java @@ -37,6 +37,7 @@ import jpass.xml.bind.Entry; import java.awt.BorderLayout; +import java.awt.Component; import java.awt.Dimension; import java.awt.event.KeyEvent; import java.util.ArrayList; @@ -46,12 +47,14 @@ import java.util.List; import java.util.Locale; import java.util.Map; +import java.util.Objects; import java.util.ResourceBundle; import java.util.logging.Level; import java.util.logging.Logger; import java.util.stream.Collectors; import java.util.stream.Stream; +import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JMenuItem; import javax.swing.JTable; @@ -63,6 +66,7 @@ import javax.swing.JToolBar; import javax.swing.UIManager; import javax.swing.WindowConstants; +import javax.swing.table.TableColumn; import static jpass.ui.MessageDialog.NO_OPTION; import static jpass.ui.MessageDialog.YES_NO_CANCEL_OPTION; @@ -80,6 +84,8 @@ import static jpass.util.Constants.LANGUAGE_ES_MX; import static jpass.util.Constants.LANGUAGE_HU_HU; import static jpass.util.Constants.LANGUAGE_IT_IT; +import static jpass.util.Constants.LANGUAGE_LANGUAGE_SETTING; +import static jpass.util.Constants.PANEL_FIND; import static jpass.util.Constants.PANEL_SAVE_MODIFIED_QUESTION_MESSAGE; import static jpass.util.Constants.SETTINGS_MENU; import static jpass.util.Constants.SETTINGS_MENU_LANGUAGE; @@ -117,9 +123,10 @@ public final class JPassFrame extends JFrame { private final EntryDetailsTable entryDetailsTable; private final DataModel model = DataModel.getInstance(); private final StatusPanel statusPanel; + private static String currentLanguage; private volatile boolean processing = false; - private JPassFrame(String fileName, Locale locale) { + private JPassFrame(String fileName) { try { setIconImages(Stream.of(16, 20, 32, 40, 64, 80, 128, 160) .map(size -> getIcon("jpass", size, size).getImage()) @@ -129,8 +136,8 @@ private JPassFrame(String fileName, Locale locale) { } setSupportedLanguages(); - setLocalizedMessages(locale); - UIManager.put("FileChooser.cancelButtonText", localizedMessages.getString(BUTTON_MESSAGE_CANCEL)); + setLocalizedMessages(Locale.forLanguageTag(getCurrentLanguage())); + UIManager.put(FILE_CHOOSER_CANCEL_BUTTON_TEXT, localizedMessages.getString(BUTTON_MESSAGE_CANCEL)); this.toolBar = new JToolBar(); this.toolBar.setFloatable(false); @@ -207,8 +214,11 @@ private JPassFrame(String fileName, Locale locale) { SUPPORTED_LANGUAGES.forEach((key, value) -> { JMenuItem language = new JMenuItem(localizedMessages.getString(key)); + if (Objects.equals(getCurrentLanguage(), value)) { + language.setIcon(getIcon("check_mark")); + } language.setActionCommand(key); - language.addActionListener(e -> refreshComponentsWithLanguage(e.getActionCommand())); + language.addActionListener(e -> refreshComponentsWithLanguageSelected(e.getActionCommand())); languageMenu.add(language); }); settingsMenu.add(languageMenu); @@ -247,7 +257,7 @@ private JPassFrame(String fileName, Locale locale) { setJMenuBar(this.jpassMenuBar); setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE); - setSize(450, 400); + setSize(490, 400); setMinimumSize(new Dimension(420, 200)); addWindowListener(new CloseListener()); setLocationRelativeTo(null); @@ -264,8 +274,13 @@ public static JPassFrame getInstance() { public static synchronized JPassFrame getInstance(String fileName) { if (instance == null) { - String languageTag = Configuration.getInstance().get("language.languageSetting", "en-US"); - instance = new JPassFrame(fileName, Locale.forLanguageTag(languageTag)); + String languageTag = Configuration.getInstance().get(LANGUAGE_LANGUAGE_SETTING, null); + if (null == languageTag) { + languageTag = "en-US"; //Defaulting to en-US + Configuration.getInstance().set(LANGUAGE_LANGUAGE_SETTING, languageTag); + } + setCurrentLanguage(languageTag); + instance = new JPassFrame(fileName); } return instance; } @@ -345,9 +360,18 @@ public void refreshAll() { refreshEntryTitleList(null); } - private void refreshComponentsWithLanguage(String actionCommand) { - Locale locale = Locale.forLanguageTag(getSupportedLanguages().get(actionCommand)); - setLocalizedMessages(locale); + /** + * Refresh UI components with new translated strings from language selected + * + * @param actionCommand key to differentiate a component + */ + private void refreshComponentsWithLanguageSelected(String actionCommand) { + String newLanguage = getSupportedLanguages().get(actionCommand); + if (Objects.equals(getCurrentLanguage(), newLanguage)) { + return; + } + setCurrentLanguage(newLanguage); + setLocalizedMessages(Locale.forLanguageTag(newLanguage)); UIManager.put(FILE_CHOOSER_CANCEL_BUTTON_TEXT, localizedMessages.getString(BUTTON_MESSAGE_CANCEL)); @@ -362,19 +386,36 @@ private void refreshComponentsWithLanguage(String actionCommand) { updateMenuComponents(toolsMenu); updateMenuComponents(settingsMenu); updateMenuComponents(helpMenu); - //updateMenuComponents(toolBar); + updateToolbarComponents(toolBar); - refreshEntryTitleList(null); + updateJPopupMenu(popup); + getSearchPanel().setLabelText(String.format("%s: ", getLocalizedMessages().getString(PANEL_FIND))); + updateTable(); + + Configuration.getInstance().set(LANGUAGE_LANGUAGE_SETTING, newLanguage); MessageDialog.showInformationMessage(this, "Language has been changed"); } + /** + * Updates JMenu components and its children with new translated strings + * + * @param menu to update + */ private void updateMenuComponents(JMenu menu) { for (int i = 0; i < menu.getItemCount(); i++) { JMenuItem item = menu.getItem(i); if (null != item) { - if (null != item.getActionCommand()) { - item.setText(localizedMessages.getString(item.getActionCommand())); + String actionCommand = item.getActionCommand(); + if (null != actionCommand) { + item.setText(localizedMessages.getString(actionCommand)); + + if (getSupportedLanguages().containsKey(actionCommand)) { + item.setIcon(null); + if (Objects.equals(getSupportedLanguages().get(actionCommand), getCurrentLanguage())) { + item.setIcon(getIcon("check_mark")); + } + } } if (item instanceof JMenu) { @@ -384,6 +425,44 @@ private void updateMenuComponents(JMenu menu) { } } + /** + * Updates JPopupMenu components with new translated strings + * @param jPopupMenu + */ + private void updateJPopupMenu(JPopupMenu jPopupMenu) { + for (Component comp : jPopupMenu.getComponents()) { + if (comp instanceof JMenuItem) { + JMenuItem item = (JMenuItem) comp; + item.setText(localizedMessages.getString(item.getActionCommand())); + } + } + } + + /** + * Updates JToolBar components with new translated strings + * @param toolBar + */ + private void updateToolbarComponents(JToolBar toolBar) { + for (Component comp : toolBar.getComponents()) { + if (comp instanceof JButton) { + JButton jButton = (JButton) comp; + jButton.setToolTipText(localizedMessages.getString(jButton.getActionCommand())); + } + } + } + + /** + * Updates main JTable columns headers with new translated strings + */ + private void updateTable() { + for (int i = 0; i < getEntryTitleTable().getColumnModel().getColumnCount(); i++) { + TableColumn column = getEntryTitleTable().getColumnModel().getColumn(i); + column.setHeaderValue(getLocalizedMessages().getString(entryDetailsTable.getDetailsToDisplay().get(i).getDescription())); + } + getEntryTitleTable().getTableHeader().repaint(); + refreshEntryTitleList(null); + } + /** * Exits the application. */ @@ -434,6 +513,15 @@ public static void setLocalizedMessages(Locale locale) { JPassFrame.localizedMessages = ResourceBundle.getBundle("resources.languages.languages", locale); } + /** + * Sets the current language for the program + * + * @param newLanguage + */ + private static void setCurrentLanguage(String newLanguage) { + currentLanguage = newLanguage; + } + /** * Gets the processing state of this frame. * @@ -444,7 +532,7 @@ public boolean isProcessing() { } /** - * Get search panel. + * Gets search panel. * * @return the search panel */ @@ -461,6 +549,19 @@ public static ResourceBundle getLocalizedMessages() { return localizedMessages; } + /** + * Gets current language selected + * + * @return currentLanguage + */ + private static String getCurrentLanguage() { + return currentLanguage; + } + + /** + * Set supported languages currently + * + */ private static void setSupportedLanguages() { SUPPORTED_LANGUAGES.put(LANGUAGE_EN_US, "en-US"); SUPPORTED_LANGUAGES.put(LANGUAGE_ES_MX, "es-MX"); @@ -468,6 +569,11 @@ private static void setSupportedLanguages() { SUPPORTED_LANGUAGES.put(LANGUAGE_IT_IT, "it-IT"); } + /** + * Gets supported languages + * + * @return Map of supported languages + */ private static Map getSupportedLanguages() { return SUPPORTED_LANGUAGES; } diff --git a/src/main/java/jpass/ui/SearchPanel.java b/src/main/java/jpass/ui/SearchPanel.java index 711c434c..8ca8aef1 100644 --- a/src/main/java/jpass/ui/SearchPanel.java +++ b/src/main/java/jpass/ui/SearchPanel.java @@ -144,6 +144,14 @@ public void actionPerformed(ActionEvent e) { } } + /** + * Sets text for label + * @param text of the label + */ + public void setLabelText(String text) { + this.label.setText(text); + } + /** * Get search criteria. * diff --git a/src/main/java/jpass/util/Configuration.java b/src/main/java/jpass/util/Configuration.java index d1f0010a..60431531 100644 --- a/src/main/java/jpass/util/Configuration.java +++ b/src/main/java/jpass/util/Configuration.java @@ -30,7 +30,10 @@ import java.io.File; import java.io.FileInputStream; +import java.io.IOException; import java.io.InputStream; +import java.io.OutputStream; +import java.nio.file.Files; import java.util.Properties; import java.util.logging.Level; import java.util.logging.Logger; @@ -44,7 +47,7 @@ public final class Configuration { private static final Logger LOG = Logger.getLogger(Configuration.class.getName()); private static Configuration instance; - private Properties properties = new Properties(); + private final Properties properties = new Properties(); private Configuration() { try { @@ -98,6 +101,20 @@ public String get(String key, String defaultValue) { return properties.getProperty(key, defaultValue); } + public void set(String key, String value) { + properties.setProperty(key, value); + saveProperties(); + } + + private void saveProperties() { + File filePath = new File(getConfigurationFolderPath(), "jpass.properties"); + try (OutputStream os = Files.newOutputStream(filePath.toPath())) { + properties.store(os, "Configuration properties"); + } catch (IOException e) { + LOG.log(Level.WARNING, "Could not save configuration to file.", e); + } + } + public String[] getArray(String key, String[] defaultValue) { String prop = properties.getProperty(key); if (prop != null) { diff --git a/src/main/java/jpass/util/Constants.java b/src/main/java/jpass/util/Constants.java index 598b450f..9314df48 100644 --- a/src/main/java/jpass/util/Constants.java +++ b/src/main/java/jpass/util/Constants.java @@ -99,6 +99,7 @@ private Constants() { public static final String PANEL_SAVE_MODIFIED_QUESTION_MESSAGE = "panel.saveModifiedQuestionMessage"; public static final String PANEL_UNENCRYPTED_DATA_WARNING_MESSAGE = "panel.unencryptedDataWarningMessage"; + public static final String LANGUAGE_LANGUAGE_SETTING = "language.languageSetting"; public static final String LANGUAGE_EN_US = "language.en.us"; public static final String LANGUAGE_ES_MX = "language.es.mx"; public static final String LANGUAGE_HU_HU = "language.hu.hu"; From 4042ed8238b2a50b137e12c850711b62d49d399e Mon Sep 17 00:00:00 2001 From: Edi Morales Date: Sat, 9 Mar 2024 19:28:03 -0600 Subject: [PATCH 10/12] Localizes language.languageChanged string --- src/main/java/jpass/ui/JPassFrame.java | 3 ++- src/main/java/jpass/util/Constants.java | 1 + .../resources/resources/languages/languages_en_US.properties | 1 + .../resources/resources/languages/languages_es_MX.properties | 1 + .../resources/resources/languages/languages_hu_HU.properties | 1 + .../resources/resources/languages/languages_it_IT.properties | 1 + 6 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/jpass/ui/JPassFrame.java b/src/main/java/jpass/ui/JPassFrame.java index cbb8ec4e..331b48f0 100644 --- a/src/main/java/jpass/ui/JPassFrame.java +++ b/src/main/java/jpass/ui/JPassFrame.java @@ -84,6 +84,7 @@ import static jpass.util.Constants.LANGUAGE_ES_MX; import static jpass.util.Constants.LANGUAGE_HU_HU; import static jpass.util.Constants.LANGUAGE_IT_IT; +import static jpass.util.Constants.LANGUAGE_LANGUAGE_CHANGED; import static jpass.util.Constants.LANGUAGE_LANGUAGE_SETTING; import static jpass.util.Constants.PANEL_FIND; import static jpass.util.Constants.PANEL_SAVE_MODIFIED_QUESTION_MESSAGE; @@ -394,7 +395,7 @@ private void refreshComponentsWithLanguageSelected(String actionCommand) { updateTable(); Configuration.getInstance().set(LANGUAGE_LANGUAGE_SETTING, newLanguage); - MessageDialog.showInformationMessage(this, "Language has been changed"); + MessageDialog.showInformationMessage(this, getLocalizedMessages().getString(LANGUAGE_LANGUAGE_CHANGED)); } /** diff --git a/src/main/java/jpass/util/Constants.java b/src/main/java/jpass/util/Constants.java index 9314df48..10503d91 100644 --- a/src/main/java/jpass/util/Constants.java +++ b/src/main/java/jpass/util/Constants.java @@ -100,6 +100,7 @@ private Constants() { public static final String PANEL_UNENCRYPTED_DATA_WARNING_MESSAGE = "panel.unencryptedDataWarningMessage"; public static final String LANGUAGE_LANGUAGE_SETTING = "language.languageSetting"; + public static final String LANGUAGE_LANGUAGE_CHANGED = "language.languageChanged"; public static final String LANGUAGE_EN_US = "language.en.us"; public static final String LANGUAGE_ES_MX = "language.es.mx"; public static final String LANGUAGE_HU_HU = "language.hu.hu"; diff --git a/src/main/resources/resources/languages/languages_en_US.properties b/src/main/resources/resources/languages/languages_en_US.properties index 0ab1b4e9..5c588dac 100644 --- a/src/main/resources/resources/languages/languages_en_US.properties +++ b/src/main/resources/resources/languages/languages_en_US.properties @@ -91,6 +91,7 @@ panel.open=Open panel.saveModifiedQuestionMessage=The current file has been modified.\nDo you want to save the changes before closing? panel.unencryptedDataWarningMessage=Please note that all data will be stored unencrypted.\nMake sure you keep the exported file in a secure location. +language.languageChanged=Language has changed successfully. language.en.us=English language.es.mx=Spanish language.hu.hu=Hungarian diff --git a/src/main/resources/resources/languages/languages_es_MX.properties b/src/main/resources/resources/languages/languages_es_MX.properties index b2bc22e1..c09546bc 100644 --- a/src/main/resources/resources/languages/languages_es_MX.properties +++ b/src/main/resources/resources/languages/languages_es_MX.properties @@ -91,6 +91,7 @@ panel.open=Abrir panel.saveModifiedQuestionMessage=El archivo actual ha sido modificado.\nżDeseas guardar los cambios antes de cerrar el programa? panel.unencryptedDataWarningMessage=Note que toda la data se almancenará sin cifrar.\nAsegúrese de guardar el archivo exportado en un lugar seguro. +language.languageChanged=El idioma ha cambiado correctamente. language.en.us=Inglés language.es.mx=Espańol language.hu.hu=Húngaro diff --git a/src/main/resources/resources/languages/languages_hu_HU.properties b/src/main/resources/resources/languages/languages_hu_HU.properties index 8866c968..b094287f 100644 --- a/src/main/resources/resources/languages/languages_hu_HU.properties +++ b/src/main/resources/resources/languages/languages_hu_HU.properties @@ -90,6 +90,7 @@ panel.open=Megnyitás panel.saveModifiedQuestionMessage=A jelenlegi fájl mĂłdosĂ­tva lett.\nMenteni szeretnĂ© a változtatásokat bezárás elĹ‘tt? panel.unencryptedDataWarningMessage=FelhĂ­vjuk figyelmĂ©t, hogy az adatok titkosĂ­tás nĂ©lkĂĽl lesznek tárolva.\nBizonyosodjon meg rĂłla, hogy az exportált fájlt biztonságos helyre menti. +language.languageChanged=Language has changed successfully. language.en.us=Angol language.es.mx=Spanyol language.hu.hu=Magyar diff --git a/src/main/resources/resources/languages/languages_it_IT.properties b/src/main/resources/resources/languages/languages_it_IT.properties index 88d008fe..a9f21fea 100644 --- a/src/main/resources/resources/languages/languages_it_IT.properties +++ b/src/main/resources/resources/languages/languages_it_IT.properties @@ -91,6 +91,7 @@ panel.open=Apri panel.saveModifiedQuestionMessage=Il file attuale è stato modificato.\nVuoi salvare le modifiche prima della chiusura? panel.unencryptedDataWarningMessage=Nota che tutti i dati verranno archiviati non crittografati.\nAssicurati di conservare il file esportato in un luogo sicuro. +language.languageChanged=Language has changed successfully. language.en.us=Inglese language.es.mx=Spagnolo language.hu.hu=Ungherese From d8115407d69d5ec3b8224a184a5758bcdf3ad71b Mon Sep 17 00:00:00 2001 From: Edi Morales Date: Sat, 9 Mar 2024 20:12:45 -0600 Subject: [PATCH 11/12] Adds UT for language --- .../java/jpass/util/ConfigurationTest.java | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/test/java/jpass/util/ConfigurationTest.java b/src/test/java/jpass/util/ConfigurationTest.java index ded9b60b..2fa2a8c8 100644 --- a/src/test/java/jpass/util/ConfigurationTest.java +++ b/src/test/java/jpass/util/ConfigurationTest.java @@ -44,38 +44,44 @@ public void setup() { } @Test - public void configurationIsDarkModeEnabledTest() { + void configurationIsDarkModeEnabledTest() { Boolean result = configuration.is("ui.theme.dark.mode.enabled", false); assertFalse(result); } @Test - public void configurationGetIntegerClearClipboardOnExitWrongConfigTest() { + void configurationGetIntegerClearClipboardOnExitWrongConfigTest() { int result = configuration.getInteger("clear.clipboard.on.exit.enabled", 0); assertEquals(0, result); } @Test - public void configurationIsDefaultPasswordGenerationNullConfigTest() { + void configurationIsDefaultPasswordGenerationNullConfigTest() { Boolean result = configuration.is("default.password.generation.size", false); assertFalse(result); } @Test - public void configurationGetDateFormatTest() { + void configurationGetDateFormatTest() { String result = configuration.get("date.format", "yyyy-MM-dd"); assertEquals("yyyy-MM-dd", result); } @Test - public void configurationGetArrayEntryDetailsTest() { + void configurationGetLanguageTest() { + String result = configuration.get("language.languageSetting", "en-US"); + assertEquals("en-US", result); + } + + @Test + void configurationGetArrayEntryDetailsTest() { String[] defaultValue = new String[]{"TITLE", "MODIFIED"}; String[] result = configuration.getArray("entry.details", defaultValue); assertArrayEquals(defaultValue, result); } @Test - public void configurationGetArrayEntryDetailsWrongKeyTest() { + void configurationGetArrayEntryDetailsWrongKeyTest() { String[] defaultValue = new String[]{"TITLE", "MODIFIED"}; String[] result = configuration.getArray("entry.detail", defaultValue); assertArrayEquals(defaultValue, result); From 7a668d644b41123caffeedbb1418ed7a409f181a Mon Sep 17 00:00:00 2001 From: Edi Morales Date: Sat, 9 Mar 2024 20:25:43 -0600 Subject: [PATCH 12/12] Adds UTs for increasing Jacoco Coverage --- src/test/java/jpass/util/ConfigurationTest.java | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/test/java/jpass/util/ConfigurationTest.java b/src/test/java/jpass/util/ConfigurationTest.java index 2fa2a8c8..f4de4e3c 100644 --- a/src/test/java/jpass/util/ConfigurationTest.java +++ b/src/test/java/jpass/util/ConfigurationTest.java @@ -68,9 +68,22 @@ void configurationGetDateFormatTest() { } @Test - void configurationGetLanguageTest() { - String result = configuration.get("language.languageSetting", "en-US"); + void configurationGetLanguageTestSupportedLanguages() { + configuration.set("language.languageSetting", "en-US"); + String result = configuration.get("language.languageSetting", null); assertEquals("en-US", result); + + configuration.set("language.languageSetting", "es-MX"); + result = configuration.get("language.languageSetting", null); + assertEquals("es-MX", result); + + configuration.set("language.languageSetting", "hu-HU"); + result = configuration.get("language.languageSetting", null); + assertEquals("hu-HU", result); + + configuration.set("language.languageSetting", "it-IT"); + result = configuration.get("language.languageSetting", null); + assertEquals("it-IT", result); } @Test