From 7f5f27dd760acb2daee34256808f874ca0da8fa9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Herv=C3=A9=20Bitteur?= <herve.bitteur@audiveris.org>
Date: Wed, 15 Jan 2025 12:31:29 +0100
Subject: [PATCH] Warning issued for batch mode without OCR languages installed

---
 app/src/main/java/org/audiveris/omr/Main.java |  4 ++
 .../omr/text/tesseract/Languages.java         | 44 ++++++++++---------
 .../tesseract/resources/Languages.properties  |  2 +-
 .../resources/Languages_fr.properties         |  2 +-
 4 files changed, 30 insertions(+), 22 deletions(-)

diff --git a/app/src/main/java/org/audiveris/omr/Main.java b/app/src/main/java/org/audiveris/omr/Main.java
index acb808f91..c13d005cc 100644
--- a/app/src/main/java/org/audiveris/omr/Main.java
+++ b/app/src/main/java/org/audiveris/omr/Main.java
@@ -28,6 +28,7 @@
 import org.audiveris.omr.constant.ConstantSet;
 import org.audiveris.omr.log.LogUtil;
 import org.audiveris.omr.sheet.BookManager;
+import org.audiveris.omr.text.tesseract.Languages;
 import org.audiveris.omr.text.tesseract.TesseractOCR;
 import org.audiveris.omr.ui.MainGui;
 import org.audiveris.omr.ui.symbol.MusicFont;
@@ -249,6 +250,9 @@ public static void main (String[] args)
             // Fix for issue #562: Disable this check when running in batch mode.
             ///Versions.considerPolling();
 
+            // Check OCR languages
+            Languages.getInstance().checkSupport();
+
             // Check MusicFont is loaded
             MusicFont.checkMusicFont();
 
diff --git a/app/src/main/java/org/audiveris/omr/text/tesseract/Languages.java b/app/src/main/java/org/audiveris/omr/text/tesseract/Languages.java
index eabd3d262..b0c603621 100644
--- a/app/src/main/java/org/audiveris/omr/text/tesseract/Languages.java
+++ b/app/src/main/java/org/audiveris/omr/text/tesseract/Languages.java
@@ -95,7 +95,7 @@ public class Languages
     //~ Instance fields ----------------------------------------------------------------------------
 
     /** Component resources. */
-    private final ResourceMap resources;
+    private ResourceMap resources;
 
     /** Remote data (languages, codes). */
     private RemoteData remoteData;
@@ -103,16 +103,6 @@ public class Languages
     /** The user interface to browse, select and install languages. */
     private Selector selector;
 
-    //~ Constructors -------------------------------------------------------------------------------
-
-    /**
-     * Creates a new <code>Languages</code> object.
-     */
-    public Languages ()
-    {
-        resources = Application.getInstance().getContext().getResourceMap(getClass());
-    }
-
     //~ Methods ------------------------------------------------------------------------------------
 
     //---------------//
@@ -148,17 +138,19 @@ public void checkSupport ()
             logger.info(
                     "Installed OCR languages: {}",
                     installed.stream().collect(Collectors.joining(",")));
+        } else if (OMR.gui == null) {
+            logger.warn("*** No installed OCR languages ***");
         } else {
             // Prompt user
-            final String install = resources.getString("Check.install");
-            final String later = resources.getString("Check.later");
+            final String install = getResources().getString("Check.install");
+            final String later = getResources().getString("Check.later");
             final Object[] options = { install, later };
-            final String message = resources.getString("Check.message");
+            final String message = getResources().getString("Check.message");
 
             final int choice = JOptionPane.showOptionDialog(
                     OMR.gui.getFrame(),
                     message,
-                    resources.getString("Check.title"),
+                    getResources().getString("Check.title"),
                     JOptionPane.DEFAULT_OPTION,
                     JOptionPane.WARNING_MESSAGE,
                     null,
@@ -237,6 +229,18 @@ private RemoteData getRemoteData ()
         return remoteData;
     }
 
+    //--------------//
+    // getResources //
+    //--------------//
+    private ResourceMap getResources ()
+    {
+        if (resources == null) {
+            resources = Application.getInstance().getContext().getResourceMap(getClass());
+        }
+
+        return resources;
+    }
+
     //-------------//
     // getSelector //
     //-------------//
@@ -281,7 +285,7 @@ private class DownloadRemoteTask
     {
         DownloadRemoteTask ()
         {
-            super(OmrGui.getApplication(), resources.getString("downloadTask.message"));
+            super(OmrGui.getApplication(), getResources().getString("downloadTask.message"));
         }
 
         @Override
@@ -363,7 +367,7 @@ public class Selector
     {
         private final JDialog dialog;
 
-        private final String boxTip = resources.getString("box.shortDescription");
+        private final String boxTip = getResources().getString("box.shortDescription");
 
         /**
          * Creates a new <code>Selector</code> object.
@@ -379,9 +383,9 @@ public Selector ()
 
             framePane.add(new JScrollPane(defineLayout()));
 
-            // Closing (via close button)
+            // Closing (via exit button)
             JButton button = new JButton();
-            button.setName("closeButton");
+            button.setName("exitButton");
             button.setAlignmentX(CENTER_ALIGNMENT);
             button.addActionListener(this);
             framePane.add(button);
@@ -396,7 +400,7 @@ public void windowClosing (WindowEvent e)
                 }
             });
 
-            resources.injectComponents(dialog);
+            getResources().injectComponents(dialog);
             dialog.pack();
         }
 
diff --git a/app/src/main/java/org/audiveris/omr/text/tesseract/resources/Languages.properties b/app/src/main/java/org/audiveris/omr/text/tesseract/resources/Languages.properties
index 78b545365..1a642aec4 100644
--- a/app/src/main/java/org/audiveris/omr/text/tesseract/resources/Languages.properties
+++ b/app/src/main/java/org/audiveris/omr/text/tesseract/resources/Languages.properties
@@ -17,7 +17,7 @@ LanguagesFrame.title = Installation of OCR languages
 downloadTask.message = Collecting languages from Tesseract site...
 box.shortDescription = Tick this box to install the language on-the-fly
 
-closeButton.text = Close
+exitButton.text = Exit
 
 Check.title     = OCR languages
 Check.message   = <html>Your collection of languages is empty!\
diff --git a/app/src/main/java/org/audiveris/omr/text/tesseract/resources/Languages_fr.properties b/app/src/main/java/org/audiveris/omr/text/tesseract/resources/Languages_fr.properties
index a3285fb55..1554e0bf8 100644
--- a/app/src/main/java/org/audiveris/omr/text/tesseract/resources/Languages_fr.properties
+++ b/app/src/main/java/org/audiveris/omr/text/tesseract/resources/Languages_fr.properties
@@ -17,7 +17,7 @@ LanguagesFrame.title = Installation de langues OCR
 downloadTask.message = Collecte des langues en cours
 box.shortDescription = Cochez cette case pour installer la langue \u00e0 la vol\u00e9e
 
-closeButton.text = Fermer
+exitButton.text = Exit
 
 Check.title     = Langues OCR
 Check.message   = <html>Votre collection de langues est vide !\