rework plugin configuration
This commit is contained in:
parent
b6fc0c08ff
commit
d7f34a35db
@ -0,0 +1,32 @@
|
|||||||
|
package de.marhali.easyi18n.settings;
|
||||||
|
|
||||||
|
import de.marhali.easyi18n.io.parser.ParserStrategyType;
|
||||||
|
import de.marhali.easyi18n.model.FolderStrategyType;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
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();
|
||||||
|
|
||||||
|
boolean isSorting();
|
||||||
|
|
||||||
|
// Editor Configuration
|
||||||
|
@Nullable String getNamespaceDelimiter();
|
||||||
|
@NotNull String getSectionDelimiter();
|
||||||
|
@Nullable String getContextDelimiter();
|
||||||
|
@Nullable String getPluralDelimiter();
|
||||||
|
@Nullable String getDefaultNamespace();
|
||||||
|
@NotNull String getPreviewLocale();
|
||||||
|
|
||||||
|
boolean isNestedKeys();
|
||||||
|
boolean isAssistance();
|
||||||
|
}
|
@ -0,0 +1,212 @@
|
|||||||
|
package de.marhali.easyi18n.settings;
|
||||||
|
|
||||||
|
import com.intellij.ide.BrowserUtil;
|
||||||
|
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
|
||||||
|
import com.intellij.openapi.project.Project;
|
||||||
|
import com.intellij.openapi.ui.ComboBox;
|
||||||
|
import com.intellij.openapi.ui.TextFieldWithBrowseButton;
|
||||||
|
import com.intellij.ui.JBColor;
|
||||||
|
import com.intellij.ui.TitledSeparator;
|
||||||
|
import com.intellij.ui.components.*;
|
||||||
|
import com.intellij.ui.components.fields.ExtendableTextField;
|
||||||
|
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.Preset;
|
||||||
|
|
||||||
|
import javax.swing.*;
|
||||||
|
import javax.swing.event.DocumentEvent;
|
||||||
|
import javax.swing.event.DocumentListener;
|
||||||
|
import java.awt.*;
|
||||||
|
import java.awt.event.ActionListener;
|
||||||
|
import java.awt.event.ItemEvent;
|
||||||
|
import java.awt.event.ItemListener;
|
||||||
|
import java.util.ResourceBundle;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configuration panel with all possible options for this plugin.
|
||||||
|
* @author marhali
|
||||||
|
*/
|
||||||
|
public class ProjectSettingsComponent extends ProjectSettingsComponentState {
|
||||||
|
|
||||||
|
private final Project project;
|
||||||
|
private final ResourceBundle bundle;
|
||||||
|
private final JPanel mainPanel;
|
||||||
|
|
||||||
|
// Data fields are provided by the underlying state class
|
||||||
|
|
||||||
|
public ProjectSettingsComponent(Project project) {
|
||||||
|
this.project = project;
|
||||||
|
this.bundle = ResourceBundle.getBundle("messages");
|
||||||
|
|
||||||
|
this.mainPanel = FormBuilder.createFormBuilder()
|
||||||
|
.addComponent(new JBLabel(bundle.getString("settings.hint.text")))
|
||||||
|
.addComponent(new ActionLink(bundle.getString("settings.hint.action"),
|
||||||
|
(ActionListener) (var) -> BrowserUtil.browse("https://github.com/marhali/easy-i18n")))
|
||||||
|
.addVerticalGap(24)
|
||||||
|
.addLabeledComponent(bundle.getString("settings.preset.title"), constructPresetField(), 1, false)
|
||||||
|
.addVerticalGap(12)
|
||||||
|
.addComponent(new TitledSeparator(bundle.getString("settings.resource.title")))
|
||||||
|
.addLabeledComponent(bundle.getString("settings.resource.path.title"), constructLocalesDirectoryField(), 1, false)
|
||||||
|
.addLabeledComponent(bundle.getString("settings.resource.strategy"), constructFileStrategyPanel(), 1, false)
|
||||||
|
.addVerticalGap(12)
|
||||||
|
.addComponent(constructSortingField())
|
||||||
|
.addVerticalGap(24)
|
||||||
|
.addComponent(new TitledSeparator(bundle.getString("settings.editor.title")))
|
||||||
|
.addLabeledComponent(bundle.getString("settings.editor.key.title"), constructKeyStrategyPanel(), 1, false)
|
||||||
|
.addLabeledComponent(bundle.getString("settings.editor.default-namespace.title"), constructDefaultNamespaceField(), 1, false)
|
||||||
|
.addLabeledComponent(bundle.getString("settings.editor.preview.title"), constructPreviewLocaleField(), 1, false)
|
||||||
|
.addVerticalGap(12)
|
||||||
|
.addComponent(constructNestedKeysField())
|
||||||
|
.addComponent(constructAssistanceField())
|
||||||
|
.addComponentFillVertically(new JPanel(), 0)
|
||||||
|
.getPanel();
|
||||||
|
}
|
||||||
|
|
||||||
|
private JComponent constructPresetField() {
|
||||||
|
preset = new ComboBox<>(Preset.values());
|
||||||
|
preset.setToolTipText(bundle.getString("settings.preset.tooltip"));
|
||||||
|
preset.setMinimumAndPreferredWidth(196);
|
||||||
|
preset.addActionListener(e -> setState(preset.getItem().config())); // Listen to selection change
|
||||||
|
return preset;
|
||||||
|
}
|
||||||
|
|
||||||
|
private JComponent constructLocalesDirectoryField() {
|
||||||
|
localesDirectory = new TextFieldWithBrowseButton();
|
||||||
|
localesDirectory.setToolTipText(bundle.getString("settings.resource.path.tooltip"));
|
||||||
|
localesDirectory.addBrowseFolderListener(bundle.getString("settings.resource.path.window"),
|
||||||
|
bundle.getString("settings.resource.path.tooltip"), project,
|
||||||
|
new FileChooserDescriptor(false, true,
|
||||||
|
false, false, false, false));
|
||||||
|
|
||||||
|
// Listen to value change
|
||||||
|
localesDirectory.getTextField().getDocument().addDocumentListener(new DocumentListener() {
|
||||||
|
@Override
|
||||||
|
public void insertUpdate(DocumentEvent e) {
|
||||||
|
validateLocalesDirectory();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void removeUpdate(DocumentEvent e) {
|
||||||
|
validateLocalesDirectory();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void changedUpdate(DocumentEvent e) {
|
||||||
|
validateLocalesDirectory();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
validateLocalesDirectory();
|
||||||
|
return localesDirectory;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void validateLocalesDirectory() {
|
||||||
|
// Paint red border to indicate missing value
|
||||||
|
localesDirectory.setBorder(localesDirectory.getText().isEmpty()
|
||||||
|
? BorderFactory.createLineBorder(JBColor.red) : null);
|
||||||
|
}
|
||||||
|
|
||||||
|
private JPanel constructFileStrategyPanel() {
|
||||||
|
JPanel panel = new JBPanel<>(new GridBagLayout());
|
||||||
|
GridBagConstraints constraints = new GridBagConstraints();
|
||||||
|
|
||||||
|
/* folder strategy */
|
||||||
|
folderStrategy = new ComboBox<>(bundle.getString("settings.resource.folder.items").split(ArrayMapper.SPLITERATOR_REGEX));
|
||||||
|
folderStrategy.setToolTipText(bundle.getString("settings.resource.folder.tooltip"));
|
||||||
|
folderStrategy.setMinimumAndPreferredWidth(256);
|
||||||
|
constraints.fill = GridBagConstraints.HORIZONTAL;
|
||||||
|
constraints.gridx = 0;
|
||||||
|
constraints.gridy = 0;
|
||||||
|
panel.add(folderStrategy, constraints);
|
||||||
|
|
||||||
|
/* parser strategy */
|
||||||
|
parserStrategy = new ComboBox<>(bundle.getString("settings.resource.parser.items").split(ArrayMapper.SPLITERATOR_REGEX));
|
||||||
|
parserStrategy.setToolTipText(bundle.getString("settings.resource.parser.tooltip"));
|
||||||
|
parserStrategy.addItemListener(handleParserChange());
|
||||||
|
parserStrategy.setMinimumAndPreferredWidth(128);
|
||||||
|
constraints.fill = GridBagConstraints.HORIZONTAL;
|
||||||
|
constraints.gridx = 1;
|
||||||
|
constraints.gridy = 0;
|
||||||
|
panel.add(parserStrategy, constraints);
|
||||||
|
|
||||||
|
/* file pattern strategy */
|
||||||
|
filePattern = new JBTextField();
|
||||||
|
filePattern.setToolTipText(bundle.getString("settings.resource.file-pattern.tooltip"));
|
||||||
|
constraints.fill = GridBagConstraints.HORIZONTAL;
|
||||||
|
constraints.gridx = 2;
|
||||||
|
constraints.gridy = 0;
|
||||||
|
constraints.weightx = 1;
|
||||||
|
panel.add(filePattern, constraints);
|
||||||
|
|
||||||
|
return panel;
|
||||||
|
}
|
||||||
|
|
||||||
|
private JComponent constructSortingField() {
|
||||||
|
sorting = new JBCheckBox(bundle.getString("settings.resource.sorting.title"));
|
||||||
|
sorting.setToolTipText(bundle.getString("settings.resource.sorting.tooltip"));
|
||||||
|
return sorting;
|
||||||
|
}
|
||||||
|
|
||||||
|
private JPanel constructKeyStrategyPanel() {
|
||||||
|
JPanel panel = new JBPanel<>(new FlowLayout(FlowLayout.LEFT));
|
||||||
|
|
||||||
|
panel.add(new JBLabel(bundle.getString("settings.editor.key.namespace.title")));
|
||||||
|
panel.add(namespaceDelimiter = createDelimiterField(bundle.getString("settings.editor.key.namespace.tooltip")));
|
||||||
|
panel.add(new JBLabel(bundle.getString("settings.editor.key.section.title")));
|
||||||
|
panel.add(sectionDelimiter = createDelimiterField(bundle.getString("settings.editor.key.section.tooltip")));
|
||||||
|
panel.add(new JBLabel(bundle.getString("settings.editor.key.node.title")));
|
||||||
|
panel.add(contextDelimiter = createDelimiterField(bundle.getString("settings.editor.key.context.tooltip")));
|
||||||
|
panel.add(new JBLabel(bundle.getString("settings.editor.key.context.title")));
|
||||||
|
panel.add(pluralDelimiter = createDelimiterField(bundle.getString("settings.editor.key.plural.tooltip")));
|
||||||
|
panel.add(new JBLabel(bundle.getString("settings.editor.key.plural.title")));
|
||||||
|
|
||||||
|
return panel;
|
||||||
|
}
|
||||||
|
|
||||||
|
private JTextField createDelimiterField(String tooltip) {
|
||||||
|
JBTextField field = new JBTextField();
|
||||||
|
field.setHorizontalAlignment(JTextField.CENTER);
|
||||||
|
field.setToolTipText(tooltip);
|
||||||
|
return field;
|
||||||
|
}
|
||||||
|
|
||||||
|
private JComponent constructDefaultNamespaceField() {
|
||||||
|
defaultNamespace = new ExtendableTextField(20);
|
||||||
|
defaultNamespace.setToolTipText(bundle.getString("settings.editor.default-namespace.tooltip"));
|
||||||
|
return defaultNamespace;
|
||||||
|
}
|
||||||
|
|
||||||
|
private JComponent constructPreviewLocaleField() {
|
||||||
|
previewLocale = new ExtendableTextField(12);
|
||||||
|
previewLocale.setToolTipText(bundle.getString("settings.editor.preview.tooltip"));
|
||||||
|
return previewLocale;
|
||||||
|
}
|
||||||
|
|
||||||
|
private JComponent constructNestedKeysField() {
|
||||||
|
nestedKeys = new JBCheckBox(bundle.getString("settings.editor.key.nesting.title"));
|
||||||
|
nestedKeys.setToolTipText(bundle.getString("settings.editor.key.nesting.tooltip"));
|
||||||
|
return nestedKeys;
|
||||||
|
}
|
||||||
|
|
||||||
|
private JComponent constructAssistanceField() {
|
||||||
|
assistance = new JBCheckBox(bundle.getString("settings.editor.assistance.title"));
|
||||||
|
assistance.setToolTipText(bundle.getString("settings.editor.assistance.tooltip"));
|
||||||
|
return assistance;
|
||||||
|
}
|
||||||
|
|
||||||
|
private ItemListener handleParserChange() {
|
||||||
|
return e -> {
|
||||||
|
if(e.getStateChange() == ItemEvent.SELECTED) {
|
||||||
|
// Automatically suggest file pattern option on parser change
|
||||||
|
ParserStrategyType newStrategy = ParserStrategyType.fromIndex(parserStrategy.getSelectedIndex());
|
||||||
|
filePattern.setText(newStrategy.getExampleFilePattern());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public JPanel getMainPanel() {
|
||||||
|
return mainPanel;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,82 @@
|
|||||||
|
package de.marhali.easyi18n.settings;
|
||||||
|
|
||||||
|
import com.intellij.openapi.ui.ComboBox;
|
||||||
|
import com.intellij.openapi.ui.TextFieldWithBrowseButton;
|
||||||
|
|
||||||
|
import de.marhali.easyi18n.io.parser.ParserStrategyType;
|
||||||
|
import de.marhali.easyi18n.model.FolderStrategyType;
|
||||||
|
import de.marhali.easyi18n.settings.presets.Preset;
|
||||||
|
|
||||||
|
import javax.swing.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mandatory for state management for the project settings component.
|
||||||
|
* @author marhali
|
||||||
|
*/
|
||||||
|
public class ProjectSettingsComponentState {
|
||||||
|
|
||||||
|
protected ComboBox<Preset> preset;
|
||||||
|
|
||||||
|
// Resource Configuration
|
||||||
|
protected TextFieldWithBrowseButton localesDirectory;
|
||||||
|
protected ComboBox<String> folderStrategy;
|
||||||
|
protected ComboBox<String> parserStrategy;
|
||||||
|
protected JTextField filePattern;
|
||||||
|
|
||||||
|
protected JCheckBox sorting;
|
||||||
|
|
||||||
|
// Editor configuration
|
||||||
|
protected JTextField namespaceDelimiter;
|
||||||
|
protected JTextField sectionDelimiter;
|
||||||
|
protected JTextField contextDelimiter;
|
||||||
|
protected JTextField pluralDelimiter;
|
||||||
|
protected JTextField defaultNamespace;
|
||||||
|
protected JTextField previewLocale;
|
||||||
|
|
||||||
|
protected JCheckBox nestedKeys;
|
||||||
|
protected JCheckBox assistance;
|
||||||
|
|
||||||
|
protected ProjectSettingsState getState() {
|
||||||
|
// Every field needs to provide its state
|
||||||
|
ProjectSettingsState state = new ProjectSettingsState();
|
||||||
|
|
||||||
|
state.setLocalesDirectory(localesDirectory.getText());
|
||||||
|
state.setFolderStrategy(FolderStrategyType.fromIndex(folderStrategy.getSelectedIndex()));
|
||||||
|
state.setParserStrategy(ParserStrategyType.fromIndex(parserStrategy.getSelectedIndex()));
|
||||||
|
state.setFilePattern(filePattern.getText());
|
||||||
|
|
||||||
|
state.setSorting(sorting.isSelected());
|
||||||
|
|
||||||
|
state.setNamespaceDelimiter(namespaceDelimiter.getText());
|
||||||
|
state.setSectionDelimiter(sectionDelimiter.getText());
|
||||||
|
state.setContextDelimiter(contextDelimiter.getText());
|
||||||
|
state.setPluralDelimiter(pluralDelimiter.getText());
|
||||||
|
state.setDefaultNamespace(defaultNamespace.getText());
|
||||||
|
state.setPreviewLocale(previewLocale.getText());
|
||||||
|
|
||||||
|
state.setNestedKeys(nestedKeys.isSelected());
|
||||||
|
state.setAssistance(assistance.isSelected());
|
||||||
|
|
||||||
|
return state;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void setState(ProjectSettings state) {
|
||||||
|
// Update every field with the new state
|
||||||
|
localesDirectory.setText(state.getLocalesDirectory());
|
||||||
|
folderStrategy.setSelectedIndex(state.getFolderStrategy().toIndex());
|
||||||
|
parserStrategy.setSelectedIndex((state.getParserStrategy().toIndex()));
|
||||||
|
filePattern.setText(state.getFilePattern());
|
||||||
|
|
||||||
|
sorting.setSelected(state.isSorting());
|
||||||
|
|
||||||
|
namespaceDelimiter.setText(state.getNamespaceDelimiter());
|
||||||
|
sectionDelimiter.setText(state.getSectionDelimiter());
|
||||||
|
contextDelimiter.setText(state.getContextDelimiter());
|
||||||
|
pluralDelimiter.setText(state.getPluralDelimiter());
|
||||||
|
defaultNamespace.setText(state.getDefaultNamespace());
|
||||||
|
previewLocale.setText(state.getPreviewLocale());
|
||||||
|
|
||||||
|
nestedKeys.setSelected(state.isNestedKeys());
|
||||||
|
assistance.setSelected(state.isAssistance());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,59 @@
|
|||||||
|
package de.marhali.easyi18n.settings;
|
||||||
|
|
||||||
|
import com.intellij.openapi.options.Configurable;
|
||||||
|
import com.intellij.openapi.project.Project;
|
||||||
|
|
||||||
|
import de.marhali.easyi18n.InstanceManager;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import javax.swing.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* IDE settings panel for this plugin
|
||||||
|
* @author marhali
|
||||||
|
*/
|
||||||
|
public class ProjectSettingsConfigurable implements Configurable {
|
||||||
|
|
||||||
|
private final Project project;
|
||||||
|
|
||||||
|
private ProjectSettingsComponent component;
|
||||||
|
|
||||||
|
public ProjectSettingsConfigurable(Project project) {
|
||||||
|
this.project = project;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getDisplayName() {
|
||||||
|
return "Easy I18n";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @Nullable JComponent createComponent() {
|
||||||
|
component = new ProjectSettingsComponent(project);
|
||||||
|
component.setState(ProjectSettingsService.get(project).getState());
|
||||||
|
return component.getMainPanel();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isModified() {
|
||||||
|
ProjectSettingsState originState = ProjectSettingsService.get(project).getState();
|
||||||
|
return !originState.equals(component.getState());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void apply() {
|
||||||
|
ProjectSettingsService.get(project).setState(component.getState());
|
||||||
|
InstanceManager.get(project).reload();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void reset() {
|
||||||
|
component.setState(ProjectSettingsService.get(project).getState());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void disposeUIResources() {
|
||||||
|
component = null;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,47 @@
|
|||||||
|
package de.marhali.easyi18n.settings;
|
||||||
|
|
||||||
|
import com.intellij.openapi.components.PersistentStateComponent;
|
||||||
|
import com.intellij.openapi.components.State;
|
||||||
|
import com.intellij.openapi.components.Storage;
|
||||||
|
import com.intellij.openapi.project.Project;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Persistent storage for project-specific settings.
|
||||||
|
* @author marhali
|
||||||
|
*/
|
||||||
|
@State(
|
||||||
|
name = "ProjectSettingsService",
|
||||||
|
storages = @Storage("easy-i18n.xml")
|
||||||
|
)
|
||||||
|
public class ProjectSettingsService implements PersistentStateComponent<ProjectSettingsState> {
|
||||||
|
|
||||||
|
public static @NotNull ProjectSettingsService get(@NotNull Project project) {
|
||||||
|
return project.getService(ProjectSettingsService.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
private ProjectSettingsState state;
|
||||||
|
|
||||||
|
public ProjectSettingsService() {
|
||||||
|
this.state = new ProjectSettingsState();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the provided configuration and invalidates the merged state.
|
||||||
|
* @param state New configuration
|
||||||
|
*/
|
||||||
|
protected void setState(@NotNull ProjectSettingsState state) {
|
||||||
|
this.state = state;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull ProjectSettingsState getState() {
|
||||||
|
return state;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void loadState(@NotNull ProjectSettingsState state) {
|
||||||
|
this.state = state;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,156 @@
|
|||||||
|
package de.marhali.easyi18n.settings;
|
||||||
|
|
||||||
|
import de.marhali.easyi18n.io.parser.ParserStrategyType;
|
||||||
|
import de.marhali.easyi18n.model.FolderStrategyType;
|
||||||
|
import de.marhali.easyi18n.settings.presets.DefaultPreset;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents the project-specific configuration of this plugin.
|
||||||
|
* @author marhali
|
||||||
|
*/
|
||||||
|
public class ProjectSettingsState implements ProjectSettings {
|
||||||
|
|
||||||
|
private static final ProjectSettings defaults = new DefaultPreset();
|
||||||
|
|
||||||
|
// Resource Configuration
|
||||||
|
private String localesDirectory;
|
||||||
|
private FolderStrategyType folderStrategy;
|
||||||
|
private ParserStrategyType parserStrategy;
|
||||||
|
private String filePattern;
|
||||||
|
|
||||||
|
private Boolean sorting;
|
||||||
|
|
||||||
|
// Editor configuration
|
||||||
|
private String namespaceDelimiter;
|
||||||
|
private String sectionDelimiter;
|
||||||
|
private String contextDelimiter;
|
||||||
|
private String pluralDelimiter;
|
||||||
|
private String defaultNamespace;
|
||||||
|
private String previewLocale;
|
||||||
|
|
||||||
|
private Boolean nestedKeys;
|
||||||
|
private Boolean assistance;
|
||||||
|
|
||||||
|
public ProjectSettingsState() {}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @Nullable String getLocalesDirectory() {
|
||||||
|
return localesDirectory != null ? localesDirectory : defaults.getLocalesDirectory();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull FolderStrategyType getFolderStrategy() {
|
||||||
|
return folderStrategy != null ? folderStrategy : defaults.getFolderStrategy();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull ParserStrategyType getParserStrategy() {
|
||||||
|
return parserStrategy != null ? parserStrategy : defaults.getParserStrategy();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull String getFilePattern() {
|
||||||
|
return filePattern != null ? filePattern : defaults.getFilePattern();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isSorting() {
|
||||||
|
return sorting != null ? sorting : defaults.isSorting();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @Nullable String getNamespaceDelimiter() {
|
||||||
|
return namespaceDelimiter != null ? namespaceDelimiter : defaults.getNamespaceDelimiter();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull String getSectionDelimiter() {
|
||||||
|
return sectionDelimiter != null ? sectionDelimiter : defaults.getSectionDelimiter();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @Nullable String getContextDelimiter() {
|
||||||
|
return contextDelimiter != null ? contextDelimiter : defaults.getContextDelimiter();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @Nullable String getPluralDelimiter() {
|
||||||
|
return pluralDelimiter != null ? pluralDelimiter : defaults.getPluralDelimiter();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public String getDefaultNamespace() {
|
||||||
|
return defaultNamespace;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull String getPreviewLocale() {
|
||||||
|
return previewLocale != null ? previewLocale : defaults.getPreviewLocale();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isNestedKeys() {
|
||||||
|
return nestedKeys != null ? nestedKeys : defaults.isNestedKeys();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isAssistance() {
|
||||||
|
return assistance != null ? assistance : defaults.isAssistance();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLocalesDirectory(String localesDirectory) {
|
||||||
|
this.localesDirectory = localesDirectory;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFolderStrategy(FolderStrategyType folderStrategy) {
|
||||||
|
this.folderStrategy = folderStrategy;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setParserStrategy(ParserStrategyType parserStrategy) {
|
||||||
|
this.parserStrategy = parserStrategy;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFilePattern(String filePattern) {
|
||||||
|
this.filePattern = filePattern;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSorting(Boolean sorting) {
|
||||||
|
this.sorting = sorting;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNamespaceDelimiter(String namespaceDelimiter) {
|
||||||
|
this.namespaceDelimiter = namespaceDelimiter;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSectionDelimiter(String sectionDelimiter) {
|
||||||
|
this.sectionDelimiter = sectionDelimiter;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setContextDelimiter(String contextDelimiter) {
|
||||||
|
this.contextDelimiter = contextDelimiter;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPluralDelimiter(String pluralDelimiter) {
|
||||||
|
this.pluralDelimiter = pluralDelimiter;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDefaultNamespace(String defaultNamespace) {
|
||||||
|
this.defaultNamespace = defaultNamespace;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPreviewLocale(String previewLocale) {
|
||||||
|
this.previewLocale = previewLocale;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNestedKeys(Boolean nestedKeys) {
|
||||||
|
this.nestedKeys = nestedKeys;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAssistance(Boolean assistance) {
|
||||||
|
this.assistance = assistance;
|
||||||
|
}
|
||||||
|
}
|
@ -24,9 +24,14 @@
|
|||||||
</actions>
|
</actions>
|
||||||
|
|
||||||
<extensions defaultExtensionNs="com.intellij">
|
<extensions defaultExtensionNs="com.intellij">
|
||||||
<toolWindow id="Easy I18n" anchor="bottom" factoryClass="de.marhali.easyi18n.service.TranslatorToolWindowFactory" />
|
<toolWindow id="Easy I18n" anchor="bottom"
|
||||||
|
factoryClass="de.marhali.easyi18n.service.TranslatorToolWindowFactory"/>
|
||||||
|
|
||||||
<projectService serviceImplementation="de.marhali.easyi18n.service.SettingsService" />
|
<projectService serviceImplementation="de.marhali.easyi18n.settings.ProjectSettingsService"/>
|
||||||
|
|
||||||
|
<projectConfigurable parentId="tools" instance="de.marhali.easyi18n.settings.ProjectSettingsConfigurable"
|
||||||
|
id="de.marhali.easyi18n.service.AppSettingsConfigurable"
|
||||||
|
displayName="Easy I18n" nonDefaultProject="true"/>
|
||||||
|
|
||||||
<completion.contributor language="any"
|
<completion.contributor language="any"
|
||||||
implementationClass="de.marhali.easyi18n.editor.generic.GenericKeyCompletionContributor"/>
|
implementationClass="de.marhali.easyi18n.editor.generic.GenericKeyCompletionContributor"/>
|
||||||
|
@ -12,19 +12,44 @@ action.search=Search...
|
|||||||
action.delete=Delete
|
action.delete=Delete
|
||||||
translation.key=Key
|
translation.key=Key
|
||||||
translation.locales=Locales
|
translation.locales=Locales
|
||||||
settings.path.title=Locales Directory
|
# Settings
|
||||||
settings.path.text=Locales directory
|
settings.hint.text=Project-specific configuration for using your translation files. For an easy start, you can use one of the existing presets.
|
||||||
settings.strategy.title=Translation file structure
|
settings.hint.action=Fore more information, see the documentation
|
||||||
settings.strategy.folder=Single Directory;Modularized: Locale / Namespace;Modularized: Namespace / Locale
|
settings.preset.title=Preset
|
||||||
settings.strategy.folder.tooltip=What is the folder structure of your translation files?
|
settings.preset.tooltip=Choose a configuration template that best fits your project. After that you can make further changes.
|
||||||
settings.strategy.parser=JSON;JSON5;YAML;YML;Properties;ARB
|
# Resource Configuration
|
||||||
settings.strategy.parser.tooltip=Which file parser should be used to process your translation files?
|
settings.resource.title=Resource Configuration
|
||||||
settings.strategy.file-pattern.tooltip=Defines a wildcard matcher to filter relevant translation files. For example *.json, *.???.
|
settings.resource.path.window=Locales Directory
|
||||||
settings.preview=Preview locale
|
settings.resource.path.title=Locales directory
|
||||||
settings.path.prefix=Path prefix
|
settings.resource.path.tooltip=Define the folder which contains all translation files. For nested folders, use the top folder.
|
||||||
settings.keys.sort=Sort translation keys alphabetically
|
settings.resource.strategy=File structure
|
||||||
settings.keys.nested=Escape delimiter character within a section layer.
|
settings.resource.folder.items=Single Directory;Modularized: Locale / Namespace;Modularized: Namespace / Locale
|
||||||
settings.editor.assistance=I18n key completion, annotation and reference inside editor
|
settings.resource.folder.tooltip=What is the folder structure of your translation files?
|
||||||
|
settings.resource.parser.items=JSON;JSON5;YAML;YML;Properties;ARB
|
||||||
|
settings.resource.parser.tooltip=Which file parser should be used to process your translation files?
|
||||||
|
settings.resource.file-pattern.tooltip=Defines a wildcard matcher to filter relevant translation files. For example *.json, *.??? or *.*.
|
||||||
|
settings.resource.sorting.title=Sort translation keys alphabetically
|
||||||
|
settings.resource.sorting.tooltip=Sorts all translation keys alphabetically. If disabled, the original key-order in the files is kept.
|
||||||
|
# Editor Configuration
|
||||||
|
settings.editor.title=Editor Configuration
|
||||||
|
settings.editor.key.title=Key delimiters
|
||||||
|
settings.editor.key.namespace.title=[namespace]
|
||||||
|
settings.editor.key.namespace.tooltip=Sets the separator used between namespace and key path.
|
||||||
|
settings.editor.key.section.title=[section]
|
||||||
|
settings.editor.key.section.tooltip=Sets the separator used between section nodes of the key path.
|
||||||
|
settings.editor.key.node.title=[node]
|
||||||
|
settings.editor.key.context.title=[context]
|
||||||
|
settings.editor.key.context.tooltip=Sets the separator used to define context-specific variants of a translation.
|
||||||
|
settings.editor.key.plural.title=[pluralization]
|
||||||
|
settings.editor.key.plural.tooltip=Sets the separator used to define different pluralization's of a translation.
|
||||||
|
settings.editor.default-namespace.title=Default namespace
|
||||||
|
settings.editor.default-namespace.tooltip=Specifies the namespace to use by default if none is specified in a translation key. The field can be left blank to ignore this feature.
|
||||||
|
settings.editor.preview.title=Preview locale
|
||||||
|
settings.editor.preview.tooltip=Defines the language to be displayed in editor previews.
|
||||||
|
settings.editor.key.nesting.title=Escape section delimiter within a section layer
|
||||||
|
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.tooltip=Activates editor support to reference, auto-complete and folding of existing translations.
|
||||||
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\
|
||||||
|
Loading…
x
Reference in New Issue
Block a user