FOP-3207: Add warning when different pdf languages are used
diff --git a/fop-core/src/main/java/org/apache/fop/pdf/PDFFactory.java b/fop-core/src/main/java/org/apache/fop/pdf/PDFFactory.java
index 40370f7..12a6c3e 100644
--- a/fop-core/src/main/java/org/apache/fop/pdf/PDFFactory.java
+++ b/fop-core/src/main/java/org/apache/fop/pdf/PDFFactory.java
@@ -1707,4 +1707,8 @@
     public void setEventBroadcaster(EventBroadcaster eventBroadcaster) {
         this.eventBroadcaster = eventBroadcaster;
     }
+
+    public EventBroadcaster getEventBroadcaster() {
+        return eventBroadcaster;
+    }
 }
diff --git a/fop-core/src/main/java/org/apache/fop/pdf/PDFRoot.java b/fop-core/src/main/java/org/apache/fop/pdf/PDFRoot.java
index b230ad8..7b60384 100644
--- a/fop-core/src/main/java/org/apache/fop/pdf/PDFRoot.java
+++ b/fop-core/src/main/java/org/apache/fop/pdf/PDFRoot.java
@@ -23,6 +23,7 @@
 import java.io.OutputStream;
 import java.util.Locale;
 
+import org.apache.fop.render.pdf.PDFEventProducer;
 import org.apache.fop.util.LanguageTags;
 
 /**
@@ -287,6 +288,11 @@
     }
 
     private void setLanguage(String lang) {
+        Object oldLang = get("Lang");
+        if (oldLang != null && !"x-unknown".equals(oldLang) && !lang.equals(oldLang)) {
+            PDFEventProducer eventProducer = PDFEventProducer.Provider.get(document.getFactory().getEventBroadcaster());
+            eventProducer.languageChanged(this, oldLang, lang);
+        }
         put("Lang", lang);
     }
 
diff --git a/fop-core/src/main/java/org/apache/fop/render/pdf/PDFEventProducer.java b/fop-core/src/main/java/org/apache/fop/render/pdf/PDFEventProducer.java
index 24d0eb0..b78b472 100644
--- a/fop-core/src/main/java/org/apache/fop/render/pdf/PDFEventProducer.java
+++ b/fop-core/src/main/java/org/apache/fop/render/pdf/PDFEventProducer.java
@@ -90,4 +90,14 @@
      * @event.severity ERROR
      */
     void unpairedSurrogate(Object source);
+
+    /**
+     * The language was changed between pages
+     *
+     * @param source the event source
+     * @param oldLang current language
+     * @param newLang new language
+     * @event.severity WARN
+     */
+    void languageChanged(Object source, Object oldLang, String newLang);
 }
diff --git a/fop-core/src/main/resources/org/apache/fop/render/pdf/PDFEventProducer.xml b/fop-core/src/main/resources/org/apache/fop/render/pdf/PDFEventProducer.xml
index bc05182..d33d991 100644
--- a/fop-core/src/main/resources/org/apache/fop/render/pdf/PDFEventProducer.xml
+++ b/fop-core/src/main/resources/org/apache/fop/render/pdf/PDFEventProducer.xml
@@ -5,4 +5,5 @@
   <message key="incorrectEncryptionLength">Encryption length must be a multiple of 8 between 40 and 128. Setting encryption length to {correctedValue} instead of {originalValue}.</message>
   <message key="unknownLanguage">A piece of text or an image’s alternate text is missing language information [(See position {location})|(No context info available)]</message>
   <message key="unpairedSurrogate">A unicode char map was found to end with an unpaired surrogate.</message>
+  <message key="languageChanged">Input has xml:lang {oldLang} and {newLang}, PDF will only use {newLang}</message>
 </catalogue>
diff --git a/fop-core/src/test/java/org/apache/fop/pdf/PDFRootTestCase.java b/fop-core/src/test/java/org/apache/fop/pdf/PDFRootTestCase.java
index 67703c1..11470ab 100644
--- a/fop-core/src/test/java/org/apache/fop/pdf/PDFRootTestCase.java
+++ b/fop-core/src/test/java/org/apache/fop/pdf/PDFRootTestCase.java
@@ -1,42 +1,69 @@
-/*

- * Licensed to the Apache Software Foundation (ASF) under one or more

- * contributor license agreements.  See the NOTICE file distributed with

- * this work for additional information regarding copyright ownership.

- * The ASF licenses this file to You under the Apache License, Version 2.0

- * (the "License"); you may not use this file except in compliance with

- * the License.  You may obtain a copy of the License at

- *

- *      http://www.apache.org/licenses/LICENSE-2.0

- *

- * Unless required by applicable law or agreed to in writing, software

- * distributed under the License is distributed on an "AS IS" BASIS,

- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

- * See the License for the specific language governing permissions and

- * limitations under the License.

- */

-

-/* $Id: PDFFactoryTestCase.java 1823552 2018-02-08 12:26:33Z ssteiner $ */

-

-package org.apache.fop.pdf;

-

-import org.junit.Test;

-

-import static org.junit.Assert.assertEquals;

-

-public class PDFRootTestCase {

-

-    @Test

-    public void testAddAf() {

-        String germanAe = "\u00E4";

-        String unicodeFilename = "t" + germanAe + "st.pdf";

-        PDFFileSpec fileSpec = new PDFFileSpec(unicodeFilename);

-

-        String filename = fileSpec.getFilename();

-

-        PDFDocument doc = new PDFDocument("");

-        doc.getRoot().addAF(fileSpec);

-

-        assertEquals(filename, fileSpec.getFilename());

-        assertEquals(unicodeFilename, fileSpec.getUnicodeFilename());

-    }

-}

+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* $Id$ */
+package org.apache.fop.pdf;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+
+import org.junit.Assert;
+import org.junit.Test;
+import static org.junit.Assert.assertEquals;
+
+import org.apache.fop.apps.FOUserAgent;
+import org.apache.fop.apps.FopFactory;
+import org.apache.fop.events.Event;
+import org.apache.fop.events.EventListener;
+
+public class PDFRootTestCase {
+
+    @Test
+    public void testAddAf() {
+        String germanAe = "\u00E4";
+        String unicodeFilename = "t" + germanAe + "st.pdf";
+        PDFFileSpec fileSpec = new PDFFileSpec(unicodeFilename);
+
+        String filename = fileSpec.getFilename();
+
+        PDFDocument doc = new PDFDocument("");
+        doc.getRoot().addAF(fileSpec);
+
+        assertEquals(filename, fileSpec.getFilename());
+        assertEquals(unicodeFilename, fileSpec.getUnicodeFilename());
+    }
+
+    @Test
+    public void testLanguage() {
+        PDFDocument document = new PDFDocument("");
+        FOUserAgent ua = FopFactory.newInstance(new File(".").toURI()).newFOUserAgent();
+        final List<Event> events = new ArrayList<>();
+        ua.getEventBroadcaster().addEventListener(new EventListener() {
+            public void processEvent(Event event) {
+                events.add(event);
+            }
+        });
+        document.getFactory().setEventBroadcaster(ua.getEventBroadcaster());
+        PDFRoot root = new PDFRoot(document, new PDFPages(document));
+        root.setLanguage(Locale.US);
+        Assert.assertTrue(events.isEmpty());
+        root.setLanguage(Locale.UK);
+        assertEquals(events.get(0).getEventKey(), "languageChanged");
+    }
+}