desktop/source/lib/init.cxx                                        |   62 
+++++++---
 include/unotools/lingucfg.hxx                                      |    2 
 lingucomponent/config/Linguistic-lingucomponent-grammarchecker.xcu |   30 ++++
 lingucomponent/source/spellcheck/languagetool/languagetoolimp.cxx  |   47 
+++----
 postprocess/CustomTarget_registry.mk                               |    1 
 unotools/source/config/lingucfg.cxx                                |   21 +++
 6 files changed, 123 insertions(+), 40 deletions(-)

New commits:
commit e2bb227d0762a4200ce6f064f7b53911c6d16fdf
Author:     Szymon Kłos <szymon.k...@collabora.com>
AuthorDate: Wed Feb 8 11:10:58 2023 +0100
Commit:     Andras Timar <andras.ti...@collabora.com>
CommitDate: Wed Jul 5 09:12:22 2023 +0200

    lok: LanguageTool provides list of languages
    
    - it sends supported list to the LOK client
    - disables Spell Checker for locales supported by LanguageTool
    - duden protocol supports only german
    - initialize language tool config before usage to fetch correct
      list of supported languages
    
    Change-Id: Id9de8519303774163721def8661fa408da449348
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/146665
    Reviewed-by: Henry Castro <hcas...@collabora.com>
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/153960
    Reviewed-by: Andras Timar <andras.ti...@collabora.com>
    Tested-by: Andras Timar <andras.ti...@collabora.com>

diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx
index 5d957a9c89be..26b44a25b941 100644
--- a/desktop/source/lib/init.cxx
+++ b/desktop/source/lib/init.cxx
@@ -117,6 +117,7 @@
 #include <com/sun/star/linguistic2/LanguageGuessing.hpp>
 #include <com/sun/star/linguistic2/LinguServiceManager.hpp>
 #include <com/sun/star/linguistic2/XSpellChecker.hpp>
+#include <com/sun/star/linguistic2/XProofreader.hpp>
 #include <com/sun/star/i18n/LocaleCalendar2.hpp>
 #include <com/sun/star/i18n/ScriptType.hpp>
 #include <com/sun/star/lang/DisposedException.hpp>
@@ -5739,12 +5740,28 @@ static void doc_resetSelection(LibreOfficeKitDocument* 
pThis)
     pDoc->resetSelection();
 }
 
