diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c53ff0..c43f4f5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ ## [Unreleased] ### Added +- Partial support for translation key folding against actual translation - Support for json based arb files (flutter) ### Changed diff --git a/gradle.properties b/gradle.properties index 3d5d1ad..18e0df9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,12 +12,12 @@ pluginSinceBuild = 203 pluginUntilBuild = 213.* # IntelliJ Platform Properties -> https://github.com/JetBrains/gradle-intellij-plugin#intellij-platform-properties -platformType = IC +platformType = IU platformVersion = 2021.3 # Plugin Dependencies -> https://plugins.jetbrains.com/docs/intellij/plugin-dependencies.html # Example: platformPlugins = com.intellij.java, com.jetbrains.php:203.4449.22 -platformPlugins = org.jetbrains.kotlin +platformPlugins = org.jetbrains.kotlin, JavaScriptLanguage # Java language level used to compile sources and to generate the files for - Java 11 is required since 2020.3 javaVersion = 11 diff --git a/src/main/java/de/marhali/easyi18n/editor/generic/GenericFoldingBuilder.java b/src/main/java/de/marhali/easyi18n/editor/generic/GenericFoldingBuilder.java new file mode 100644 index 0000000..114847f --- /dev/null +++ b/src/main/java/de/marhali/easyi18n/editor/generic/GenericFoldingBuilder.java @@ -0,0 +1,83 @@ +package de.marhali.easyi18n.editor.generic; + +import com.intellij.lang.ASTNode; +import com.intellij.lang.folding.FoldingBuilderEx; +import com.intellij.lang.folding.FoldingDescriptor; +import com.intellij.openapi.editor.Document; +import com.intellij.openapi.util.TextRange; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiLiteralValue; +import com.intellij.psi.util.PsiTreeUtil; + +import de.marhali.easyi18n.DataStore; +import de.marhali.easyi18n.InstanceManager; +import de.marhali.easyi18n.model.Translation; +import de.marhali.easyi18n.service.SettingsService; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +/** + * Translation key folding with actual value based on i18n instance. + * @author marhali + */ +public class GenericFoldingBuilder extends FoldingBuilderEx { + + @Override + public FoldingDescriptor @NotNull [] buildFoldRegions(@NotNull PsiElement root, @NotNull Document document, boolean quick) { + Collection literalValues = PsiTreeUtil.findChildrenOfType(root, PsiLiteralValue.class); + List descriptors = new ArrayList<>(); + + if(!SettingsService.getInstance(root.getProject()).getState().isCodeAssistance()) { + return FoldingDescriptor.EMPTY; + } + + DataStore store = InstanceManager.get(root.getProject()).store(); + + for(final PsiLiteralValue literalValue : literalValues) { + String value = literalValue.getValue() instanceof String ? (String) literalValue.getValue() : null; + + // Undefined string literal or not a translation + if(value == null || store.getData().getTranslation(value) == null) { + continue; + } + + descriptors.add(new FoldingDescriptor(literalValue.getNode(), + new TextRange(literalValue.getTextRange().getStartOffset() + 1, + literalValue.getTextRange().getEndOffset() - 1))); + } + + return descriptors.toArray(new FoldingDescriptor[0]); + } + + @Nullable + @Override + public String getPlaceholderText(@NotNull ASTNode node) { + PsiLiteralValue literalValue = node.getPsi(PsiLiteralValue.class); + String value = literalValue.getValue() instanceof String ? (String) literalValue.getValue() : null; + + if(value == null) { + return null; + } + + DataStore store = InstanceManager.get(literalValue.getProject()).store(); + Translation translation = store.getData().getTranslation(value); + + if(translation == null) { + return null; + } + + String previewLocale = SettingsService.getInstance(literalValue.getProject()).getState().getPreviewLocale(); + + return translation.get(previewLocale); + } + + @Override + public boolean isCollapsedByDefault(@NotNull ASTNode node) { + return true; + } +} \ No newline at end of file diff --git a/src/main/resources/META-INF/de.marhali.easyi18n-java.xml b/src/main/resources/META-INF/de.marhali.easyi18n-java.xml new file mode 100644 index 0000000..4bf69d7 --- /dev/null +++ b/src/main/resources/META-INF/de.marhali.easyi18n-java.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/src/main/resources/META-INF/de.marhali.easyi18n-javascript.xml b/src/main/resources/META-INF/de.marhali.easyi18n-javascript.xml new file mode 100644 index 0000000..132273b --- /dev/null +++ b/src/main/resources/META-INF/de.marhali.easyi18n-javascript.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index 9d1fd69..353d08c 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -8,17 +8,26 @@ com.intellij.modules.platform com.intellij.modules.lang + org.jetbrains.kotlin + JavaScript + com.intellij.java + - + - + + + \ No newline at end of file