diff options
-rw-r--r-- | desktop/source/lib/init.cxx | 195 | ||||
-rw-r--r-- | include/unotools/lingucfg.hxx | 2 | ||||
-rw-r--r-- | lingucomponent/config/Linguistic-lingucomponent-grammarchecker.xcu | 30 | ||||
-rw-r--r-- | lingucomponent/source/spellcheck/languagetool/languagetoolimp.cxx | 59 | ||||
-rw-r--r-- | postprocess/CustomTarget_registry.mk | 1 | ||||
-rw-r--r-- | unotools/source/config/lingucfg.cxx | 21 |
6 files changed, 186 insertions, 122 deletions
diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx index 4f1b5287130f..dbd236858ce8 100644 --- a/desktop/source/lib/init.cxx +++ b/desktop/source/lib/init.cxx @@ -117,7 +117,6 @@ #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> @@ -228,8 +227,6 @@ using namespace vcl; using namespace desktop; using namespace utl; -using LanguageToolCfg = officecfg::Office::Linguistic::GrammarChecking::LanguageTool; - static LibLibreOffice_Impl *gImpl = nullptr; static bool lok_preinit_2_called = false; static std::weak_ptr< LibreOfficeKitClass > gOfficeClass; @@ -5620,6 +5617,132 @@ static void doc_setGraphicSelection(LibreOfficeKitDocument* pThis, int nType, in pDoc->setGraphicSelection(nType, nX, nY); } +static void getDocLanguages(LibreOfficeKitDocument* pThis, uno::Sequence<lang::Locale>& rSeq) +{ + SfxViewFrame* pViewFrame = SfxViewFrame::Current(); + if (!pViewFrame) + return; + + SfxDispatcher* pDispatcher = pViewFrame->GetBindings().GetDispatcher(); + if (!pDispatcher) + return; + + css::uno::Any aLangStatus; + pDispatcher->QueryState(SID_LANGUAGE_STATUS, aLangStatus); + + OUString sCurrent; + OUString sKeyboard; + OUString sGuessText; + SvtScriptType eScriptType = SvtScriptType::LATIN | SvtScriptType::ASIAN + | SvtScriptType::COMPLEX; + + Sequence<OUString> aSeqLang; + if (aLangStatus >>= aSeqLang) + { + if (aSeqLang.getLength() == 4) + { + sCurrent = aSeqLang[0]; + eScriptType = static_cast<SvtScriptType>(aSeqLang[1].toInt32()); + sKeyboard = aSeqLang[1]; + sGuessText = aSeqLang[2]; + } + } + else + { + aLangStatus >>= sCurrent; + } + + LanguageType nLangType; + std::set<LanguageType> aLangItems; + + if (!sCurrent.isEmpty()) + { + nLangType = SvtLanguageTable::GetLanguageType(sCurrent); + if (nLangType != LANGUAGE_DONTKNOW) + { + aLangItems.insert(nLangType); + } + } + + const AllSettings& rAllSettings = Application::GetSettings(); + nLangType = rAllSettings.GetLanguageTag().getLanguageType(); + if (nLangType != LANGUAGE_DONTKNOW && + (eScriptType & SvtLanguageOptions::GetScriptTypeOfLanguage(nLangType))) + { + aLangItems.insert(nLangType); + } + + nLangType = rAllSettings.GetUILanguageTag().getLanguageType(); + if (nLangType != LANGUAGE_DONTKNOW && + (eScriptType & SvtLanguageOptions::GetScriptTypeOfLanguage(nLangType))) + { + aLangItems.insert(nLangType); + } + + if (!sKeyboard.isEmpty()) + { + nLangType = SvtLanguageTable::GetLanguageType(sKeyboard); + if (nLangType != LANGUAGE_DONTKNOW && + (eScriptType & SvtLanguageOptions::GetScriptTypeOfLanguage(nLangType))) + { + aLangItems.insert(nLangType); + } + } + + if (!sGuessText.isEmpty()) + { + Reference<linguistic2::XLanguageGuessing> xLangGuesser; + try + { + xLangGuesser = linguistic2::LanguageGuessing::create(xContext); + } + catch(...) + { + } + + if (xLangGuesser.is()) + { + lang::Locale aLocale = xLangGuesser->guessPrimaryLanguage(sGuessText, 0, + sGuessText.getLength()); + LanguageTag aLanguageTag(aLocale); + nLangType = aLanguageTag.getLanguageType(false); + if (nLangType != LANGUAGE_DONTKNOW && + (eScriptType & SvtLanguageOptions::GetScriptTypeOfLanguage(nLangType))) + { + aLangItems.insert(nLangType); + } + } + } + + LibLODocument_Impl* pDocument = static_cast<LibLODocument_Impl*>(pThis); + Reference<document::XDocumentLanguages> xDocumentLanguages(pDocument->mxComponent, UNO_QUERY); + if (xDocumentLanguages.is()) + { + const Sequence<lang::Locale> aLocales(xDocumentLanguages->getDocumentLanguages( + static_cast<sal_Int16>(eScriptType), 64)); + + for (const lang::Locale& aLocale : aLocales) + { + nLangType = SvtLanguageTable::GetLanguageType(aLocale.Language); + if (nLangType != LANGUAGE_DONTKNOW && + (eScriptType & SvtLanguageOptions::GetScriptTypeOfLanguage(nLangType))) + { + aLangItems.insert(nLangType); + } + } + } + + int nLocale = 0; + Sequence<lang::Locale> aLocales(aLangItems.size()); + auto pLocales = aLocales.getArray(); + for (const LanguageType& itLang : aLangItems) + { + pLocales[nLocale++] = LanguageTag::convertToLocale(itLang); + } + + rSeq = aLocales; +} + static void doc_resetSelection(LibreOfficeKitDocument* pThis) { comphelper::ProfileZone aZone("doc_resetSelection"); @@ -5637,28 +5760,12 @@ 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(const char* pCommand) +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()) { @@ -5667,24 +5774,33 @@ static char* getLanguages(const char* pCommand) aLocales = xSpell->getLocales(); } - // LanguageTool - if (LanguageToolCfg::IsEnabled::get()) + /* 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 */ + if (!aLocales.hasElements()) { - 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(); + uno::Sequence< css::lang::Locale > aSeq; + getDocLanguages(pThis, aSeq); + aLocales = aSeq; } } boost::property_tree::ptree aTree; aTree.put("commandName", pCommand); boost::property_tree::ptree aValues; - 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); + 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)); + } aTree.add_child("commandValues", aValues); std::stringstream aStream; boost::property_tree::write_json(aStream, aTree); @@ -6023,7 +6139,7 @@ static char* doc_getCommandValues(LibreOfficeKitDocument* pThis, const char* pCo if (!strcmp(pCommand, ".uno:LanguageStatus")) { - return getLanguages(pCommand); + return getLanguages(pThis, pCommand); } else if (!strcmp(pCommand, ".uno:CharFontName")) { @@ -7160,8 +7276,6 @@ static void preLoadShortCutAccelerators() batch->commit(); } -void setLanguageToolConfig(); - /// Used only by LibreOfficeKit when used by Online to pre-initialize static void preloadData() { @@ -7180,9 +7294,6 @@ 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()); @@ -7402,19 +7513,11 @@ 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++) { - // turn off spell checker if LanguageTool supports the locale already - if (xSuppLoc->hasLocale(aLocales[itLocale])) - xLangSrv->setConfiguredServices(cSpell, aLocales[itLocale], aEmpty); + xLangSrv->setConfiguredServices(SN_SPELLCHECKER, aLocales[itLocale], aEmpty); } } } diff --git a/include/unotools/lingucfg.hxx b/include/unotools/lingucfg.hxx index c924d7898764..40797a372f33 100644 --- a/include/unotools/lingucfg.hxx +++ b/include/unotools/lingucfg.hxx @@ -196,8 +196,6 @@ 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 deleted file mode 100644 index 6fa455d969b8..000000000000 --- a/lingucomponent/config/Linguistic-lingucomponent-grammarchecker.xcu +++ /dev/null @@ -1,30 +0,0 @@ -<?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-GB en-NZ en-ZA en-US fr gl-ES de de-AT 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 fb115f582f30..7152a6ff0880 100644 --- a/lingucomponent/source/spellcheck/languagetool/languagetoolimp.cxx +++ b/lingucomponent/source/spellcheck/languagetool/languagetoolimp.cxx @@ -56,8 +56,6 @@ using namespace com::sun::star::beans; using namespace com::sun::star::lang; using namespace com::sun::star::linguistic2; -constexpr OUStringLiteral sDuden = u"duden"; - namespace { constexpr size_t MAX_SUGGESTIONS_SIZE = 10; @@ -297,6 +295,14 @@ void parseProofreadingJSONResponse(ProofreadingResult& rResult, std::string&& aJ }); } +OUString getLocaleListURL() +{ + if (auto oURL = LanguageToolCfg::BaseURL::get()) + if (!oURL->isEmpty()) + return *oURL + "/languages"; + return {}; +} + OUString getCheckerURL() { if (auto oURL = LanguageToolCfg::BaseURL::get()) @@ -330,35 +336,44 @@ sal_Bool SAL_CALL LanguageToolGrammarChecker::hasLocale(const Locale& rLocale) uno::Sequence<Locale> SAL_CALL LanguageToolGrammarChecker::getLocales() { - osl::MutexGuard aGuard(linguistic::GetLinguMutex()); - if (m_aSuppLocales.hasElements()) return m_aSuppLocales; + if (!LanguageToolCfg::IsEnabled::get()) + { + return m_aSuppLocales; + } - SvtLinguConfig aLinguCfg; - uno::Sequence<OUString> aLocaleList; - - if (LanguageToolCfg::RestProtocol::get().value_or("") == sDuden) + OUString localeUrl = getLocaleListURL(); + if (localeUrl.isEmpty()) { - aLocaleList.realloc(3); - aLocaleList.getArray()[0] = "de-DE"; - aLocaleList.getArray()[1] = "en-US"; - aLocaleList.getArray()[2] = "en-GB"; + return m_aSuppLocales; } - else - aLinguCfg.GetLocaleListFor("GrammarCheckers", - "org.openoffice.lingu.LanguageToolGrammarChecker", aLocaleList); + 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); - auto nLength = aLocaleList.getLength(); - m_aSuppLocales.realloc(nLength); + size_t length = root.size(); + m_aSuppLocales.realloc(length); auto pArray = m_aSuppLocales.getArray(); - auto pLocaleList = aLocaleList.getArray(); - - for (auto i = 0; i < nLength; i++) + int i = 0; + for (auto it = root.begin(); it != root.end(); it++, i++) { - pArray[i] = LanguageTag::convertToLocale(pLocaleList[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; } - return m_aSuppLocales; } diff --git a/postprocess/CustomTarget_registry.mk b/postprocess/CustomTarget_registry.mk index 9e235f098b25..b0bc7a4320f2 100644 --- a/postprocess/CustomTarget_registry.mk +++ b/postprocess/CustomTarget_registry.mk @@ -116,7 +116,6 @@ 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 af1eaee4aa9d..0b39db9172ef 100644 --- a/unotools/source/config/lingucfg.cxx +++ b/unotools/source/config/lingucfg.cxx @@ -941,27 +941,6 @@ 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 ) |