From 08d8326523cb01049bea38b49014cc1114933563 Mon Sep 17 00:00:00 2001 From: JPilson Date: Tue, 16 Apr 2024 20:33:05 +0200 Subject: [PATCH 01/35] feat: add key naming convention converter New methods have been added to convert keys to either camel or snake case depending on a boolean flag. These methods are used to format the text that is input into the Add Dialog in 'LocalizeItAction' class. This improves the versatility of key handling within the project. --- .../easyi18n/action/LocalizeItAction.java | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/src/main/java/de/marhali/easyi18n/action/LocalizeItAction.java b/src/main/java/de/marhali/easyi18n/action/LocalizeItAction.java index c7d6656..8e456f7 100644 --- a/src/main/java/de/marhali/easyi18n/action/LocalizeItAction.java +++ b/src/main/java/de/marhali/easyi18n/action/LocalizeItAction.java @@ -1,5 +1,6 @@ package de.marhali.easyi18n.action; +import com.google.common.base.CaseFormat; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.CommonDataKeys; @@ -47,7 +48,7 @@ class LocalizeItAction extends AnAction { throw new RuntimeException("Project is null!"); } - AddDialog dialog = new AddDialog(project, new KeyPath(text), text, (key) -> replaceSelectedText(project, editor, key)); + AddDialog dialog = new AddDialog(project, new KeyPath(convertKeyToNamingCase(text, true)), text, (key) -> replaceSelectedText(project, editor, key)); dialog.showAndHandle(); } @@ -55,8 +56,8 @@ class LocalizeItAction extends AnAction { * Replaces the selected text in the editor with a new text generated from the provided key. * * @param project the project where the editor belongs - * @param editor the editor where the text is selected - * @param key the key used to generate the replacement text + * @param editor the editor where the text is selected + * @param key the key used to generate the replacement text */ private void replaceSelectedText(Project project, @NotNull Editor editor, @NotNull String key) { int selectionStart = editor.getSelectionModel().getSelectionStart(); @@ -71,8 +72,8 @@ class LocalizeItAction extends AnAction { * Builds a replacement string based on the provided flavor template, key, and document util. * * @param flavorTemplate the flavor template string - * @param key the key used to generate the replacement text - * @param documentUtil the document util object used to determine the document type + * @param key the key used to generate the replacement text + * @param documentUtil the document util object used to determine the document type * @return the built replacement string */ private String buildReplacement(String flavorTemplate, String key, DocumentUtil documentUtil) { @@ -80,4 +81,19 @@ class LocalizeItAction extends AnAction { return flavorTemplate + "(\"" + key + "\")"; } + + private String convertKeyToNamingCase(String key, boolean camelCase) { + String newKey = key.toLowerCase(); + return camelCase ? convertKeyToCamelCase(newKey) : convertKeyToSnakeCase(newKey); + } + + private String convertKeyToCamelCase(String key) { + + + return CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, key); + } + + private String convertKeyToSnakeCase(String key) { + return CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_UNDERSCORE, key); + } } From 0c1710029ff84c8343750485aed351c78ce7c3f1 Mon Sep 17 00:00:00 2001 From: JPilson Date: Tue, 16 Apr 2024 20:33:57 +0200 Subject: [PATCH 02/35] feat: Add naming convention setting for presets Implemented a new setting, `getCaseFormat`, in the `ProjectSettings` interface, returning the naming convention used. Also extended corresponding implementations (`DefaultPreset`, `VueI18nPreset`, `ReactI18NextPreset`, `SettingsTestPreset`) to return `NamingConvention.CAMEL_CASE`. A new enum `NamingConvention` was created for this, with options `SNAKE_CASE` and `CAMEL_CASE`. --- .../easyi18n/settings/NamingConvention.java | 18 ++++++++++++++++++ .../easyi18n/settings/ProjectSettings.java | 2 ++ .../settings/presets/DefaultPreset.java | 6 ++++++ .../settings/presets/ReactI18NextPreset.java | 6 ++++++ .../settings/presets/VueI18nPreset.java | 6 ++++++ .../easyi18n/settings/SettingsTestPreset.java | 9 ++++++++- 6 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 src/main/java/de/marhali/easyi18n/settings/NamingConvention.java diff --git a/src/main/java/de/marhali/easyi18n/settings/NamingConvention.java b/src/main/java/de/marhali/easyi18n/settings/NamingConvention.java new file mode 100644 index 0000000..9feaec5 --- /dev/null +++ b/src/main/java/de/marhali/easyi18n/settings/NamingConvention.java @@ -0,0 +1,18 @@ +package de.marhali.easyi18n.settings; + +import com.google.common.base.CaseFormat; + +public enum NamingConvention { + SNAKE_CASE("Snake"), + CAMEL_CASE("Camel"),; + private final String name; + + private NamingConvention(String name) { + this.name = name; + } + + @Override + public String toString() { + return super.name().toLowerCase(); + } +} diff --git a/src/main/java/de/marhali/easyi18n/settings/ProjectSettings.java b/src/main/java/de/marhali/easyi18n/settings/ProjectSettings.java index 019408a..fdf4e4b 100644 --- a/src/main/java/de/marhali/easyi18n/settings/ProjectSettings.java +++ b/src/main/java/de/marhali/easyi18n/settings/ProjectSettings.java @@ -1,5 +1,6 @@ package de.marhali.easyi18n.settings; +import com.google.common.base.CaseFormat; import de.marhali.easyi18n.io.parser.ParserStrategyType; import de.marhali.easyi18n.io.folder.FolderStrategyType; @@ -34,4 +35,5 @@ public interface ProjectSettings { // Experimental Configuration boolean isAlwaysFold(); String getFlavorTemplate(); + @NotNull NamingConvention getCaseFormat(); } diff --git a/src/main/java/de/marhali/easyi18n/settings/presets/DefaultPreset.java b/src/main/java/de/marhali/easyi18n/settings/presets/DefaultPreset.java index 383a5d3..c475019 100644 --- a/src/main/java/de/marhali/easyi18n/settings/presets/DefaultPreset.java +++ b/src/main/java/de/marhali/easyi18n/settings/presets/DefaultPreset.java @@ -2,6 +2,7 @@ package de.marhali.easyi18n.settings.presets; import de.marhali.easyi18n.io.parser.ParserStrategyType; import de.marhali.easyi18n.io.folder.FolderStrategyType; +import de.marhali.easyi18n.settings.NamingConvention; import de.marhali.easyi18n.settings.ProjectSettings; import org.jetbrains.annotations.NotNull; @@ -91,4 +92,9 @@ public class DefaultPreset implements ProjectSettings { public String getFlavorTemplate() { return "$i18n.t"; } + + @Override + public @NotNull NamingConvention getCaseFormat() { + return NamingConvention.CAMEL_CASE; + } } diff --git a/src/main/java/de/marhali/easyi18n/settings/presets/ReactI18NextPreset.java b/src/main/java/de/marhali/easyi18n/settings/presets/ReactI18NextPreset.java index 26c16b7..6d44310 100644 --- a/src/main/java/de/marhali/easyi18n/settings/presets/ReactI18NextPreset.java +++ b/src/main/java/de/marhali/easyi18n/settings/presets/ReactI18NextPreset.java @@ -1,7 +1,9 @@ package de.marhali.easyi18n.settings.presets; +import com.google.common.base.CaseFormat; import de.marhali.easyi18n.io.parser.ParserStrategyType; import de.marhali.easyi18n.io.folder.FolderStrategyType; +import de.marhali.easyi18n.settings.NamingConvention; import de.marhali.easyi18n.settings.ProjectSettings; import org.jetbrains.annotations.NotNull; @@ -91,4 +93,8 @@ public class ReactI18NextPreset implements ProjectSettings { public String getFlavorTemplate() { return "$i18n.t"; } + @Override + public @NotNull NamingConvention getCaseFormat() { + return NamingConvention.CAMEL_CASE; + } } diff --git a/src/main/java/de/marhali/easyi18n/settings/presets/VueI18nPreset.java b/src/main/java/de/marhali/easyi18n/settings/presets/VueI18nPreset.java index 491edf8..b720d75 100644 --- a/src/main/java/de/marhali/easyi18n/settings/presets/VueI18nPreset.java +++ b/src/main/java/de/marhali/easyi18n/settings/presets/VueI18nPreset.java @@ -2,6 +2,7 @@ package de.marhali.easyi18n.settings.presets; import de.marhali.easyi18n.io.parser.ParserStrategyType; import de.marhali.easyi18n.io.folder.FolderStrategyType; +import de.marhali.easyi18n.settings.NamingConvention; import de.marhali.easyi18n.settings.ProjectSettings; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -90,4 +91,9 @@ public class VueI18nPreset implements ProjectSettings { public String getFlavorTemplate() { return "$i18n.t"; } + + @Override + public @NotNull NamingConvention getCaseFormat() { + return NamingConvention.CAMEL_CASE; + } } diff --git a/src/test/java/de/marhali/easyi18n/settings/SettingsTestPreset.java b/src/test/java/de/marhali/easyi18n/settings/SettingsTestPreset.java index ab646ec..b76e185 100644 --- a/src/test/java/de/marhali/easyi18n/settings/SettingsTestPreset.java +++ b/src/test/java/de/marhali/easyi18n/settings/SettingsTestPreset.java @@ -1,5 +1,6 @@ package de.marhali.easyi18n.settings; +import com.google.common.base.CaseFormat; import de.marhali.easyi18n.io.folder.FolderStrategyType; import de.marhali.easyi18n.io.parser.ParserStrategyType; @@ -8,6 +9,7 @@ import org.jetbrains.annotations.Nullable; /** * Settings preset to test the functionality of the settings service. + * * @author marhali */ public class SettingsTestPreset implements ProjectSettings { @@ -88,6 +90,11 @@ public class SettingsTestPreset implements ProjectSettings { @Override public String getFlavorTemplate() { - return ""; + return "t"; + } + + @Override + public @NotNull NamingConvention getCaseFormat() { + return NamingConvention.CAMEL_CASE; } } From 667b7486148fa22f2147118f1335f902073383e2 Mon Sep 17 00:00:00 2001 From: JPilson Date: Tue, 16 Apr 2024 20:34:12 +0200 Subject: [PATCH 03/35] feat: Add key naming convention selection for extracted translations This update enables the user to specify a key naming convention (Camel Case or Snake Case) for extracted translations. This option is made available in the settings panel, and has been included in the project-specific configuration and state management for the project settings component. --- .../settings/ProjectSettingsComponent.java | 15 ++++ .../ProjectSettingsComponentState.java | 6 ++ .../settings/ProjectSettingsState.java | 70 ++++++++++++++----- src/main/resources/messages.properties | 4 ++ 4 files changed, 76 insertions(+), 19 deletions(-) diff --git a/src/main/java/de/marhali/easyi18n/settings/ProjectSettingsComponent.java b/src/main/java/de/marhali/easyi18n/settings/ProjectSettingsComponent.java index 2ed36e8..ef08742 100644 --- a/src/main/java/de/marhali/easyi18n/settings/ProjectSettingsComponent.java +++ b/src/main/java/de/marhali/easyi18n/settings/ProjectSettingsComponent.java @@ -1,5 +1,6 @@ package de.marhali.easyi18n.settings; +import com.google.common.base.CaseFormat; import com.intellij.ide.BrowserUtil; import com.intellij.openapi.fileChooser.FileChooserDescriptor; import com.intellij.openapi.project.Project; @@ -26,6 +27,7 @@ import java.util.ResourceBundle; /** * Configuration panel with all possible options for this plugin. + * * @author marhali */ public class ProjectSettingsComponent extends ProjectSettingsComponentState { @@ -64,7 +66,9 @@ public class ProjectSettingsComponent extends ProjectSettingsComponentState { .addVerticalGap(24) .addComponent(new TitledSeparator(bundle.getString("settings.experimental.title"))) .addComponent(constructAlwaysFoldField()) + .addVerticalGap(12) .addLabeledComponent(bundle.getString("settings.experimental.flavor-template"), constructFlavorTemplate(), 1, false) + .addLabeledComponent(bundle.getString("settings.experimental.key-naming-format.title"), constructKeyCaseFormater(), 1, false) .addComponentFillVertically(new JPanel(), 0) .getPanel(); } @@ -226,6 +230,17 @@ public class ProjectSettingsComponent extends ProjectSettingsComponentState { return flavorTemplate; } + private JComponent constructKeyCaseFormater() { + KeyCaseFormater = new ComboBox<>(bundle.getString("settings.experimental.key-naming-format.items").split(ArrayMapper.SPLITERATOR_REGEX)); + KeyCaseFormater.setToolTipText(bundle.getString("settings.experimental.key-naming-format.tooltip")); + KeyCaseFormater.setMinimumAndPreferredWidth(120); + KeyCaseFormater.addActionListener(e -> { + + }); + return KeyCaseFormater; + } + + private ItemListener handleParserChange() { return e -> { if (e.getStateChange() == ItemEvent.SELECTED) { diff --git a/src/main/java/de/marhali/easyi18n/settings/ProjectSettingsComponentState.java b/src/main/java/de/marhali/easyi18n/settings/ProjectSettingsComponentState.java index 0138a5c..a6eb5b8 100644 --- a/src/main/java/de/marhali/easyi18n/settings/ProjectSettingsComponentState.java +++ b/src/main/java/de/marhali/easyi18n/settings/ProjectSettingsComponentState.java @@ -1,5 +1,6 @@ package de.marhali.easyi18n.settings; +import com.google.common.base.CaseFormat; import com.intellij.openapi.ui.ComboBox; import com.intellij.openapi.ui.TextFieldWithBrowseButton; @@ -11,6 +12,7 @@ import javax.swing.*; /** * Mandatory for state management for the project settings component. + * * @author marhali */ public class ProjectSettingsComponentState { @@ -41,6 +43,7 @@ public class ProjectSettingsComponentState { protected JCheckBox alwaysFold; protected JTextField flavorTemplate; + protected ComboBox KeyCaseFormater; protected ProjectSettingsState getState() { // Every field needs to provide its state @@ -67,6 +70,8 @@ public class ProjectSettingsComponentState { state.setAlwaysFold(alwaysFold.isSelected()); state.setFlavorTemplate(flavorTemplate.getText()); + state.setCaseFormat(NamingConvention.valueOf(KeyCaseFormater.getSelectedItem().toString().replace("Case", "").trim())); + return state; } @@ -92,5 +97,6 @@ public class ProjectSettingsComponentState { alwaysFold.setSelected(state.isAlwaysFold()); flavorTemplate.setText(state.getFlavorTemplate()); + KeyCaseFormater.setSelectedItem(state.getCaseFormat().name()); } } diff --git a/src/main/java/de/marhali/easyi18n/settings/ProjectSettingsState.java b/src/main/java/de/marhali/easyi18n/settings/ProjectSettingsState.java index 4b9c064..38b033c 100644 --- a/src/main/java/de/marhali/easyi18n/settings/ProjectSettingsState.java +++ b/src/main/java/de/marhali/easyi18n/settings/ProjectSettingsState.java @@ -1,5 +1,6 @@ package de.marhali.easyi18n.settings; +import com.google.common.base.CaseFormat; import com.intellij.util.xmlb.annotations.Property; import de.marhali.easyi18n.io.parser.ParserStrategyType; @@ -13,32 +14,48 @@ import java.util.Objects; /** * Represents the project-specific configuration of this plugin. + * * @author marhali */ public class ProjectSettingsState implements ProjectSettings { // Resource Configuration - @Property private String localesDirectory; - @Property private FolderStrategyType folderStrategy; - @Property private ParserStrategyType parserStrategy; - @Property private String filePattern; + @Property + private String localesDirectory; + @Property + private FolderStrategyType folderStrategy; + @Property + private ParserStrategyType parserStrategy; + @Property + private String filePattern; - @Property private Boolean includeSubDirs; - @Property private boolean sorting; + @Property + private Boolean includeSubDirs; + @Property + private boolean sorting; // Editor configuration - @Property private String namespaceDelimiter; - @Property private String sectionDelimiter; - @Property private String contextDelimiter; - @Property private String pluralDelimiter; - @Property private String defaultNamespace; - @Property private String previewLocale; + @Property + private String namespaceDelimiter; + @Property + private String sectionDelimiter; + @Property + private String contextDelimiter; + @Property + private String pluralDelimiter; + @Property + private String defaultNamespace; + @Property + private String previewLocale; - @Property private Boolean nestedKeys; - @Property private Boolean assistance; + @Property + private Boolean nestedKeys; + @Property + private Boolean assistance; // Experimental configuration - @Property private Boolean alwaysFold; + @Property + private Boolean alwaysFold; /** * The `flavorTemplate` specifies the format used for replacing strings with their i18n (internationalization) counterparts. @@ -47,7 +64,10 @@ public class ProjectSettingsState implements ProjectSettings { * the specific framework or developers' preferences for handling i18n. The ability to dynamically change this template adds flexibility and customization * to cater to different i18n handling methods. */ - @Property private String flavorTemplate; + @Property + private String flavorTemplate; + @Property + private NamingConvention caseFormat; public ProjectSettingsState() { this(new DefaultPreset()); @@ -158,6 +178,11 @@ public class ProjectSettingsState implements ProjectSettings { return this.flavorTemplate; } + @Override + public @NotNull NamingConvention getCaseFormat() { + return this.caseFormat; + } + public void setLocalesDirectory(String localesDirectory) { this.localesDirectory = localesDirectory; } @@ -218,10 +243,15 @@ public class ProjectSettingsState implements ProjectSettings { this.alwaysFold = alwaysFold; } - public void setFlavorTemplate(String flavorTemplate){ + public void setFlavorTemplate(String flavorTemplate) { this.flavorTemplate = flavorTemplate; } + public void setCaseFormat(NamingConvention caseFormat) { + this.caseFormat = caseFormat; + } + + @Override public boolean equals(Object o) { if (this == o) return true; @@ -242,7 +272,8 @@ public class ProjectSettingsState implements ProjectSettings { && Objects.equals(nestedKeys, that.nestedKeys) && Objects.equals(assistance, that.assistance) && Objects.equals(alwaysFold, that.alwaysFold) - && Objects.equals(flavorTemplate,that.flavorTemplate); + && Objects.equals(flavorTemplate, that.flavorTemplate) + && Objects.equals(caseFormat, that.caseFormat); } @Override @@ -250,7 +281,7 @@ public class ProjectSettingsState implements ProjectSettings { return Objects.hash( localesDirectory, folderStrategy, parserStrategy, filePattern, includeSubDirs, sorting, namespaceDelimiter, sectionDelimiter, contextDelimiter, pluralDelimiter, - defaultNamespace, previewLocale, nestedKeys, assistance, alwaysFold,flavorTemplate + defaultNamespace, previewLocale, nestedKeys, assistance, alwaysFold, flavorTemplate, caseFormat ); } @@ -273,6 +304,7 @@ public class ProjectSettingsState implements ProjectSettings { ", assistance=" + assistance + ", alwaysFold=" + alwaysFold + ", flavorTemplate=" + flavorTemplate + + ", caseFormat=" + caseFormat.toString() + '}'; } } diff --git a/src/main/resources/messages.properties b/src/main/resources/messages.properties index 463b1bb..c5620d1 100644 --- a/src/main/resources/messages.properties +++ b/src/main/resources/messages.properties @@ -62,6 +62,10 @@ settings.experimental.always-fold.title=Always fold translation keys settings.experimental.always-fold.tooltip=Forces the editor to always display the value behind a translation key. The value cannot be unfolded when this function is active. settings.experimental.flavor-template =I18n flavor template settings.experimental.flavor-template-tooltip = Specify how to replace strings with i18n representation. +settings.experimental.key-naming-format.title=Key format of extracted translation +settings.experimental.key-naming-format.tooltip=Choose Naming Convention for the keys of extracted translation +settings.experimental.key-naming-format.items=Camel Case;Snake Case + error.io=An error occurred while processing translation files. \n\ Config: {0} => {1} ({2}) \n\ Path: {3} \n\ From b7b356308050c5166038d290c42401f6f3397156 Mon Sep 17 00:00:00 2001 From: JPilson Date: Thu, 18 Apr 2024 20:48:40 +0200 Subject: [PATCH 04/35] feat: Add case format to ProjectSettingsState and fromSelector method to NamingConvention This commit adds a new attribute, `caseFormat`, to the `ProjectSettingsState` class. It also introduces a static method `fromSelector` in the `NamingConvention` class to transform a string into a NamingConvention enum. The transformation in `ProjectSettingsComponentState` has been updated to use this new method. --- .../java/de/marhali/easyi18n/settings/NamingConvention.java | 4 ++++ .../easyi18n/settings/ProjectSettingsComponentState.java | 4 +++- .../de/marhali/easyi18n/settings/ProjectSettingsState.java | 1 + 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/de/marhali/easyi18n/settings/NamingConvention.java b/src/main/java/de/marhali/easyi18n/settings/NamingConvention.java index 9feaec5..5c21466 100644 --- a/src/main/java/de/marhali/easyi18n/settings/NamingConvention.java +++ b/src/main/java/de/marhali/easyi18n/settings/NamingConvention.java @@ -15,4 +15,8 @@ public enum NamingConvention { public String toString() { return super.name().toLowerCase(); } + static public NamingConvention fromSelector(String name) { + String formated = name.replace(" ","_"); + return valueOf(formated.toUpperCase()); + } } diff --git a/src/main/java/de/marhali/easyi18n/settings/ProjectSettingsComponentState.java b/src/main/java/de/marhali/easyi18n/settings/ProjectSettingsComponentState.java index a6eb5b8..e26bab4 100644 --- a/src/main/java/de/marhali/easyi18n/settings/ProjectSettingsComponentState.java +++ b/src/main/java/de/marhali/easyi18n/settings/ProjectSettingsComponentState.java @@ -9,6 +9,7 @@ import de.marhali.easyi18n.io.folder.FolderStrategyType; import de.marhali.easyi18n.settings.presets.Preset; import javax.swing.*; +import java.util.Objects; /** * Mandatory for state management for the project settings component. @@ -68,9 +69,10 @@ public class ProjectSettingsComponentState { state.setAssistance(assistance.isSelected()); state.setAlwaysFold(alwaysFold.isSelected()); + state.setFlavorTemplate(flavorTemplate.getText()); - state.setCaseFormat(NamingConvention.valueOf(KeyCaseFormater.getSelectedItem().toString().replace("Case", "").trim())); + state.setCaseFormat(NamingConvention.fromSelector(KeyCaseFormater.getSelectedItem().toString())); return state; } diff --git a/src/main/java/de/marhali/easyi18n/settings/ProjectSettingsState.java b/src/main/java/de/marhali/easyi18n/settings/ProjectSettingsState.java index 38b033c..93ad59b 100644 --- a/src/main/java/de/marhali/easyi18n/settings/ProjectSettingsState.java +++ b/src/main/java/de/marhali/easyi18n/settings/ProjectSettingsState.java @@ -95,6 +95,7 @@ public class ProjectSettingsState implements ProjectSettings { this.alwaysFold = defaults.isAlwaysFold(); this.flavorTemplate = defaults.getFlavorTemplate(); + this.caseFormat = defaults.getCaseFormat(); } @Override From f933ea91ebdf122cf962db44633c52f980e363b2 Mon Sep 17 00:00:00 2001 From: JPilson Date: Thu, 18 Apr 2024 21:03:15 +0200 Subject: [PATCH 05/35] feat: Add project-specific naming convention in LocalizeItAction Refactored convertKeyToNamingCase method to include project-specific naming conventions. Now, it adapts to the naming convention specified in the project settings. This change enhances flexibility by catering to individual project preferences. --- .../de/marhali/easyi18n/action/LocalizeItAction.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/java/de/marhali/easyi18n/action/LocalizeItAction.java b/src/main/java/de/marhali/easyi18n/action/LocalizeItAction.java index 8e456f7..1fe4fc9 100644 --- a/src/main/java/de/marhali/easyi18n/action/LocalizeItAction.java +++ b/src/main/java/de/marhali/easyi18n/action/LocalizeItAction.java @@ -11,6 +11,7 @@ import com.intellij.openapi.project.Project; import de.marhali.easyi18n.dialog.AddDialog; import de.marhali.easyi18n.model.KeyPath; +import de.marhali.easyi18n.settings.NamingConvention; import de.marhali.easyi18n.settings.ProjectSettingsService; import de.marhali.easyi18n.util.DocumentUtil; @@ -48,7 +49,7 @@ class LocalizeItAction extends AnAction { throw new RuntimeException("Project is null!"); } - AddDialog dialog = new AddDialog(project, new KeyPath(convertKeyToNamingCase(text, true)), text, (key) -> replaceSelectedText(project, editor, key)); + AddDialog dialog = new AddDialog(project, new KeyPath(convertKeyToNamingCase(text, project)), text, (key) -> replaceSelectedText(project, editor, key)); dialog.showAndHandle(); } @@ -82,9 +83,12 @@ class LocalizeItAction extends AnAction { return flavorTemplate + "(\"" + key + "\")"; } - private String convertKeyToNamingCase(String key, boolean camelCase) { + private String convertKeyToNamingCase(String key,Project project) { String newKey = key.toLowerCase(); - return camelCase ? convertKeyToCamelCase(newKey) : convertKeyToSnakeCase(newKey); + newKey = newKey.replaceAll("\\s+", "_"); + + NamingConvention namingConvention = ProjectSettingsService.get(project).getState().getCaseFormat(); + return (namingConvention == NamingConvention.CAMEL_CASE) ? convertKeyToCamelCase(newKey) : convertKeyToSnakeCase(newKey); } private String convertKeyToCamelCase(String key) { From 027016921faf5cb62858fe3e679e72bfd70ce33a Mon Sep 17 00:00:00 2001 From: JPilson Date: Sat, 20 Apr 2024 18:44:18 +0200 Subject: [PATCH 06/35] feat: update naming convention functionality Updated naming convention features by simplifying key case formatter construction and expanding the naming convention enum. Also performed a refactor to layout and formatting across various files for improved readability. Added new test cases to validate the update to naming convention. --- .../easyi18n/settings/NamingConvention.java | 24 ++++++++-- .../easyi18n/settings/ProjectSettings.java | 46 ++++++++++++++----- .../settings/ProjectSettingsComponent.java | 5 +- .../ProjectSettingsComponentState.java | 3 +- .../settings/ProjectSettingsState.java | 1 + .../easyi18n/KeyPathConverterTest.java | 6 +++ .../easyi18n/e2e/EndToEndTestCase.java | 8 ++-- .../easyi18n/mapper/PropertiesMapperTest.java | 7 +++ .../settings/ProjectSettingsServiceTest.java | 9 ++++ 9 files changed, 87 insertions(+), 22 deletions(-) diff --git a/src/main/java/de/marhali/easyi18n/settings/NamingConvention.java b/src/main/java/de/marhali/easyi18n/settings/NamingConvention.java index 5c21466..7fa9e16 100644 --- a/src/main/java/de/marhali/easyi18n/settings/NamingConvention.java +++ b/src/main/java/de/marhali/easyi18n/settings/NamingConvention.java @@ -2,21 +2,39 @@ package de.marhali.easyi18n.settings; import com.google.common.base.CaseFormat; +import java.util.Arrays; + public enum NamingConvention { - SNAKE_CASE("Snake"), - CAMEL_CASE("Camel"),; + SNAKE_CASE("Snake Case"), + + CAMEL_CASE("Camel Case"), + + CAMEL_CASE_UPPERCASE("Camel Case Uppercase"), + ; + private final String name; private NamingConvention(String name) { this.name = name; } + public String getName() { + return this.name; + } + @Override public String toString() { return super.name().toLowerCase(); } + static public NamingConvention fromSelector(String name) { - String formated = name.replace(" ","_"); + String formated = name.replace(" ", "_"); return valueOf(formated.toUpperCase()); } + + static public String[] getEnumNames() { + return Arrays.stream(NamingConvention.values()) + .map(NamingConvention::getName) + .toArray(String[]::new); + } } diff --git a/src/main/java/de/marhali/easyi18n/settings/ProjectSettings.java b/src/main/java/de/marhali/easyi18n/settings/ProjectSettings.java index fdf4e4b..626e672 100644 --- a/src/main/java/de/marhali/easyi18n/settings/ProjectSettings.java +++ b/src/main/java/de/marhali/easyi18n/settings/ProjectSettings.java @@ -9,31 +9,55 @@ import org.jetbrains.annotations.Nullable; /** * API to access the project-specific configuration for this plugin. + * * @author marhaliu */ public interface ProjectSettings { // Resource Configuration - @Nullable String getLocalesDirectory(); - @NotNull FolderStrategyType getFolderStrategy(); - @NotNull ParserStrategyType getParserStrategy(); - @NotNull String getFilePattern(); + @Nullable + String getLocalesDirectory(); + + @NotNull + FolderStrategyType getFolderStrategy(); + + @NotNull + ParserStrategyType getParserStrategy(); + + @NotNull + String getFilePattern(); boolean isIncludeSubDirs(); + boolean isSorting(); // Editor Configuration - @Nullable String getNamespaceDelimiter(); - @NotNull String getSectionDelimiter(); - @Nullable String getContextDelimiter(); - @Nullable String getPluralDelimiter(); - @Nullable String getDefaultNamespace(); - @NotNull String getPreviewLocale(); + @Nullable + String getNamespaceDelimiter(); + + @NotNull + String getSectionDelimiter(); + + @Nullable + String getContextDelimiter(); + + @Nullable + String getPluralDelimiter(); + + @Nullable + String getDefaultNamespace(); + + @NotNull + String getPreviewLocale(); boolean isNestedKeys(); + boolean isAssistance(); // Experimental Configuration boolean isAlwaysFold(); + String getFlavorTemplate(); - @NotNull NamingConvention getCaseFormat(); + + @NotNull + NamingConvention getCaseFormat(); } diff --git a/src/main/java/de/marhali/easyi18n/settings/ProjectSettingsComponent.java b/src/main/java/de/marhali/easyi18n/settings/ProjectSettingsComponent.java index ef08742..4041f83 100644 --- a/src/main/java/de/marhali/easyi18n/settings/ProjectSettingsComponent.java +++ b/src/main/java/de/marhali/easyi18n/settings/ProjectSettingsComponent.java @@ -231,12 +231,9 @@ public class ProjectSettingsComponent extends ProjectSettingsComponentState { } private JComponent constructKeyCaseFormater() { - KeyCaseFormater = new ComboBox<>(bundle.getString("settings.experimental.key-naming-format.items").split(ArrayMapper.SPLITERATOR_REGEX)); + KeyCaseFormater = new ComboBox<>(NamingConvention.getEnumNames()); KeyCaseFormater.setToolTipText(bundle.getString("settings.experimental.key-naming-format.tooltip")); KeyCaseFormater.setMinimumAndPreferredWidth(120); - KeyCaseFormater.addActionListener(e -> { - - }); return KeyCaseFormater; } diff --git a/src/main/java/de/marhali/easyi18n/settings/ProjectSettingsComponentState.java b/src/main/java/de/marhali/easyi18n/settings/ProjectSettingsComponentState.java index e26bab4..a98a947 100644 --- a/src/main/java/de/marhali/easyi18n/settings/ProjectSettingsComponentState.java +++ b/src/main/java/de/marhali/easyi18n/settings/ProjectSettingsComponentState.java @@ -99,6 +99,7 @@ public class ProjectSettingsComponentState { alwaysFold.setSelected(state.isAlwaysFold()); flavorTemplate.setText(state.getFlavorTemplate()); - KeyCaseFormater.setSelectedItem(state.getCaseFormat().name()); + KeyCaseFormater.setSelectedItem(state.getCaseFormat().getName()); } + } diff --git a/src/main/java/de/marhali/easyi18n/settings/ProjectSettingsState.java b/src/main/java/de/marhali/easyi18n/settings/ProjectSettingsState.java index 93ad59b..49cd0d1 100644 --- a/src/main/java/de/marhali/easyi18n/settings/ProjectSettingsState.java +++ b/src/main/java/de/marhali/easyi18n/settings/ProjectSettingsState.java @@ -66,6 +66,7 @@ public class ProjectSettingsState implements ProjectSettings { */ @Property private String flavorTemplate; + @Property private NamingConvention caseFormat; diff --git a/src/test/java/de/marhali/easyi18n/KeyPathConverterTest.java b/src/test/java/de/marhali/easyi18n/KeyPathConverterTest.java index b84d2cb..c023815 100644 --- a/src/test/java/de/marhali/easyi18n/KeyPathConverterTest.java +++ b/src/test/java/de/marhali/easyi18n/KeyPathConverterTest.java @@ -3,6 +3,7 @@ package de.marhali.easyi18n; import de.marhali.easyi18n.io.parser.ParserStrategyType; import de.marhali.easyi18n.io.folder.FolderStrategyType; import de.marhali.easyi18n.model.KeyPath; +import de.marhali.easyi18n.settings.NamingConvention; import de.marhali.easyi18n.settings.ProjectSettings; import de.marhali.easyi18n.util.KeyPathConverter; @@ -172,6 +173,11 @@ public class KeyPathConverterTest { public boolean isIncludeSubDirs() { return false; } + + @Override + public @NotNull NamingConvention getCaseFormat() { + return NamingConvention.CAMEL_CASE; + } }); } } diff --git a/src/test/java/de/marhali/easyi18n/e2e/EndToEndTestCase.java b/src/test/java/de/marhali/easyi18n/e2e/EndToEndTestCase.java index 7a58781..74ebca5 100644 --- a/src/test/java/de/marhali/easyi18n/e2e/EndToEndTestCase.java +++ b/src/test/java/de/marhali/easyi18n/e2e/EndToEndTestCase.java @@ -22,6 +22,7 @@ import java.util.Objects; /** * End-to-end test case. + * * @author marhali */ public abstract class EndToEndTestCase extends BasePlatformTestCase { @@ -57,7 +58,8 @@ public abstract class EndToEndTestCase extends BasePlatformTestCase { out.setLocalesDirectory(tempPath.toString()); ProjectSettingsService.get(getProject()).setState(out); - InstanceManager.get(getProject()).store().saveToPersistenceLayer(success -> {}); + InstanceManager.get(getProject()).store().saveToPersistenceLayer(success -> { + }); // Compare file structure and contents IOFileFilter fileFilter = TrueFileFilter.INSTANCE; @@ -73,7 +75,7 @@ public abstract class EndToEndTestCase extends BasePlatformTestCase { assertEquals(originalFiles.length, outputFiles.length); - for(int i = 0; i < originalFiles.length; i++) { + for (int i = 0; i < originalFiles.length; i++) { File originalFile = originalFiles[i]; File outputFile = outputFiles[i]; @@ -82,4 +84,4 @@ public abstract class EndToEndTestCase extends BasePlatformTestCase { FileUtils.readFileToString(outputFile, CHARSET)); } } -} +} \ No newline at end of file diff --git a/src/test/java/de/marhali/easyi18n/mapper/PropertiesMapperTest.java b/src/test/java/de/marhali/easyi18n/mapper/PropertiesMapperTest.java index 71bf2e1..f29b486 100644 --- a/src/test/java/de/marhali/easyi18n/mapper/PropertiesMapperTest.java +++ b/src/test/java/de/marhali/easyi18n/mapper/PropertiesMapperTest.java @@ -7,6 +7,7 @@ import de.marhali.easyi18n.io.parser.properties.PropertiesMapper; import de.marhali.easyi18n.io.parser.properties.SortableProperties; import de.marhali.easyi18n.model.TranslationData; import de.marhali.easyi18n.model.KeyPath; +import de.marhali.easyi18n.settings.NamingConvention; import de.marhali.easyi18n.settings.ProjectSettings; import de.marhali.easyi18n.util.KeyPathConverter; @@ -19,6 +20,7 @@ import java.util.*; /** * Unit tests for {@link PropertiesMapper}. + * * @author marhali */ public class PropertiesMapperTest extends AbstractMapperTest { @@ -245,6 +247,11 @@ public class PropertiesMapperTest extends AbstractMapperTest { public boolean isIncludeSubDirs() { return false; } + + @Override + public @NotNull NamingConvention getCaseFormat() { + return NamingConvention.CAMEL_CASE; + } }); } } \ No newline at end of file diff --git a/src/test/java/de/marhali/easyi18n/settings/ProjectSettingsServiceTest.java b/src/test/java/de/marhali/easyi18n/settings/ProjectSettingsServiceTest.java index 5ccc4f9..d82e06d 100644 --- a/src/test/java/de/marhali/easyi18n/settings/ProjectSettingsServiceTest.java +++ b/src/test/java/de/marhali/easyi18n/settings/ProjectSettingsServiceTest.java @@ -7,6 +7,7 @@ import de.marhali.easyi18n.settings.presets.DefaultPreset; /** * Tests for the project settings service itself. + * * @author marhali */ public class ProjectSettingsServiceTest extends BasePlatformTestCase { @@ -35,4 +36,12 @@ public class ProjectSettingsServiceTest extends BasePlatformTestCase { ProjectSettingsState after = XmlSerializerUtil.createCopy(previous); assertEquals("mySinglePropTest", after.getLocalesDirectory()); } + + public void testPersistenceFormatCase() { + ProjectSettingsState previous = new ProjectSettingsState(); + assertEquals(previous.getCaseFormat(), NamingConvention.CAMEL_CASE); + previous.setCaseFormat(NamingConvention.SNAKE_CASE); + ProjectSettingsState after = XmlSerializerUtil.createCopy(previous); + assertEquals(after.getCaseFormat(), NamingConvention.SNAKE_CASE); + } } From 4c737e25faa5a22adbc1d198f6002a1f0a730a38 Mon Sep 17 00:00:00 2001 From: JPilson Date: Sat, 20 Apr 2024 19:28:16 +0200 Subject: [PATCH 07/35] refactor: streamline key naming convention conversion Moved key naming convention conversion logic into NamingConvention enum. This simplifies the code in LocalizeItAction and makes the conversion function easily reusable. Also added support for uppercase snake and camel cases. --- .../easyi18n/action/LocalizeItAction.java | 17 ++--------- .../easyi18n/settings/NamingConvention.java | 30 ++++++++++++++++--- 2 files changed, 28 insertions(+), 19 deletions(-) diff --git a/src/main/java/de/marhali/easyi18n/action/LocalizeItAction.java b/src/main/java/de/marhali/easyi18n/action/LocalizeItAction.java index 1fe4fc9..e4b75ee 100644 --- a/src/main/java/de/marhali/easyi18n/action/LocalizeItAction.java +++ b/src/main/java/de/marhali/easyi18n/action/LocalizeItAction.java @@ -83,21 +83,8 @@ class LocalizeItAction extends AnAction { return flavorTemplate + "(\"" + key + "\")"; } - private String convertKeyToNamingCase(String key,Project project) { - String newKey = key.toLowerCase(); - newKey = newKey.replaceAll("\\s+", "_"); - - NamingConvention namingConvention = ProjectSettingsService.get(project).getState().getCaseFormat(); - return (namingConvention == NamingConvention.CAMEL_CASE) ? convertKeyToCamelCase(newKey) : convertKeyToSnakeCase(newKey); + private String convertKeyToNamingCase(String key, Project project) { + return NamingConvention.convertKeyToConvention(key, ProjectSettingsService.get(project).getState().getCaseFormat()); } - private String convertKeyToCamelCase(String key) { - - - return CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, key); - } - - private String convertKeyToSnakeCase(String key) { - return CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_UNDERSCORE, key); - } } diff --git a/src/main/java/de/marhali/easyi18n/settings/NamingConvention.java b/src/main/java/de/marhali/easyi18n/settings/NamingConvention.java index 7fa9e16..e9a94ad 100644 --- a/src/main/java/de/marhali/easyi18n/settings/NamingConvention.java +++ b/src/main/java/de/marhali/easyi18n/settings/NamingConvention.java @@ -5,12 +5,10 @@ import com.google.common.base.CaseFormat; import java.util.Arrays; public enum NamingConvention { - SNAKE_CASE("Snake Case"), - CAMEL_CASE("Camel Case"), - CAMEL_CASE_UPPERCASE("Camel Case Uppercase"), - ; + SNAKE_CASE("Snake Case"), + SNAKE_CASE_UPPERCASE("Snake Case Uppercase"); private final String name; @@ -37,4 +35,28 @@ public enum NamingConvention { .map(NamingConvention::getName) .toArray(String[]::new); } + + static public String convertKeyToConvention(String key, NamingConvention convention) { + String newKey = key.toLowerCase(); + newKey = newKey.replaceAll("\\s+", "_"); + return switch (convention) { + case SNAKE_CASE: + yield formatToSnakeCase(newKey, false); + case SNAKE_CASE_UPPERCASE: + yield formatToSnakeCase(newKey, true); + case CAMEL_CASE: + yield formatToCamelCase(newKey, false); + case CAMEL_CASE_UPPERCASE: + yield formatToCamelCase(newKey, true); + + }; + } + + static private String formatToCamelCase(String key, boolean capitalized) { + return CaseFormat.LOWER_UNDERSCORE.to(capitalized ? CaseFormat.UPPER_CAMEL : CaseFormat.LOWER_CAMEL, key); + } + + static private String formatToSnakeCase(String key, boolean capitalized) { + return CaseFormat.LOWER_UNDERSCORE.to(capitalized ? CaseFormat.UPPER_UNDERSCORE : CaseFormat.LOWER_UNDERSCORE, key); + } } From 340ab134e52eaf16577e65c28bbf585f95628ad4 Mon Sep 17 00:00:00 2001 From: JPilson Date: Sun, 21 Apr 2024 10:15:32 +0200 Subject: [PATCH 08/35] feat: Move NamingConvention to presets package Moved `NamingConvention` from the settings package to a new settings.presets package. This involved modifying various import statements across the application and updating methods that utilised this enum. Increased the `KeyCaseFormater` minimum and preferred width to 200 for better UI rendering. --- .../easyi18n/action/LocalizeItAction.java | 11 +++-- .../easyi18n/settings/ProjectSettings.java | 2 +- .../settings/ProjectSettingsComponent.java | 4 +- .../ProjectSettingsComponentState.java | 5 +-- .../settings/ProjectSettingsState.java | 2 +- .../settings/presets/DefaultPreset.java | 1 - .../{ => presets}/NamingConvention.java | 42 ++++++++++++++++--- .../settings/presets/ReactI18NextPreset.java | 2 - .../settings/presets/VueI18nPreset.java | 1 - src/main/resources/messages.properties | 1 - .../easyi18n/KeyPathConverterTest.java | 2 +- .../easyi18n/mapper/PropertiesMapperTest.java | 2 +- .../settings/ProjectSettingsServiceTest.java | 1 + .../easyi18n/settings/SettingsTestPreset.java | 2 +- 14 files changed, 54 insertions(+), 24 deletions(-) rename src/main/java/de/marhali/easyi18n/settings/{ => presets}/NamingConvention.java (54%) diff --git a/src/main/java/de/marhali/easyi18n/action/LocalizeItAction.java b/src/main/java/de/marhali/easyi18n/action/LocalizeItAction.java index e4b75ee..b55e7ef 100644 --- a/src/main/java/de/marhali/easyi18n/action/LocalizeItAction.java +++ b/src/main/java/de/marhali/easyi18n/action/LocalizeItAction.java @@ -1,6 +1,5 @@ package de.marhali.easyi18n.action; -import com.google.common.base.CaseFormat; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.CommonDataKeys; @@ -11,7 +10,7 @@ import com.intellij.openapi.project.Project; import de.marhali.easyi18n.dialog.AddDialog; import de.marhali.easyi18n.model.KeyPath; -import de.marhali.easyi18n.settings.NamingConvention; +import de.marhali.easyi18n.settings.presets.NamingConvention; import de.marhali.easyi18n.settings.ProjectSettingsService; import de.marhali.easyi18n.util.DocumentUtil; @@ -79,10 +78,16 @@ class LocalizeItAction extends AnAction { */ private String buildReplacement(String flavorTemplate, String key, DocumentUtil documentUtil) { if (documentUtil.isVue() || documentUtil.isJsOrTs()) return flavorTemplate + "('" + key + "')"; - return flavorTemplate + "(\"" + key + "\")"; } + /** + * Converts a given key to the specified naming convention. + * + * @param key the key to convert + * @param project the project where the key is being converted + * @return the converted key + */ private String convertKeyToNamingCase(String key, Project project) { return NamingConvention.convertKeyToConvention(key, ProjectSettingsService.get(project).getState().getCaseFormat()); } diff --git a/src/main/java/de/marhali/easyi18n/settings/ProjectSettings.java b/src/main/java/de/marhali/easyi18n/settings/ProjectSettings.java index 626e672..eee6c5b 100644 --- a/src/main/java/de/marhali/easyi18n/settings/ProjectSettings.java +++ b/src/main/java/de/marhali/easyi18n/settings/ProjectSettings.java @@ -1,9 +1,9 @@ package de.marhali.easyi18n.settings; -import com.google.common.base.CaseFormat; import de.marhali.easyi18n.io.parser.ParserStrategyType; import de.marhali.easyi18n.io.folder.FolderStrategyType; +import de.marhali.easyi18n.settings.presets.NamingConvention; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/de/marhali/easyi18n/settings/ProjectSettingsComponent.java b/src/main/java/de/marhali/easyi18n/settings/ProjectSettingsComponent.java index 4041f83..14b633a 100644 --- a/src/main/java/de/marhali/easyi18n/settings/ProjectSettingsComponent.java +++ b/src/main/java/de/marhali/easyi18n/settings/ProjectSettingsComponent.java @@ -1,6 +1,5 @@ package de.marhali.easyi18n.settings; -import com.google.common.base.CaseFormat; import com.intellij.ide.BrowserUtil; import com.intellij.openapi.fileChooser.FileChooserDescriptor; import com.intellij.openapi.project.Project; @@ -14,6 +13,7 @@ import com.intellij.util.ui.FormBuilder; import de.marhali.easyi18n.io.parser.ArrayMapper; import de.marhali.easyi18n.io.parser.ParserStrategyType; +import de.marhali.easyi18n.settings.presets.NamingConvention; import de.marhali.easyi18n.settings.presets.Preset; import javax.swing.*; @@ -233,7 +233,7 @@ public class ProjectSettingsComponent extends ProjectSettingsComponentState { private JComponent constructKeyCaseFormater() { KeyCaseFormater = new ComboBox<>(NamingConvention.getEnumNames()); KeyCaseFormater.setToolTipText(bundle.getString("settings.experimental.key-naming-format.tooltip")); - KeyCaseFormater.setMinimumAndPreferredWidth(120); + KeyCaseFormater.setMinimumAndPreferredWidth(200); return KeyCaseFormater; } diff --git a/src/main/java/de/marhali/easyi18n/settings/ProjectSettingsComponentState.java b/src/main/java/de/marhali/easyi18n/settings/ProjectSettingsComponentState.java index a98a947..c32be62 100644 --- a/src/main/java/de/marhali/easyi18n/settings/ProjectSettingsComponentState.java +++ b/src/main/java/de/marhali/easyi18n/settings/ProjectSettingsComponentState.java @@ -1,15 +1,14 @@ package de.marhali.easyi18n.settings; -import com.google.common.base.CaseFormat; import com.intellij.openapi.ui.ComboBox; import com.intellij.openapi.ui.TextFieldWithBrowseButton; import de.marhali.easyi18n.io.parser.ParserStrategyType; import de.marhali.easyi18n.io.folder.FolderStrategyType; +import de.marhali.easyi18n.settings.presets.NamingConvention; import de.marhali.easyi18n.settings.presets.Preset; import javax.swing.*; -import java.util.Objects; /** * Mandatory for state management for the project settings component. @@ -72,7 +71,7 @@ public class ProjectSettingsComponentState { state.setFlavorTemplate(flavorTemplate.getText()); - state.setCaseFormat(NamingConvention.fromSelector(KeyCaseFormater.getSelectedItem().toString())); + state.setCaseFormat(NamingConvention.fromString(KeyCaseFormater.getSelectedItem().toString())); return state; } diff --git a/src/main/java/de/marhali/easyi18n/settings/ProjectSettingsState.java b/src/main/java/de/marhali/easyi18n/settings/ProjectSettingsState.java index 49cd0d1..d9b159d 100644 --- a/src/main/java/de/marhali/easyi18n/settings/ProjectSettingsState.java +++ b/src/main/java/de/marhali/easyi18n/settings/ProjectSettingsState.java @@ -1,12 +1,12 @@ package de.marhali.easyi18n.settings; -import com.google.common.base.CaseFormat; import com.intellij.util.xmlb.annotations.Property; import de.marhali.easyi18n.io.parser.ParserStrategyType; import de.marhali.easyi18n.io.folder.FolderStrategyType; import de.marhali.easyi18n.settings.presets.DefaultPreset; +import de.marhali.easyi18n.settings.presets.NamingConvention; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/de/marhali/easyi18n/settings/presets/DefaultPreset.java b/src/main/java/de/marhali/easyi18n/settings/presets/DefaultPreset.java index c475019..73f0da0 100644 --- a/src/main/java/de/marhali/easyi18n/settings/presets/DefaultPreset.java +++ b/src/main/java/de/marhali/easyi18n/settings/presets/DefaultPreset.java @@ -2,7 +2,6 @@ package de.marhali.easyi18n.settings.presets; import de.marhali.easyi18n.io.parser.ParserStrategyType; import de.marhali.easyi18n.io.folder.FolderStrategyType; -import de.marhali.easyi18n.settings.NamingConvention; import de.marhali.easyi18n.settings.ProjectSettings; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/de/marhali/easyi18n/settings/NamingConvention.java b/src/main/java/de/marhali/easyi18n/settings/presets/NamingConvention.java similarity index 54% rename from src/main/java/de/marhali/easyi18n/settings/NamingConvention.java rename to src/main/java/de/marhali/easyi18n/settings/presets/NamingConvention.java index e9a94ad..48db48a 100644 --- a/src/main/java/de/marhali/easyi18n/settings/NamingConvention.java +++ b/src/main/java/de/marhali/easyi18n/settings/presets/NamingConvention.java @@ -1,14 +1,18 @@ -package de.marhali.easyi18n.settings; +package de.marhali.easyi18n.settings.presets; import com.google.common.base.CaseFormat; import java.util.Arrays; +/** + * Enum representing different naming conventions. + * Provides utility methods to convert keys to the specified convention. + */ public enum NamingConvention { CAMEL_CASE("Camel Case"), - CAMEL_CASE_UPPERCASE("Camel Case Uppercase"), + CAMEL_CASE_UPPERCASE("Camel Case (Uppercase)"), SNAKE_CASE("Snake Case"), - SNAKE_CASE_UPPERCASE("Snake Case Uppercase"); + SNAKE_CASE_UPPERCASE("Snake Case (Uppercase)"); private final String name; @@ -16,6 +20,11 @@ public enum NamingConvention { this.name = name; } + /** + * Retrieves the name of the current instance of the class. + * + * @return the name of the current instance + */ public String getName() { return this.name; } @@ -25,17 +34,38 @@ public enum NamingConvention { return super.name().toLowerCase(); } - static public NamingConvention fromSelector(String name) { - String formated = name.replace(" ", "_"); - return valueOf(formated.toUpperCase()); + /** + * Converts a string representation of a naming convention to the corresponding NamingConvention enum value. + * + * @param name the string representation of the naming convention + * @return the corresponding NamingConvention enum value + */ + static public NamingConvention fromString(String name) { + for (NamingConvention value : NamingConvention.values()) { + if (value.getName().equals(name)) + return value; + } + return NamingConvention.CAMEL_CASE; } + /** + * Returns an array of strings representing the names of the enum values in the {@link NamingConvention} enum. + * + * @return an array of strings representing the enum names + */ static public String[] getEnumNames() { return Arrays.stream(NamingConvention.values()) .map(NamingConvention::getName) .toArray(String[]::new); } + /** + * Converts a given key to the specified naming convention. + * + * @param key the key to convert + * @param convention the naming convention to convert the key to + * @return the converted key + */ static public String convertKeyToConvention(String key, NamingConvention convention) { String newKey = key.toLowerCase(); newKey = newKey.replaceAll("\\s+", "_"); diff --git a/src/main/java/de/marhali/easyi18n/settings/presets/ReactI18NextPreset.java b/src/main/java/de/marhali/easyi18n/settings/presets/ReactI18NextPreset.java index 6d44310..5f2fff2 100644 --- a/src/main/java/de/marhali/easyi18n/settings/presets/ReactI18NextPreset.java +++ b/src/main/java/de/marhali/easyi18n/settings/presets/ReactI18NextPreset.java @@ -1,9 +1,7 @@ package de.marhali.easyi18n.settings.presets; -import com.google.common.base.CaseFormat; import de.marhali.easyi18n.io.parser.ParserStrategyType; import de.marhali.easyi18n.io.folder.FolderStrategyType; -import de.marhali.easyi18n.settings.NamingConvention; import de.marhali.easyi18n.settings.ProjectSettings; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/de/marhali/easyi18n/settings/presets/VueI18nPreset.java b/src/main/java/de/marhali/easyi18n/settings/presets/VueI18nPreset.java index b720d75..053ed51 100644 --- a/src/main/java/de/marhali/easyi18n/settings/presets/VueI18nPreset.java +++ b/src/main/java/de/marhali/easyi18n/settings/presets/VueI18nPreset.java @@ -2,7 +2,6 @@ package de.marhali.easyi18n.settings.presets; import de.marhali.easyi18n.io.parser.ParserStrategyType; import de.marhali.easyi18n.io.folder.FolderStrategyType; -import de.marhali.easyi18n.settings.NamingConvention; import de.marhali.easyi18n.settings.ProjectSettings; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/resources/messages.properties b/src/main/resources/messages.properties index c5620d1..2f8bbb5 100644 --- a/src/main/resources/messages.properties +++ b/src/main/resources/messages.properties @@ -64,7 +64,6 @@ settings.experimental.flavor-template =I18n flavor template settings.experimental.flavor-template-tooltip = Specify how to replace strings with i18n representation. settings.experimental.key-naming-format.title=Key format of extracted translation settings.experimental.key-naming-format.tooltip=Choose Naming Convention for the keys of extracted translation -settings.experimental.key-naming-format.items=Camel Case;Snake Case error.io=An error occurred while processing translation files. \n\ Config: {0} => {1} ({2}) \n\ diff --git a/src/test/java/de/marhali/easyi18n/KeyPathConverterTest.java b/src/test/java/de/marhali/easyi18n/KeyPathConverterTest.java index c023815..8f92bd9 100644 --- a/src/test/java/de/marhali/easyi18n/KeyPathConverterTest.java +++ b/src/test/java/de/marhali/easyi18n/KeyPathConverterTest.java @@ -3,7 +3,7 @@ package de.marhali.easyi18n; import de.marhali.easyi18n.io.parser.ParserStrategyType; import de.marhali.easyi18n.io.folder.FolderStrategyType; import de.marhali.easyi18n.model.KeyPath; -import de.marhali.easyi18n.settings.NamingConvention; +import de.marhali.easyi18n.settings.presets.NamingConvention; import de.marhali.easyi18n.settings.ProjectSettings; import de.marhali.easyi18n.util.KeyPathConverter; diff --git a/src/test/java/de/marhali/easyi18n/mapper/PropertiesMapperTest.java b/src/test/java/de/marhali/easyi18n/mapper/PropertiesMapperTest.java index f29b486..00cdd5c 100644 --- a/src/test/java/de/marhali/easyi18n/mapper/PropertiesMapperTest.java +++ b/src/test/java/de/marhali/easyi18n/mapper/PropertiesMapperTest.java @@ -7,7 +7,7 @@ import de.marhali.easyi18n.io.parser.properties.PropertiesMapper; import de.marhali.easyi18n.io.parser.properties.SortableProperties; import de.marhali.easyi18n.model.TranslationData; import de.marhali.easyi18n.model.KeyPath; -import de.marhali.easyi18n.settings.NamingConvention; +import de.marhali.easyi18n.settings.presets.NamingConvention; import de.marhali.easyi18n.settings.ProjectSettings; import de.marhali.easyi18n.util.KeyPathConverter; diff --git a/src/test/java/de/marhali/easyi18n/settings/ProjectSettingsServiceTest.java b/src/test/java/de/marhali/easyi18n/settings/ProjectSettingsServiceTest.java index d82e06d..cc8d850 100644 --- a/src/test/java/de/marhali/easyi18n/settings/ProjectSettingsServiceTest.java +++ b/src/test/java/de/marhali/easyi18n/settings/ProjectSettingsServiceTest.java @@ -4,6 +4,7 @@ import com.intellij.testFramework.fixtures.BasePlatformTestCase; import com.intellij.util.xmlb.XmlSerializerUtil; import de.marhali.easyi18n.settings.presets.DefaultPreset; +import de.marhali.easyi18n.settings.presets.NamingConvention; /** * Tests for the project settings service itself. diff --git a/src/test/java/de/marhali/easyi18n/settings/SettingsTestPreset.java b/src/test/java/de/marhali/easyi18n/settings/SettingsTestPreset.java index b76e185..8b03a75 100644 --- a/src/test/java/de/marhali/easyi18n/settings/SettingsTestPreset.java +++ b/src/test/java/de/marhali/easyi18n/settings/SettingsTestPreset.java @@ -1,9 +1,9 @@ package de.marhali.easyi18n.settings; -import com.google.common.base.CaseFormat; import de.marhali.easyi18n.io.folder.FolderStrategyType; import de.marhali.easyi18n.io.parser.ParserStrategyType; +import de.marhali.easyi18n.settings.presets.NamingConvention; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; From 45834046dde555e9ebd1f857086134b62406403a Mon Sep 17 00:00:00 2001 From: JPilson Date: Sun, 21 Apr 2024 11:09:20 +0200 Subject: [PATCH 09/35] feat: Replace Camel case uppercase with Pascal case The main modification is in `NamingConvention.java` replacing the enumeration `CAMEL_CASE_UPPERCASE` with `PASCAL_CASE`. This change can help to improve the readability of the code by reducing the verbosity of names and ensure convention consistency. Also, a new test file `NamingConventionTest.java` has been introduced to ensure correctness and stability of the code against these modifications. --- .../settings/presets/NamingConvention.java | 4 +-- .../settings/NamingConventionTest.java | 35 +++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 src/test/java/de/marhali/easyi18n/settings/NamingConventionTest.java diff --git a/src/main/java/de/marhali/easyi18n/settings/presets/NamingConvention.java b/src/main/java/de/marhali/easyi18n/settings/presets/NamingConvention.java index 48db48a..71aa619 100644 --- a/src/main/java/de/marhali/easyi18n/settings/presets/NamingConvention.java +++ b/src/main/java/de/marhali/easyi18n/settings/presets/NamingConvention.java @@ -10,7 +10,7 @@ import java.util.Arrays; */ public enum NamingConvention { CAMEL_CASE("Camel Case"), - CAMEL_CASE_UPPERCASE("Camel Case (Uppercase)"), + PASCAL_CASE("Pascal Case"), SNAKE_CASE("Snake Case"), SNAKE_CASE_UPPERCASE("Snake Case (Uppercase)"); @@ -76,7 +76,7 @@ public enum NamingConvention { yield formatToSnakeCase(newKey, true); case CAMEL_CASE: yield formatToCamelCase(newKey, false); - case CAMEL_CASE_UPPERCASE: + case PASCAL_CASE: yield formatToCamelCase(newKey, true); }; diff --git a/src/test/java/de/marhali/easyi18n/settings/NamingConventionTest.java b/src/test/java/de/marhali/easyi18n/settings/NamingConventionTest.java new file mode 100644 index 0000000..72e0d3d --- /dev/null +++ b/src/test/java/de/marhali/easyi18n/settings/NamingConventionTest.java @@ -0,0 +1,35 @@ +package de.marhali.easyi18n.settings; + +import com.intellij.testFramework.fixtures.BasePlatformTestCase; +import de.marhali.easyi18n.settings.presets.NamingConvention; + +import java.io.IOException; + +public class NamingConventionTest extends BasePlatformTestCase { + @Override + protected void setUp() throws Exception { + super.setUp(); + } + + public void testConvertToNamingConvention() throws IOException { + assertEquals("helloWorld", NamingConvention.convertKeyToConvention("Hello World", NamingConvention.CAMEL_CASE)); + assertEquals("hello_world", NamingConvention.convertKeyToConvention("Hello World", NamingConvention.SNAKE_CASE)); + assertEquals("HelloWorld", NamingConvention.convertKeyToConvention("Hello World", NamingConvention.PASCAL_CASE)); + assertEquals("HELLO_WORLD", NamingConvention.convertKeyToConvention("Hello World", NamingConvention.SNAKE_CASE_UPPERCASE)); + } + + public void testGetEnumNames() throws Exception { + String[] expected = {"Camel Case", "Pascal Case", "Snake Case", "Snake Case (Uppercase)"}; + String[] actual = NamingConvention.getEnumNames(); + assertEquals(expected.length, actual.length); + } + + + public void testFromString() { + assertEquals(NamingConvention.CAMEL_CASE, NamingConvention.fromString("Camel Case")); + assertEquals(NamingConvention.PASCAL_CASE, NamingConvention.fromString("Pascal Case")); + assertEquals(NamingConvention.SNAKE_CASE, NamingConvention.fromString("Snake Case")); + assertEquals(NamingConvention.SNAKE_CASE_UPPERCASE, NamingConvention.fromString("Snake Case (Uppercase)")); + assertEquals(NamingConvention.CAMEL_CASE, NamingConvention.fromString("Invalid Input")); + } +} From 9f5567fcebf5d07f9d4a94a99b4b41d5af2fc4fb Mon Sep 17 00:00:00 2001 From: marhali Date: Thu, 30 May 2024 12:47:33 +0200 Subject: [PATCH 10/35] support all 242 builds --- CHANGELOG.md | 4 ++++ gradle.properties | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f398641..7354d11 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ ## [Unreleased] +### Added + +- Support for IntelliJ Platform version 2024.2 + ## [4.5.1] - 2024-04-13 ### Fixed diff --git a/gradle.properties b/gradle.properties index da77989..66e7b6a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ pluginVersion = 4.5.1 # Supported build number ranges and IntelliJ Platform versions -> https://plugins.jetbrains.com/docs/intellij/build-number-ranges.html pluginSinceBuild = 223 -pluginUntilBuild = 241.* +pluginUntilBuild = 242.* # IntelliJ Platform Properties -> https://plugins.jetbrains.com/docs/intellij/tools-gradle-intellij-plugin.html#configuration-intellij-extension platformType = IU From 46575b31fd8bf208173c5ded08af6b385f788dff Mon Sep 17 00:00:00 2001 From: marhali Date: Thu, 30 May 2024 12:55:22 +0200 Subject: [PATCH 11/35] prepare patch release --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 66e7b6a..3c4244f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ pluginGroup = de.marhali.easyi18n pluginName = easy-i18n pluginRepositoryUrl = https://github.com/marhali/easy-i18n # SemVer format -> https://semver.org -pluginVersion = 4.5.1 +pluginVersion = 4.5.2 # Supported build number ranges and IntelliJ Platform versions -> https://plugins.jetbrains.com/docs/intellij/build-number-ranges.html pluginSinceBuild = 223 From 3a9a487cd62148b078bff1002bc408fbc8e6ebed Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Thu, 30 May 2024 11:12:13 +0000 Subject: [PATCH 12/35] Changelog update - v4.5.2 --- CHANGELOG.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7354d11..bde3dd9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ ## [Unreleased] +## [4.5.2] - 2024-05-30 + ### Added - Support for IntelliJ Platform version 2024.2 @@ -457,7 +459,8 @@ - README.md -[Unreleased]: https://github.com/marhali/easy-i18n/compare/v4.5.1...HEAD +[Unreleased]: https://github.com/marhali/easy-i18n/compare/v4.5.2...HEAD +[4.5.2]: https://github.com/marhali/easy-i18n/compare/v4.5.1...v4.5.2 [4.5.1]: https://github.com/marhali/easy-i18n/compare/v4.5.0...v4.5.1 [4.5.0]: https://github.com/marhali/easy-i18n/compare/v4.4.4...v4.5.0 [4.4.4]: https://github.com/marhali/easy-i18n/compare/v4.4.3...v4.4.4 From 9478b1ea1cb5586d576840b4df6c97ef3df5cb31 Mon Sep 17 00:00:00 2001 From: marhali Date: Fri, 31 May 2024 20:30:38 +0200 Subject: [PATCH 13/35] prepare minor release --- CHANGELOG.md | 4 ++++ gradle.properties | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bde3dd9..b3c4018 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ ## [Unreleased] +### Added + +- Automated key naming convention suggestion for Localize-It action. Thanks to @JPilson + ## [4.5.2] - 2024-05-30 ### Added diff --git a/gradle.properties b/gradle.properties index 3c4244f..4923fb3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ pluginGroup = de.marhali.easyi18n pluginName = easy-i18n pluginRepositoryUrl = https://github.com/marhali/easy-i18n # SemVer format -> https://semver.org -pluginVersion = 4.5.2 +pluginVersion = 4.6.0 # Supported build number ranges and IntelliJ Platform versions -> https://plugins.jetbrains.com/docs/intellij/build-number-ranges.html pluginSinceBuild = 223 From 1e99c3c6bc39bc8e3df738f03265c04d9c625369 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Fri, 31 May 2024 18:57:08 +0000 Subject: [PATCH 14/35] Changelog update - v4.6.0 --- CHANGELOG.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b3c4018..ae6aff0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ ## [Unreleased] +## [4.6.0] - 2024-05-31 + ### Added - Automated key naming convention suggestion for Localize-It action. Thanks to @JPilson @@ -463,7 +465,8 @@ - README.md -[Unreleased]: https://github.com/marhali/easy-i18n/compare/v4.5.2...HEAD +[Unreleased]: https://github.com/marhali/easy-i18n/compare/v4.6.0...HEAD +[4.6.0]: https://github.com/marhali/easy-i18n/compare/v4.5.2...v4.6.0 [4.5.2]: https://github.com/marhali/easy-i18n/compare/v4.5.1...v4.5.2 [4.5.1]: https://github.com/marhali/easy-i18n/compare/v4.5.0...v4.5.1 [4.5.0]: https://github.com/marhali/easy-i18n/compare/v4.4.4...v4.5.0 From 02596686c9dd5fa660f28f4a06037acafcc810e5 Mon Sep 17 00:00:00 2001 From: Volodymyr Date: Sat, 15 Jun 2024 14:34:01 +0300 Subject: [PATCH 15/35] feat: html reference and completition support --- .../completion/XmlCompletionContributor.java | 17 +++++++++ .../reference/XmlKeyReferenceContributor.java | 38 +++++++++++++++++++ .../META-INF/de.marhali.easyi18n-xml.xml | 12 ++++++ 3 files changed, 67 insertions(+) create mode 100644 src/main/java/de/marhali/easyi18n/assistance/completion/XmlCompletionContributor.java create mode 100644 src/main/java/de/marhali/easyi18n/assistance/reference/XmlKeyReferenceContributor.java diff --git a/src/main/java/de/marhali/easyi18n/assistance/completion/XmlCompletionContributor.java b/src/main/java/de/marhali/easyi18n/assistance/completion/XmlCompletionContributor.java new file mode 100644 index 0000000..f48c5a2 --- /dev/null +++ b/src/main/java/de/marhali/easyi18n/assistance/completion/XmlCompletionContributor.java @@ -0,0 +1,17 @@ +package de.marhali.easyi18n.assistance.completion; + +import com.intellij.codeInsight.completion.CompletionContributor; +import com.intellij.codeInsight.completion.CompletionType; +import com.intellij.patterns.PlatformPatterns; +import com.intellij.psi.impl.source.xml.XmlAttributeValueImpl; + +/** + * Xml specific completion contributor. + * @author adeptius + */ +public class XmlCompletionContributor extends CompletionContributor { + public XmlCompletionContributor() { + extend(CompletionType.BASIC, PlatformPatterns.psiElement().inside(XmlAttributeValueImpl.class), + new KeyCompletionProvider()); + } +} diff --git a/src/main/java/de/marhali/easyi18n/assistance/reference/XmlKeyReferenceContributor.java b/src/main/java/de/marhali/easyi18n/assistance/reference/XmlKeyReferenceContributor.java new file mode 100644 index 0000000..3ca88e5 --- /dev/null +++ b/src/main/java/de/marhali/easyi18n/assistance/reference/XmlKeyReferenceContributor.java @@ -0,0 +1,38 @@ +package de.marhali.easyi18n.assistance.reference; + +import com.intellij.openapi.project.Project; +import com.intellij.patterns.PlatformPatterns; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiReference; +import com.intellij.psi.PsiReferenceProvider; +import com.intellij.psi.PsiReferenceRegistrar; +import com.intellij.psi.impl.source.xml.XmlAttributeValueImpl; +import com.intellij.util.ProcessingContext; +import org.jetbrains.annotations.NotNull; + +/** + * Xml specific key reference binding + * @author adeptius + */ +public class XmlKeyReferenceContributor extends AbstractKeyReferenceContributor { + @Override + public void registerReferenceProviders(@NotNull PsiReferenceRegistrar registrar) { + registrar.registerReferenceProvider( + PlatformPatterns.psiElement(XmlAttributeValueImpl.class), + getProvider()); + } + + private PsiReferenceProvider getProvider() { + return new PsiReferenceProvider() { + @Override + public PsiReference @NotNull [] getReferencesByElement( + @NotNull PsiElement element, @NotNull ProcessingContext context) { + + Project project = element.getProject(); + XmlAttributeValueImpl literalExpression = (XmlAttributeValueImpl) element; + String value = literalExpression.getValue(); + return getReferences(project, element, value); + } + }; + } +} \ No newline at end of file diff --git a/src/main/resources/META-INF/de.marhali.easyi18n-xml.xml b/src/main/resources/META-INF/de.marhali.easyi18n-xml.xml index 3e472b0..d35eb65 100644 --- a/src/main/resources/META-INF/de.marhali.easyi18n-xml.xml +++ b/src/main/resources/META-INF/de.marhali.easyi18n-xml.xml @@ -1,5 +1,11 @@ + + + + + + \ No newline at end of file From 20675c35fe445cefa1296811e519538ad44f510b Mon Sep 17 00:00:00 2001 From: Volodymyr Date: Sat, 15 Jun 2024 18:44:42 +0300 Subject: [PATCH 16/35] feat: html intention support --- .../intention/XmlTranslationIntention.java | 27 +++++++++++++++++++ .../META-INF/de.marhali.easyi18n-xml.xml | 3 +++ 2 files changed, 30 insertions(+) create mode 100644 src/main/java/de/marhali/easyi18n/assistance/intention/XmlTranslationIntention.java diff --git a/src/main/java/de/marhali/easyi18n/assistance/intention/XmlTranslationIntention.java b/src/main/java/de/marhali/easyi18n/assistance/intention/XmlTranslationIntention.java new file mode 100644 index 0000000..f02ee0b --- /dev/null +++ b/src/main/java/de/marhali/easyi18n/assistance/intention/XmlTranslationIntention.java @@ -0,0 +1,27 @@ +package de.marhali.easyi18n.assistance.intention; + +import com.intellij.openapi.util.TextRange; +import com.intellij.psi.PsiElement; +import com.intellij.psi.xml.XmlAttributeValue; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * Xml specific translation key intention. + * @author adeptius + */ +public class XmlTranslationIntention extends AbstractTranslationIntention { + @Override + protected @Nullable String extractText(@NotNull PsiElement element) { + if(!(element.getParent() instanceof XmlAttributeValue)) { + return null; + } + + return ((XmlAttributeValue) element.getParent()).getValue(); + } + + @Override + @NotNull TextRange convertRange(@NotNull TextRange input) { + return new TextRange(input.getStartOffset() + 1, input.getEndOffset() - 1); + } +} diff --git a/src/main/resources/META-INF/de.marhali.easyi18n-xml.xml b/src/main/resources/META-INF/de.marhali.easyi18n-xml.xml index d35eb65..4243441 100644 --- a/src/main/resources/META-INF/de.marhali.easyi18n-xml.xml +++ b/src/main/resources/META-INF/de.marhali.easyi18n-xml.xml @@ -21,5 +21,8 @@ implementationClass="de.marhali.easyi18n.assistance.completion.XmlCompletionContributor" /> + + de.marhali.easyi18n.assistance.intention.XmlTranslationIntention + \ No newline at end of file From 6d192cd72cebd52f77893fa0455c9442a34d24a7 Mon Sep 17 00:00:00 2001 From: marhali Date: Sat, 23 Nov 2024 21:22:05 +0100 Subject: [PATCH 17/35] update intellij platform --- .github/workflows/build.yml | 33 ++--- .github/workflows/release.yml | 8 +- .github/workflows/run-ui-tests.yml | 8 +- .gitignore | 1 + .run/Run IDE for UI Tests.run.xml | 25 ---- .run/Run Plugin.run.xml | 3 +- .run/Run Qodana.run.xml | 24 ---- .run/Run Tests.run.xml | 9 +- .run/Run Verifications.run.xml | 7 +- build.gradle.kts | 175 ++++++++++++++--------- gradle.properties | 8 +- gradle/libs.versions.toml | 14 +- gradle/wrapper/gradle-wrapper.jar | Bin 43453 -> 43583 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- gradlew | 7 +- gradlew.bat | 2 + qodana.yml | 2 +- settings.gradle.kts | 6 +- 18 files changed, 162 insertions(+), 172 deletions(-) delete mode 100644 .run/Run IDE for UI Tests.run.xml delete mode 100644 .run/Run Qodana.run.xml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3a084c1..68ee096 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -36,13 +36,13 @@ jobs: pluginVerifierHomeDir: ${{ steps.properties.outputs.pluginVerifierHomeDir }} steps: - # Check out current repository + # Check out the current repository - name: Fetch Sources uses: actions/checkout@v4 # Validate wrapper - name: Gradle Wrapper Validation - uses: gradle/wrapper-validation-action@v2 + uses: gradle/actions/wrapper-validation@v3 # Set up Java environment for the next steps - name: Setup Java @@ -53,9 +53,7 @@ jobs: # Setup Gradle - name: Setup Gradle - uses: gradle/actions/setup-gradle@v3 - with: - gradle-home-cache-cleanup: true + uses: gradle/actions/setup-gradle@v4 # Set environment variables - name: Export Properties @@ -73,8 +71,6 @@ jobs: echo "$CHANGELOG" >> $GITHUB_OUTPUT echo "EOF" >> $GITHUB_OUTPUT - ./gradlew listProductsReleases # prepare list of IDEs for Plugin Verifier - # Build plugin - name: Build plugin run: ./gradlew buildPlugin @@ -104,7 +100,7 @@ jobs: runs-on: ubuntu-latest steps: - # Check out current repository + # Check out the current repository - name: Fetch Sources uses: actions/checkout@v4 @@ -117,9 +113,7 @@ jobs: # Setup Gradle - name: Setup Gradle - uses: gradle/actions/setup-gradle@v3 - with: - gradle-home-cache-cleanup: true + uses: gradle/actions/setup-gradle@v4 # Run tests - name: Run Tests @@ -157,9 +151,12 @@ jobs: tool-cache: false large-packages: false - # Check out current repository + # Check out the current repository - name: Fetch Sources uses: actions/checkout@v4 + with: + ref: ${{ github.event.pull_request.head.sha }} # to check out the actual pull request commit, not the merge commit + fetch-depth: 0 # a full history is required for pull request analysis # Set up Java environment for the next steps - name: Setup Java @@ -170,7 +167,7 @@ jobs: # Run Qodana inspections - name: Qodana - Code Inspection - uses: JetBrains/qodana-action@v2023.3.1 + uses: JetBrains/qodana-action@v2024.2 with: cache-default-branch-only: true @@ -188,7 +185,7 @@ jobs: tool-cache: false large-packages: false - # Check out current repository + # Check out the current repository - name: Fetch Sources uses: actions/checkout@v4 @@ -201,9 +198,7 @@ jobs: # Setup Gradle - name: Setup Gradle - uses: gradle/actions/setup-gradle@v3 - with: - gradle-home-cache-cleanup: true + uses: gradle/actions/setup-gradle@v4 # Cache Plugin Verifier IDEs - name: Setup Plugin Verifier IDEs Cache @@ -214,7 +209,7 @@ jobs: # Run Verify Plugin task and IntelliJ Plugin Verifier tool - name: Run Plugin Verification tasks - run: ./gradlew runPluginVerifier -Dplugin.verifier.home.dir=${{ needs.build.outputs.pluginVerifierHomeDir }} + run: ./gradlew verifyPlugin -Dplugin.verifier.home.dir=${{ needs.build.outputs.pluginVerifierHomeDir }} # Collect Plugin Verifier Result - name: Collect Plugin Verifier Result @@ -235,7 +230,7 @@ jobs: contents: write steps: - # Check out current repository + # Check out the current repository - name: Fetch Sources uses: actions/checkout@v4 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4898779..c5176d2 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -18,7 +18,7 @@ jobs: pull-requests: write steps: - # Check out current repository + # Check out the current repository - name: Fetch Sources uses: actions/checkout@v4 with: @@ -33,9 +33,7 @@ jobs: # Setup Gradle - name: Setup Gradle - uses: gradle/actions/setup-gradle@v3 - with: - gradle-home-cache-cleanup: true + uses: gradle/actions/setup-gradle@v4 # Set environment variables - name: Export Properties @@ -51,7 +49,7 @@ jobs: echo "$CHANGELOG" >> $GITHUB_OUTPUT echo "EOF" >> $GITHUB_OUTPUT - # Update Unreleased section with the current release note + # Update the Unreleased section with the current release note - name: Patch Changelog if: ${{ steps.properties.outputs.changelog != '' }} env: diff --git a/.github/workflows/run-ui-tests.yml b/.github/workflows/run-ui-tests.yml index b756fd6..c15022d 100644 --- a/.github/workflows/run-ui-tests.yml +++ b/.github/workflows/run-ui-tests.yml @@ -31,7 +31,7 @@ jobs: steps: - # Check out current repository + # Check out the current repository - name: Fetch Sources uses: actions/checkout@v4 @@ -44,9 +44,7 @@ jobs: # Setup Gradle - name: Setup Gradle - uses: gradle/actions/setup-gradle@v3 - with: - gradle-home-cache-cleanup: true + uses: gradle/actions/setup-gradle@v4 # Run IDEA prepared for UI testing - name: Run IDE @@ -54,7 +52,7 @@ jobs: # Wait for IDEA to be started - name: Health Check - uses: jtalk/url-health-check-action@v3 + uses: jtalk/url-health-check-action@v4 with: url: http://127.0.0.1:8082 max-attempts: 15 diff --git a/.gitignore b/.gitignore index 61032ef..a6df074 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .gradle .idea +.intellijPlatform .qodana build \ No newline at end of file diff --git a/.run/Run IDE for UI Tests.run.xml b/.run/Run IDE for UI Tests.run.xml deleted file mode 100644 index f31f6d5..0000000 --- a/.run/Run IDE for UI Tests.run.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - true - true - false - false - - - \ No newline at end of file diff --git a/.run/Run Plugin.run.xml b/.run/Run Plugin.run.xml index f42721a..0709c6f 100644 --- a/.run/Run Plugin.run.xml +++ b/.run/Run Plugin.run.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/.run/Run Qodana.run.xml b/.run/Run Qodana.run.xml deleted file mode 100644 index 732dcfa..0000000 --- a/.run/Run Qodana.run.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - true - true - false - false - - - \ No newline at end of file diff --git a/.run/Run Tests.run.xml b/.run/Run Tests.run.xml index 1c1be17..55da723 100644 --- a/.run/Run Tests.run.xml +++ b/.run/Run Tests.run.xml @@ -1,5 +1,5 @@ - + \ No newline at end of file diff --git a/.run/Run Verifications.run.xml b/.run/Run Verifications.run.xml index 1c1be17..1a22fef 100644 --- a/.run/Run Verifications.run.xml +++ b/.run/Run Verifications.run.xml @@ -11,7 +11,7 @@