add option to force key folding

This commit is contained in:
marhali 2022-04-21 22:17:16 +02:00
parent 091acb2e32
commit 433ce8e844
10 changed files with 57 additions and 2 deletions

View File

@ -11,6 +11,7 @@
- Extract translation intention - Extract translation intention
- Full language support for Java, Kotlin, JavaScript / TypeScript, Vue and PHP - Full language support for Java, Kotlin, JavaScript / TypeScript, Vue and PHP
- Expand already expanded nodes after data update - Expand already expanded nodes after data update
- Experimental option to force translation key folding
- Individual icon for tool-window and lookup items - Individual icon for tool-window and lookup items
- Dedicated configuration file (easy-i18n.xml) inside <kbd>.idea</kbd> folder - Dedicated configuration file (easy-i18n.xml) inside <kbd>.idea</kbd> folder

View File

@ -14,6 +14,7 @@ import de.marhali.easyi18n.InstanceManager;
import de.marhali.easyi18n.assistance.OptionalAssistance; import de.marhali.easyi18n.assistance.OptionalAssistance;
import de.marhali.easyi18n.model.TranslationData; import de.marhali.easyi18n.model.TranslationData;
import de.marhali.easyi18n.model.TranslationValue; import de.marhali.easyi18n.model.TranslationValue;
import de.marhali.easyi18n.settings.ProjectSettings;
import de.marhali.easyi18n.settings.ProjectSettingsService; import de.marhali.easyi18n.settings.ProjectSettingsService;
import de.marhali.easyi18n.util.KeyPathConverter; import de.marhali.easyi18n.util.KeyPathConverter;
@ -22,6 +23,7 @@ import org.jetbrains.annotations.Nullable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Set;
/** /**
* Language specific translation key folding with representative locale value. * Language specific translation key folding with representative locale value.
@ -52,8 +54,9 @@ abstract class AbstractFoldingBuilder extends FoldingBuilderEx implements Option
List<FoldingDescriptor> descriptors = new ArrayList<>(); List<FoldingDescriptor> descriptors = new ArrayList<>();
ProjectSettings settings = ProjectSettingsService.get(root.getProject()).getState();
TranslationData data = InstanceManager.get(root.getProject()).store().getData(); TranslationData data = InstanceManager.get(root.getProject()).store().getData();
KeyPathConverter converter = new KeyPathConverter(root.getProject()); KeyPathConverter converter = new KeyPathConverter(settings);
for(Pair<String, PsiElement> region : extractRegions(root)) { for(Pair<String, PsiElement> region : extractRegions(root)) {
if(data.getTranslation(converter.fromString(region.first)) == null) { if(data.getTranslation(converter.fromString(region.first)) == null) {
@ -64,7 +67,8 @@ abstract class AbstractFoldingBuilder extends FoldingBuilderEx implements Option
region.second.getTextRange().getEndOffset() - 1); region.second.getTextRange().getEndOffset() - 1);
// Some language implementations like [Vue Template] does not support FoldingGroup's // Some language implementations like [Vue Template] does not support FoldingGroup's
FoldingDescriptor descriptor = new FoldingDescriptor(region.second.getNode(), range); FoldingDescriptor descriptor = new FoldingDescriptor(region.second.getNode(), range,
null, Set.of(), settings.isAlwaysFold());
descriptors.add(descriptor); descriptors.add(descriptor);
} }

View File

@ -29,4 +29,7 @@ public interface ProjectSettings {
boolean isNestedKeys(); boolean isNestedKeys();
boolean isAssistance(); boolean isAssistance();
// Experimental Configuration
boolean isAlwaysFold();
} }

View File

@ -60,6 +60,9 @@ public class ProjectSettingsComponent extends ProjectSettingsComponentState {
.addVerticalGap(12) .addVerticalGap(12)
.addComponent(constructNestedKeysField()) .addComponent(constructNestedKeysField())
.addComponent(constructAssistanceField()) .addComponent(constructAssistanceField())
.addVerticalGap(24)
.addComponent(new TitledSeparator(bundle.getString("settings.experimental.title")))
.addComponent(constructAlwaysFoldField())
.addComponentFillVertically(new JPanel(), 0) .addComponentFillVertically(new JPanel(), 0)
.getPanel(); .getPanel();
} }
@ -203,6 +206,12 @@ public class ProjectSettingsComponent extends ProjectSettingsComponentState {
return assistance; return assistance;
} }
private JComponent constructAlwaysFoldField() {
alwaysFold = new JBCheckBox(bundle.getString("settings.experimental.always-fold.title"));
alwaysFold.setToolTipText(bundle.getString("settings.experimental.always-fold.tooltip"));
return alwaysFold;
}
private ItemListener handleParserChange() { private ItemListener handleParserChange() {
return e -> { return e -> {
if(e.getStateChange() == ItemEvent.SELECTED) { if(e.getStateChange() == ItemEvent.SELECTED) {

View File

@ -36,6 +36,9 @@ public class ProjectSettingsComponentState {
protected JCheckBox nestedKeys; protected JCheckBox nestedKeys;
protected JCheckBox assistance; protected JCheckBox assistance;
// Experimental configuration
protected JCheckBox alwaysFold;
protected ProjectSettingsState getState() { protected ProjectSettingsState getState() {
// Every field needs to provide its state // Every field needs to provide its state
ProjectSettingsState state = new ProjectSettingsState(); ProjectSettingsState state = new ProjectSettingsState();
@ -57,6 +60,8 @@ public class ProjectSettingsComponentState {
state.setNestedKeys(nestedKeys.isSelected()); state.setNestedKeys(nestedKeys.isSelected());
state.setAssistance(assistance.isSelected()); state.setAssistance(assistance.isSelected());
state.setAlwaysFold(alwaysFold.isSelected());
return state; return state;
} }
@ -78,5 +83,7 @@ public class ProjectSettingsComponentState {
nestedKeys.setSelected(state.isNestedKeys()); nestedKeys.setSelected(state.isNestedKeys());
assistance.setSelected(state.isAssistance()); assistance.setSelected(state.isAssistance());
alwaysFold.setSelected(state.isAlwaysFold());
} }
} }

View File

@ -34,6 +34,9 @@ public class ProjectSettingsState implements ProjectSettings {
private Boolean nestedKeys; private Boolean nestedKeys;
private Boolean assistance; private Boolean assistance;
// Experimental configuration
private Boolean alwaysFold;
public ProjectSettingsState() {} public ProjectSettingsState() {}
@Override @Override
@ -102,6 +105,11 @@ public class ProjectSettingsState implements ProjectSettings {
return assistance != null ? assistance : defaults.isAssistance(); return assistance != null ? assistance : defaults.isAssistance();
} }
@Override
public boolean isAlwaysFold() {
return alwaysFold != null ? alwaysFold : defaults.isAlwaysFold();
}
public void setLocalesDirectory(String localesDirectory) { public void setLocalesDirectory(String localesDirectory) {
this.localesDirectory = localesDirectory; this.localesDirectory = localesDirectory;
} }
@ -153,4 +161,8 @@ public class ProjectSettingsState implements ProjectSettings {
public void setAssistance(Boolean assistance) { public void setAssistance(Boolean assistance) {
this.assistance = assistance; this.assistance = assistance;
} }
public void setAlwaysFold(Boolean alwaysFold) {
this.alwaysFold = alwaysFold;
}
} }

View File

@ -76,4 +76,9 @@ public class DefaultPreset implements ProjectSettings {
public boolean isAssistance() { public boolean isAssistance() {
return true; return true;
} }
@Override
public boolean isAlwaysFold() {
return false;
}
} }

View File

@ -76,4 +76,9 @@ public class ReactI18NextPreset implements ProjectSettings {
public boolean isAssistance() { public boolean isAssistance() {
return true; return true;
} }
@Override
public boolean isAlwaysFold() {
return false;
}
} }

View File

@ -75,4 +75,9 @@ public class VueI18nPreset implements ProjectSettings {
public boolean isAssistance() { public boolean isAssistance() {
return true; return true;
} }
@Override
public boolean isAlwaysFold() {
return false;
}
} }

View File

@ -52,6 +52,10 @@ settings.editor.key.nesting.title=Escape section delimiter within a section laye
settings.editor.key.nesting.tooltip=Escapes the section delimiter within a section to properly reconstruct nested key sections. Disable this feature if nested key sections are the exception rather than the rule in your translation file. settings.editor.key.nesting.tooltip=Escapes the section delimiter within a section to properly reconstruct nested key sections. Disable this feature if nested key sections are the exception rather than the rule in your translation file.
settings.editor.assistance.title=Editor code assistance for translations settings.editor.assistance.title=Editor code assistance for translations
settings.editor.assistance.tooltip=Activates editor support to reference, auto-complete and folding of existing translations. settings.editor.assistance.tooltip=Activates editor support to reference, auto-complete and folding of existing translations.
# Experimental configuration
settings.experimental.title=Experimental Configuration
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.
error.io=An error occurred while processing translation files. \n\ error.io=An error occurred while processing translation files. \n\
Config: {0} => {1} ({2}) \n\ Config: {0} => {1} ({2}) \n\
Path: {3} \n\ Path: {3} \n\