diff --git a/src/main/java/fr/adrienbrault/idea/symfony2plugin/translation/parser/DomainMappings.java b/src/main/java/fr/adrienbrault/idea/symfony2plugin/translation/parser/DomainMappings.java index cbc831bf1..0bc490c48 100644 --- a/src/main/java/fr/adrienbrault/idea/symfony2plugin/translation/parser/DomainMappings.java +++ b/src/main/java/fr/adrienbrault/idea/symfony2plugin/translation/parser/DomainMappings.java @@ -6,6 +6,7 @@ import org.w3c.dom.NodeList; import java.io.InputStream; +import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; @@ -19,7 +20,9 @@ public class DomainMappings extends AbstractServiceParser { @Override public String getXPathFilter() { - return "/container/services/service[@class=\"Symfony\\Bundle\\FrameworkBundle\\Translation\\Translator\"]//call[@method=\"addResource\"]"; + return + "/container/services/service[@class=\"Symfony\\Bundle\\FrameworkBundle\\Translation\\Translator\"]//call[@method=\"addResource\"]" // Symfony < 4 + + " | /container/services/service[@class=\"Symfony\\Bundle\\FrameworkBundle\\Translation\\Translator\"]//argument[@key=\"resource_files\"]/argument/argument"; } public void parser(InputStream file) { @@ -32,17 +35,37 @@ public void parser(InputStream file) { for (int i = 0; i < nodeList.getLength(); i++) { Element node = (Element) nodeList.item(i); - NodeList arguments = node.getElementsByTagName("argument"); + String tagName = node.getTagName(); - if(arguments.getLength() == 4) { - this.domainFileMaps.add(new DomainFileMap(arguments.item(0).getTextContent(), arguments.item(1).getTextContent(), arguments.item(2).getTextContent(), arguments.item(3).getTextContent())); + if ("call".equals(tagName)) { + // Symfony < 4: via addResource + NodeList arguments = node.getElementsByTagName("argument"); + + if(arguments.getLength() == 4) { + this.domainFileMaps.add(new DomainFileMap(arguments.item(0).getTextContent(), arguments.item(1).getTextContent(), arguments.item(2).getTextContent(), arguments.item(3).getTextContent())); + } + } else if("argument".equals(tagName)) { + // Symfony 5: arguments in constructor + + // normalize path name + String path = node.getTextContent().replace("\\", "/"); + + // get file name + int filenameStart = path.lastIndexOf("/"); + if (filenameStart > 0) { + String filename = path.substring(filenameStart + 1); + + // split by filename: validators.af.xlf + String[] split = filename.split("\\."); + if (split.length == 3) { + this.domainFileMaps.add(new DomainFileMap(split[2], path, split[1], split[0])); + } + } } } - } - public List getDomainFileMaps() { + public Collection getDomainFileMaps() { return Collections.synchronizedList(domainFileMaps); } - } \ No newline at end of file diff --git a/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/translation/parser/DomainMappingsTest.java b/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/translation/parser/DomainMappingsTest.java index 08000c9d6..b72c86d29 100644 --- a/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/translation/parser/DomainMappingsTest.java +++ b/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/translation/parser/DomainMappingsTest.java @@ -8,28 +8,37 @@ import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; -import java.util.List; - +import java.util.Collection; +/** + * @author Daniel Espendiller + */ public class DomainMappingsTest extends Assert { - @Test public void testParser() throws FileNotFoundException { File testFile = new File("src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/translation/parser/appDevDebugProjectContainer.xml"); - DomainMappings bla = new DomainMappings(); - bla.parser(new FileInputStream(testFile)); - List map = bla.getDomainFileMaps(); + DomainMappings domainMappings = new DomainMappings(); + domainMappings.parser(new FileInputStream(testFile)); + Collection domainFileMaps = domainMappings.getDomainFileMaps(); - assertEquals(10, map.size()); + assertEquals(14, domainFileMaps.size()); - DomainFileMap firstDomain = map.iterator().next(); + DomainFileMap craueFormFlowBundle = domainFileMaps.stream().filter(domainFileMap -> domainFileMap.getDomain().equals("CraueFormFlowBundle")).findFirst().get(); - assertEquals("CraueFormFlowBundle", firstDomain.getDomain()); - assertEquals("de", firstDomain.getLanguageKey()); - assertEquals("yml", firstDomain.getLoader()); - assertTrue(firstDomain.getPath().endsWith("CraueFormFlowBundle.de.yml")); + assertEquals("CraueFormFlowBundle", craueFormFlowBundle.getDomain()); + assertEquals("de", craueFormFlowBundle.getLanguageKey()); + assertEquals("yml", craueFormFlowBundle.getLoader()); + assertTrue(craueFormFlowBundle.getPath().endsWith("CraueFormFlowBundle.de.yml")); - } + DomainFileMap foobarDomain1 = domainFileMaps.stream().filter(domainFileMap -> domainFileMap.getDomain().equals("foobar_domain1")).findFirst().get(); + assertEquals("foobar_domain1", foobarDomain1.getDomain()); + assertEquals("af", foobarDomain1.getLanguageKey()); + assertEquals("xlf", foobarDomain1.getLoader()); + assertTrue(foobarDomain1.getPath().endsWith("foobar_domain1.af.xlf")); + assertNotNull(domainFileMaps.stream().filter(domainFileMap -> domainFileMap.getDomain().equals("foobar_domain2")).findFirst().get()); + assertNotNull(domainFileMaps.stream().filter(domainFileMap -> domainFileMap.getDomain().equals("foobar_domain3")).findFirst().get()); + assertNotNull(domainFileMaps.stream().filter(domainFileMap -> domainFileMap.getDomain().equals("foobar_domain4")).findFirst().get()); + } } diff --git a/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/translation/parser/appDevDebugProjectContainer.xml b/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/translation/parser/appDevDebugProjectContainer.xml index 4e23e882a..914b9caf0 100644 --- a/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/translation/parser/appDevDebugProjectContainer.xml +++ b/src/test/java/fr/adrienbrault/idea/symfony2plugin/tests/translation/parser/appDevDebugProjectContainer.xml @@ -80,5 +80,57 @@ + + + + + en-GB + + + php + + + yaml + yml + + + xlf + xliff + + + + /app/var/cache/dev/translations + true + + + /app/vendor/symfony/validator/Resources/translations/foobar_domain1.af.xlf + + + /app/vendor/symfony/validator/Resources/translations/foobar_domain2.ar.xlf + /app/vendor/symfony/security-core/Resources/translations/foobar_domain3.ar.xlf + + + /home/daniel/projects/symfony5/vendor/symfony/security-core/Resources/translations/foobar_domain4.pt_PT.xlf + + + + /app/vendor/symfony/validator/Resources/translations + + + + vendor/symfony/validator/Resources/translations + + + + + + + + + en_GB + en + + +