+static void addLocale(boost::property_tree::ptree& rValues, css::lang::Locale 
const & rLocale)
+{
+    boost::property_tree::ptree aChild;
+    OUString sLanguage;
+    const LanguageTag aLanguageTag( rLocale );
+    sLanguage = 
SvtLanguageTable::GetLanguageString(aLanguageTag.getLanguageType());
+    if (sLanguage.endsWith("}"))
+        return;
+
+    sLanguage += ";" + aLanguageTag.getBcp47(false);
+    aChild.put("", sLanguage.toUtf8());
+    rValues.push_back(std::make_pair("", aChild));
+}
+
 static char* getLanguages(LibreOfficeKitDocument* pThis, const char* pCommand)
 {
     css::uno::Sequence< css::lang::Locale > aLocales;
+    css::uno::Sequence< css::lang::Locale > aGrammarLocales;
 
     if (xContext.is())
     {
+        // SpellChecker
         css::uno::Reference<css::linguistic2::XLinguServiceManager2> xLangSrv 
= css::linguistic2::LinguServiceManager::create(xContext);
         if (xLangSrv.is())
         {
@@ -5753,6 +5770,19 @@ static char* getLanguages(LibreOfficeKitDocument* pThis, 
const char* pCommand)
                 aLocales = xSpell->getLocales();
         }
 
+        // LanguageTool
+        SvxLanguageToolOptions& rLanguageOpts = SvxLanguageToolOptions::Get();
+        if (rLanguageOpts.getEnabled())
+        {
+            uno::Reference< linguistic2::XProofreader > xGC(
+                    
xContext->getServiceManager()->createInstanceWithContext("org.openoffice.lingu.LanguageToolGrammarChecker",
 xContext),
+                    uno::UNO_QUERY_THROW );
+            uno::Reference< linguistic2::XSupportedLocales > xSuppLoc( xGC, 
uno::UNO_QUERY_THROW );
+            aGrammarLocales = xSuppLoc->getLocales();
+        }
+
+        // Fallback
+
         /* FIXME: To obtain the document languages the spell checker can be 
disabled,
            so a future re-work of the getLanguages function is needed in favor 
to use
            getDocLanguages */
@@ -5767,19 +5797,10 @@ static char* getLanguages(LibreOfficeKitDocument* 
pThis, const char* pCommand)
     boost::property_tree::ptree aTree;
     aTree.put("commandName", pCommand);
     boost::property_tree::ptree aValues;
-    boost::property_tree::ptree aChild;
-    OUString sLanguage;
-    for ( css::lang::Locale const & locale : std::as_const(aLocales) )
-    {
-        const LanguageTag aLanguageTag( locale );
-        sLanguage = 
SvtLanguageTable::GetLanguageString(aLanguageTag.getLanguageType());
-        if (sLanguage.startsWith("{") && sLanguage.endsWith("}"))
-            continue;
-
-        sLanguage += ";" + aLanguageTag.getBcp47(false);
-        aChild.put("", sLanguage.toUtf8());
-        aValues.push_back(std::make_pair("", aChild));
-    }
+    for ( css::lang::Locale const & rLocale : std::as_const(aLocales) )
+        addLocale(aValues, rLocale);
+    for ( css::lang::Locale const & rLocale : std::as_const(aGrammarLocales) )
+        addLocale(aValues, rLocale);
     aTree.add_child("commandValues", aValues);
     std::stringstream aStream;
     boost::property_tree::write_json(aStream, aTree);
@@ -7243,6 +7264,8 @@ static void preLoadShortCutAccelerators()
     batch->commit();
 }
 
+void setLanguageToolConfig();
+
 /// Used only by LibreOfficeKit when used by Online to pre-initialize
 static void preloadData()
 {
@@ -7261,6 +7284,9 @@ static void preloadData()
     if(bAbort)
         std::cerr << "CheckExtensionDependencies failed" << std::endl;
 
+    // setup LanguageTool config before spell checking init
+    setLanguageToolConfig();
+
     // preload all available dictionaries
     css::uno::Reference<css::linguistic2::XLinguServiceManager> xLngSvcMgr =
         
css::linguistic2::LinguServiceManager::create(comphelper::getProcessComponentContext());
@@ -7489,11 +7515,19 @@ void setLanguageToolConfig()
                 if (xSpell.is())
                 {
                     Sequence<OUString> aEmpty;
+                    static constexpr OUStringLiteral cSpell(SN_SPELLCHECKER);
                     Sequence<css::lang::Locale> aLocales = 
xSpell->getLocales();
 
+                    uno::Reference<linguistic2::XProofreader> xGC(
+                        
xContext->getServiceManager()->createInstanceWithContext("org.openoffice.lingu.LanguageToolGrammarChecker",
 xContext),
+                        uno::UNO_QUERY_THROW);
+                    uno::Reference<linguistic2::XSupportedLocales> 
xSuppLoc(xGC, uno::UNO_QUERY_THROW);
+
                     for (int itLocale = 0; itLocale < aLocales.getLength(); 
itLocale++)
                     {
-                        xLangSrv->setConfiguredServices(SN_SPELLCHECKER, 
aLocales[itLocale], aEmpty);
+                        // turn off spell checker if LanguageTool supports the 
locale already
+                        if (xSuppLoc->hasLocale(aLocales[itLocale]))
+                            xLangSrv->setConfiguredServices(cSpell, 
aLocales[itLocale], aEmpty);
                     }
                 }
             }
diff --git a/lingucomponent/source/spellcheck/languagetool/languagetoolimp.cxx 
b/lingucomponent/source/spellcheck/languagetool/languagetoolimp.cxx
index f7fe29edecca..1537e036f035 100644
--- a/lingucomponent/source/spellcheck/languagetool/languagetoolimp.cxx
+++ b/lingucomponent/source/spellcheck/languagetool/languagetoolimp.cxx
@@ -130,8 +130,18 @@ Sequence<Locale> SAL_CALL 
LanguageToolGrammarChecker::getLocales()
 
     SvtLinguConfig aLinguCfg;
     uno::Sequence<OUString> aLocaleList;
-    aLinguCfg.GetLocaleListFor("GrammarCheckers", 
"org.openoffice.lingu.LanguageToolGrammarChecker",
-                               aLocaleList);
+
+    SvxLanguageToolOptions& rLanguageOpts = SvxLanguageToolOptions::Get();
+    if (rLanguageOpts.getRestProtocol() == sDuden)
+    {
+        aLocaleList.realloc(3);
+        aLocaleList.getArray()[0] = "de-DE";
+        aLocaleList.getArray()[1] = "en-US";
+        aLocaleList.getArray()[2] = "en-GB";
+    }
+    else
+        aLinguCfg.GetLocaleListFor("GrammarCheckers",
+                                   
"org.openoffice.lingu.LanguageToolGrammarChecker", aLocaleList);
 
     auto nLength = aLocaleList.getLength();
     m_aSuppLocales.realloc(nLength);
commit 84bdf9e81a63a8bd308709c86b51bf3900a23c50
Author:     Mert Tumer <mert.tu...@collabora.com>
AuthorDate: Tue May 10 13:06:06 2022 +0300
Commit:     Andras Timar <andras.ti...@collabora.com>
CommitDate: Wed Jul 5 09:12:12 2023 +0200

    Load the locales from config file for languagetool
    
    Locales needs to be read again
    in the Preferences/Writing Aids section and since
    this is a network operation it can cause a problem.
    Better to list all the supported locales in the xcu
    and load it right away.
    
    Signed-off-by: Mert Tumer <mert.tu...@collabora.com>
    Change-Id: Ifff624334627f7be259b677f9b416d6ddedfb2c7
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/135598
    Tested-by: Jenkins
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/153959
    Reviewed-by: Andras Timar <andras.ti...@collabora.com>
    Tested-by: Andras Timar <andras.ti...@collabora.com>

diff --git a/include/unotools/lingucfg.hxx b/include/unotools/lingucfg.hxx
index b4a0b824e127..9117799c2f3a 100644
--- a/include/unotools/lingucfg.hxx
+++ b/include/unotools/lingucfg.hxx
@@ -192,6 +192,8 @@ public:
 
     bool GetDictionaryEntry( const OUString &rNodeName, 
SvtLinguConfigDictionaryEntry &rDicEntry ) const;
 
+    bool GetLocaleListFor( const OUString &rSetName, const OUString 
&rSetEntry, css::uno::Sequence< OUString > &rLocaleList ) const;
+
     css::uno::Sequence< OUString > GetDisabledDictionaries() const;
 
     std::vector< SvtLinguConfigDictionaryEntry > 
GetActiveDictionariesByFormat( std::u16string_view rFormatName ) const;
diff --git a/lingucomponent/config/Linguistic-lingucomponent-grammarchecker.xcu 
b/lingucomponent/config/Linguistic-lingucomponent-grammarchecker.xcu
new file mode 100644
index 000000000000..ce3d6033d0c2
--- /dev/null
+++ b/lingucomponent/config/Linguistic-lingucomponent-grammarchecker.xcu
@@ -0,0 +1,30 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!--
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ *   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 .
+-->
+<oor:component-data oor:name="Linguistic" oor:package="org.openoffice.Office" 
xmlns:install="http://openoffice.org/2004/installation"; 
xmlns:oor="http://openoffice.org/2001/registry"; 
xmlns:xs="http://www.w3.org/2001/XMLSchema"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";>
+    <node oor:name="ServiceManager">
+        <node oor:name="GrammarCheckers">
+            <node oor:name="org.openoffice.lingu.LanguageToolGrammarChecker" 
oor:op="fuse">
+                <prop oor:name="Locales" oor:type="oor:string-list">
+                    <value>ar ast-ES be-BY br-FR ca-ES ca-ES-valencia zh-CN 
da-DK nl nl-BE en en-AU en-CA en-CA en-GB en-NZ en-ZA en-US fr gl-ES de de-AT 
de-DE de-DE de-CH el-GR ga-IE it ja-JP km-KH nb no fa pl-PL pt pt-AO pt-BR 
pt-MZ pt-PT ro-RO ru-RU de-DE-x-simple-language sk-SK sl-SI es es-AR sv tl-PH 
ta-IN uk-UA</value>
+                </prop>
+            </node>
+        </node>
+    </node>
+</oor:component-data>
+
diff --git a/lingucomponent/source/spellcheck/languagetool/languagetoolimp.cxx 
b/lingucomponent/source/spellcheck/languagetool/languagetoolimp.cxx
index 83ae5aada9ad..f7fe29edecca 100644
--- a/lingucomponent/source/spellcheck/languagetool/languagetoolimp.cxx
+++ b/lingucomponent/source/spellcheck/languagetool/languagetoolimp.cxx
@@ -35,7 +35,6 @@
 #include <boost/property_tree/json_parser.hpp>
 #include <algorithm>
 #include <string_view>
-#include <sal/log.hxx>
 #include <svtools/languagetoolcfg.hxx>
 #include <tools/color.hxx>
 #include <tools/long.hxx>
@@ -124,40 +123,26 @@ sal_Bool SAL_CALL 
LanguageToolGrammarChecker::hasLocale(const Locale& rLocale)
 
 Sequence<Locale> SAL_CALL LanguageToolGrammarChecker::getLocales()
 {
+    MutexGuard aGuard(GetLinguMutex());
+
     if (m_aSuppLocales.hasElements())
         return m_aSuppLocales;
-    SvxLanguageToolOptions& rLanguageOpts = SvxLanguageToolOptions::Get();
-    OString localeUrl = OUStringToOString(rLanguageOpts.getLocaleListURL(), 
RTL_TEXTENCODING_UTF8);
-    if (localeUrl.isEmpty())
-    {
-        return m_aSuppLocales;
-    }
-    tools::Long statusCode = 0;
-    std::string response = makeHttpRequest(localeUrl, HTTP_METHOD::HTTP_GET, 
OString(), statusCode);
-    if (statusCode != 200)
-    {
-        return m_aSuppLocales;
-    }
-    if (response.empty())
-    {
-        return m_aSuppLocales;
-    }
-    boost::property_tree::ptree root;
-    std::stringstream aStream(response);
-    boost::property_tree::read_json(aStream, root);
 
-    size_t length = root.size();
-    m_aSuppLocales.realloc(length);
+    SvtLinguConfig aLinguCfg;
+    uno::Sequence<OUString> aLocaleList;
+    aLinguCfg.GetLocaleListFor("GrammarCheckers", 
"org.openoffice.lingu.LanguageToolGrammarChecker",
+                               aLocaleList);
+
+    auto nLength = aLocaleList.getLength();
+    m_aSuppLocales.realloc(nLength);
     auto pArray = m_aSuppLocales.getArray();
-    int i = 0;
-    for (auto it = root.begin(); it != root.end(); it++, i++)
+    auto pLocaleList = aLocaleList.getArray();
+
+    for (auto i = 0; i < nLength; i++)
     {
-        boost::property_tree::ptree& localeItem = it->second;
-        const std::string longCode = localeItem.get<std::string>("longCode");
-        Locale aLocale = LanguageTag::convertToLocale(
-            OUString(longCode.c_str(), longCode.length(), 
RTL_TEXTENCODING_UTF8));
-        pArray[i] = aLocale;
+        pArray[i] = LanguageTag::convertToLocale(pLocaleList[i]);
     }
+
     return m_aSuppLocales;
 }
 
diff --git a/postprocess/CustomTarget_registry.mk 
b/postprocess/CustomTarget_registry.mk
index 549d1330bfa3..ac68a84b068f 100644
--- a/postprocess/CustomTarget_registry.mk
+++ b/postprocess/CustomTarget_registry.mk
@@ -116,6 +116,7 @@ postprocess_DEPS_lingucomponent := main
 postprocess_FILES_lingucomponent := \
        
$(SRCDIR)/lingucomponent/config/Linguistic-lingucomponent-hyphenator.xcu \
        
$(SRCDIR)/lingucomponent/config/Linguistic-lingucomponent-spellchecker.xcu \
+       
$(SRCDIR)/lingucomponent/config/Linguistic-lingucomponent-grammarchecker.xcu \
        $(SRCDIR)/lingucomponent/config/Linguistic-lingucomponent-thesaurus.xcu 
\
 
 postprocess_FILES_main := \
diff --git a/unotools/source/config/lingucfg.cxx 
b/unotools/source/config/lingucfg.cxx
index 03969c3d1ffe..a0ed2ef6220c 100644
--- a/unotools/source/config/lingucfg.cxx
+++ b/unotools/source/config/lingucfg.cxx
@@ -922,6 +922,27 @@ bool SvtLinguConfig::GetSupportedDictionaryFormatsFor(
     return bSuccess;
 }
 
+bool SvtLinguConfig::GetLocaleListFor( const OUString &rSetName, const 
OUString &rSetEntry, css::uno::Sequence< OUString > &rLocaleList ) const
+{
+    if (rSetName.isEmpty() || rSetEntry.isEmpty())
+        return false;
+    bool bSuccess = false;
+    try
+    {
+        uno::Reference< container::XNameAccess > xNA( GetMainUpdateAccess(), 
uno::UNO_QUERY_THROW );
+        xNA.set( xNA->getByName("ServiceManager"), uno::UNO_QUERY_THROW );
+        xNA.set( xNA->getByName( rSetName ), uno::UNO_QUERY_THROW );
+        xNA.set( xNA->getByName( rSetEntry ), uno::UNO_QUERY_THROW );
+        if (xNA->getByName( "Locales" ) >>= rLocaleList)
+            bSuccess = true;
+        DBG_ASSERT( rLocaleList.hasElements(), "Locale list is empty" );
+    }
+    catch (uno::Exception &)
+    {
+    }
+    return bSuccess;
+}
+
 static bool lcl_GetFileUrlFromOrigin(
     OUString /*out*/ &rFileUrl,
     const OUString &rOrigin )

Reply via email to