Skip to content

Commit a4493b5

Browse files
authored
Merge pull request #1955 from Haehnchen/feature/translation-detection
try to detect yaml translation files also on language pattern
2 parents 040158f + 56a6c88 commit a4493b5

File tree

2 files changed

+60
-5
lines changed

2 files changed

+60
-5
lines changed

src/main/java/fr/adrienbrault/idea/symfony2plugin/stubs/indexes/TranslationStubIndex.java

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.intellij.openapi.fileTypes.FileType;
44
import com.intellij.openapi.vfs.VfsUtil;
5+
import com.intellij.openapi.vfs.VirtualFile;
56
import com.intellij.psi.PsiElement;
67
import com.intellij.psi.PsiFile;
78
import com.intellij.util.indexing.*;
@@ -18,6 +19,7 @@
1819
import fr.adrienbrault.idea.symfony2plugin.util.ProjectUtil;
1920
import gnu.trove.THashMap;
2021
import kotlin.Pair;
22+
import org.apache.commons.lang.ArrayUtils;
2123
import org.apache.commons.lang.StringUtils;
2224
import org.jetbrains.annotations.NotNull;
2325
import org.jetbrains.annotations.Nullable;
@@ -28,6 +30,8 @@
2830
import java.io.InputStream;
2931
import java.util.*;
3032
import java.util.function.Consumer;
33+
import java.util.regex.Matcher;
34+
import java.util.regex.Pattern;
3135

3236
/**
3337
* @author Daniel Espendiller <daniel@espendiller.net>
@@ -98,18 +102,40 @@ public Map<String, Set<String>> map(@NotNull FileContent inputData) {
98102
}
99103

100104
private boolean isValidTranslationFile(@NotNull FileContent inputData) {
105+
String fileName = inputData.getFileName();
106+
107+
// every direct match
108+
if (fileName.contains("+intl-icu") || fileName.startsWith("messages.") || fileName.startsWith("validators.")) {
109+
return true;
110+
}
111+
112+
VirtualFile file = inputData.getFile();
113+
String name = file.getNameWithoutExtension();
114+
115+
// unknown-2.fr.yml
116+
Matcher matcher = Pattern.compile("^.*\\.([\\w]{2})$").matcher(name);
117+
if (matcher.find()) {
118+
return ArrayUtils.contains(Locale.getISOLanguages(), matcher.group(1));
119+
}
120+
121+
// unknown-3.sr_Cyrl.yml
122+
Matcher matcher2 = Pattern.compile("^.*\\.([\\w]{2})_[\\w]{2,4}$").matcher(name);
123+
if (matcher2.find()) {
124+
return ArrayUtils.contains(Locale.getISOLanguages(), matcher2.group(1));
125+
}
126+
101127
// dont index all yaml files; valid:
102128
// - "Resources/translations"
103129
// - "translations/[.../]foo.de.yml"
104-
String relativePath = VfsUtil.getRelativePath(inputData.getFile(), ProjectUtil.getProjectDir(inputData.getProject()), '/');
130+
String relativePath = VfsUtil.getRelativePath(file, ProjectUtil.getProjectDir(inputData.getProject()), '/');
105131
if (relativePath != null) {
106-
return relativePath.contains("/translations") || relativePath.startsWith("translations/");
132+
String replace = relativePath.replace("\\", "/");
133+
return replace.contains("/translations") || replace.startsWith("translations/");
107134
}
108135

109136
// Resources/translations/messages.de.yml
110-
// @TODO: Resources/translations/de/messages.yml
111-
String path = inputData.getFile().getPath();
112-
return path.endsWith("/translations/" + inputData.getFileName());
137+
String path = file.getPath();
138+
return path.replace("\\", "/").endsWith("/translations/" + fileName);
113139
}
114140

115141
@NotNull

src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/stubs/indexes/TranslationStubIndexTest.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,20 @@
11
package fr.adrienbrault.idea.symfony2plugin.tests.stubs.indexes;
22

3+
import com.intellij.openapi.vfs.VirtualFile;
34
import com.intellij.psi.search.GlobalSearchScope;
5+
import com.intellij.util.Processor;
46
import com.intellij.util.containers.ArrayListSet;
57
import com.intellij.util.containers.ContainerUtil;
68
import com.intellij.util.indexing.FileBasedIndex;
9+
import com.jetbrains.twig.TwigFileType;
710
import fr.adrienbrault.idea.symfony2plugin.stubs.indexes.TranslationStubIndex;
811
import fr.adrienbrault.idea.symfony2plugin.tests.SymfonyLightCodeInsightFixtureTestCase;
912
import org.apache.commons.lang.StringUtils;
1013
import org.jetbrains.annotations.NotNull;
1114

15+
import java.util.Arrays;
16+
import java.util.HashSet;
17+
import java.util.List;
1218
import java.util.Set;
1319

1420
/**
@@ -36,12 +42,35 @@ public void setUp() throws Exception {
3642

3743
myFixture.copyFileToProject("fr.xlf", "+intl-icu.fr.xlf");
3844
myFixture.copyFileToProject("fr.xlf", " .fr.xlf");
45+
46+
myFixture.copyFileToProject("apple.de.yml", "unknown/unknown-1+intl-icu.fr.yml");
47+
myFixture.copyFileToProject("apple.de.yml", "unknown/messages.ar.yml");
48+
myFixture.copyFileToProject("apple.de.yml", "unknown/validators.ar.yml");
49+
myFixture.copyFileToProject("apple.de.yml", "unknown/unknown-2.fr.yml");
50+
myFixture.copyFileToProject("apple.de.yml", "unknown/unknown-3.sr_Cyrl.yml");
51+
myFixture.copyFileToProject("apple.de.yml", "unknown/unknown-3.sr_Cyrla.yml");
52+
myFixture.copyFileToProject("apple.de.yml", "unknown/unknown-3.xx.yml");
53+
myFixture.copyFileToProject("apple.de.yml", "unknown/unknown-3.yml");
3954
}
4055

4156
public String getTestDataPath() {
4257
return "src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/stubs/indexes/fixtures";
4358
}
4459

60+
public void testNamingMatchingForTranslations() {
61+
Set<String> filenames = new HashSet<>();
62+
63+
for (String key : new String[]{"unknown-1", "unknown-2", "unknown-3", "validators", "messages"}) {
64+
FileBasedIndex.getInstance().getFilesWithKey(TranslationStubIndex.KEY, new HashSet<>(List.of(key)), virtualFile -> {
65+
filenames.add(virtualFile.getName());
66+
return true;
67+
}, GlobalSearchScope.allScope(getProject()));
68+
}
69+
70+
assertContainsElements(filenames, "unknown-1+intl-icu.fr.yml", "messages.ar.yml", "validators.ar.yml", "unknown-2.fr.yml", "unknown-3.sr_Cyrl.yml");
71+
assertDoesntContain(filenames, "unknown-3.sr_Cyrla.yml", "unknown-3.xx.yml", "unknown-3.yml");
72+
}
73+
4574
public void testThatDomainFromFileIsExtracted() {
4675
assertIndexContains(TranslationStubIndex.KEY, "foo.bar");
4776
assertIndexNotContains(TranslationStubIndex.KEY, "");

0 commit comments

Comments
 (0)