Skip to content

Commit

Permalink
#1584 Add better support for multiple locales in translations
Browse files Browse the repository at this point in the history
  • Loading branch information
Haehnchen committed Jun 6, 2023
1 parent 3598fb0 commit 7bd0ceb
Show file tree
Hide file tree
Showing 2 changed files with 119 additions and 6 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
package fr.adrienbrault.idea.symfony2plugin.translation;

import com.intellij.icons.AllIcons;
import com.intellij.json.psi.JsonFile;
import com.intellij.navigation.ItemPresentation;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.xml.XmlFile;
import com.intellij.ui.LayeredIcon;
import com.intellij.ui.SizedIcon;
import com.intellij.util.xml.model.gotosymbol.GoToSymbolProvider;
import com.jetbrains.php.lang.psi.PhpFile;
import fr.adrienbrault.idea.symfony2plugin.Symfony2Icons;
import icons.PhpIcons;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.yaml.psi.YAMLFile;

import javax.swing.*;

/**
* @author Daniel Espendiller <daniel@espendiller.net>
*/
public class TranslationKeyTargetFakePsiNavigationItem extends GoToSymbolProvider.BaseNavigationItem {
private final VirtualFile projectDir;
private final PsiElement myPsiElement;
private final String rootDir;

public TranslationKeyTargetFakePsiNavigationItem(@NotNull VirtualFile projectDir, @NotNull PsiElement psiElement) {
super(psiElement, "", null);

this.projectDir = projectDir;
this.rootDir = VfsUtil.getRelativePath(psiElement.getContainingFile().getVirtualFile(), projectDir, '/');
this.myPsiElement = psiElement;
}

@Override
public Icon getIcon(boolean flags) {
return getFileIcon();
}

public int getWeight() {
if (("/" + rootDir).startsWith("/translations/")) {
return 2;
}

return isSymfonyTranslationDirectory() ? 1 : 0;
}

public ItemPresentation getPresentation() {
return new ItemPresentation() {
@Override
public String getPresentableText() {
return myPsiElement.getContainingFile().getName();
}

@Override
public String getLocationString() {
String relativePath = VfsUtil.getRelativePath(myPsiElement.getContainingFile().getVirtualFile(), projectDir, '/');
if (relativePath != null) {
return '(' + relativePath + ')';
}

return '(' + myPsiElement.getContainingFile().getVirtualFile().toString() + ')';
}

@Override
@Nullable
public Icon getIcon(boolean open) {
return TranslationKeyTargetFakePsiNavigationItem.this.getIcon(ICON_FLAG_VISIBILITY);
}
};
}

private Icon getFileIcon() {
Icon fileIcon;

PsiFile containingFile = myPsiElement.getContainingFile();
if (containingFile instanceof YAMLFile) {
fileIcon = AllIcons.FileTypes.Yaml;
} else if (containingFile instanceof PhpFile) {
fileIcon = PhpIcons.PhpIcon;
} else if (containingFile instanceof XmlFile) {
fileIcon = AllIcons.FileTypes.Xml;
} else if (containingFile instanceof JsonFile) {
fileIcon = AllIcons.FileTypes.Json;
} else {
// for non registered state
String extension = myPsiElement.getContainingFile().getVirtualFile().getExtension();

fileIcon = "xlf".equalsIgnoreCase(extension) || "xliff".equalsIgnoreCase(extension)
? AllIcons.FileTypes.Xml
: myPsiElement.getIcon(ICON_FLAG_VISIBILITY);
}

if (rootDir != null && isSymfonyTranslationDirectory()) {
SizedIcon sizedIcon = new SizedIcon(Symfony2Icons.SYMFONY_LINE_MARKER, fileIcon.getIconWidth() / 2, fileIcon.getIconHeight() / 2);
LayeredIcon icon = new LayeredIcon(fileIcon, sizedIcon);
icon.setIcon(sizedIcon, 1, SwingConstants.SOUTH_EAST);
return icon;
}

return fileIcon;
}


private boolean isSymfonyTranslationDirectory() {
return ("/" + rootDir).contains("/vendor/") && rootDir.contains("/symfony/") && rootDir.contains("/Resources/translations/");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import fr.adrienbrault.idea.symfony2plugin.extension.TranslatorProviderDict;
import fr.adrienbrault.idea.symfony2plugin.stubs.indexes.TranslationStubIndex;
import fr.adrienbrault.idea.symfony2plugin.stubs.indexes.visitor.TranslationArrayReturnVisitor;
import fr.adrienbrault.idea.symfony2plugin.translation.TranslationKeyTargetFakePsiNavigationItem;
import fr.adrienbrault.idea.symfony2plugin.translation.TranslatorLookupElement;
import fr.adrienbrault.idea.symfony2plugin.translation.collector.YamlTranslationVisitor;
import fr.adrienbrault.idea.symfony2plugin.translation.parser.DomainMappings;
Expand All @@ -28,6 +29,7 @@
import fr.adrienbrault.idea.symfony2plugin.translation.provider.IndexTranslatorProvider;
import fr.adrienbrault.idea.symfony2plugin.util.MethodMatcher;
import fr.adrienbrault.idea.symfony2plugin.util.PhpElementsUtil;
import fr.adrienbrault.idea.symfony2plugin.util.ProjectUtil;
import fr.adrienbrault.idea.symfony2plugin.util.PsiElementUtils;
import fr.adrienbrault.idea.symfony2plugin.util.service.ServiceXmlParserFactory;
import org.apache.commons.lang.StringUtils;
Expand Down Expand Up @@ -175,13 +177,12 @@ public static Collection<PsiElement> getTranslationKeyTargetInsideFile(@NotNull
}

public static PsiElement[] getTranslationPsiElements(@NotNull Project project, @NotNull String translationKey, @NotNull String domain) {
Collection<PsiElement> targets = new HashSet<>();

Arrays.stream(getTranslationProviders())
return Arrays.stream(getTranslationProviders())
.map(translationProvider -> translationProvider.getTranslationTargets(project, translationKey, domain))
.forEach(targets::addAll);

return targets.toArray(new PsiElement[0]);
.flatMap(Collection::stream)
.map(element -> new TranslationKeyTargetFakePsiNavigationItem(ProjectUtil.getProjectDir(project), element))
.sorted(Comparator.comparingInt(TranslationKeyTargetFakePsiNavigationItem::getWeight))
.toArray(PsiElement[]::new);
}

/**
Expand Down

0 comments on commit 7bd0ceb

Please sign in to comment.