24#include <osl/file.hxx>
35#include <com/sun/star/lang/IllegalArgumentException.hpp>
36#include <com/sun/star/lang/XServiceInfo.hpp>
37#include <com/sun/star/linguistic2/XLanguageGuessing.hpp>
39#include <osl/thread.h>
43#ifdef SYSTEM_LIBEXTTEXTCAT
44#include <libexttextcat/textcat.h>
50using namespace ::
cppu;
65 public ::cppu::WeakImplHelper<
72 virtual ~LangGuess_Impl()
override {}
73 void EnsureInitialized();
77 LangGuess_Impl(
const LangGuess_Impl&) =
delete;
78 LangGuess_Impl& operator=(
const LangGuess_Impl&) =
delete;
86 virtual css::lang::Locale SAL_CALL guessPrimaryLanguage(
const OUString& aText, ::sal_Int32 nStartPos, ::sal_Int32 nLen )
override;
87 virtual void SAL_CALL disableLanguages(
const css::uno::Sequence< css::lang::Locale >& aLanguages )
override;
88 virtual void SAL_CALL enableLanguages(
const css::uno::Sequence< css::lang::Locale >& aLanguages )
override;
89 virtual css::uno::Sequence< css::lang::Locale > SAL_CALL getAvailableLanguages( )
override;
90 virtual css::uno::Sequence< css::lang::Locale > SAL_CALL getEnabledLanguages( )
override;
91 virtual css::uno::Sequence< css::lang::Locale > SAL_CALL getDisabledLanguages( )
override;
95 void SetFingerPrintsDB( std::u16string_view fileName );
100LangGuess_Impl::LangGuess_Impl() :
101 m_bInitialized( false )
105void LangGuess_Impl::EnsureInitialized()
112 m_bInitialized =
true;
117 osl::FileBase::getSystemPathFromFileURL( aURL, aPhysPath );
124 SetFingerPrintsDB( aPhysPath );
126#if !defined(EXTTEXTCAT_VERSION_MAJOR)
132 const char *pCountry;
134 LangCountry aDisable[] =
138 {
"sco",
""}, {
"zh",
"CN"}, {
"zh",
"TW"}, {
"ja",
""}, {
"ko",
""},
139 {
"ka",
""}, {
"hi",
""}, {
"mr",
""}, {
"ne",
""}, {
"sa",
""},
140 {
"ta",
""}, {
"th",
""}, {
"qu",
""}, {
"yi",
""}
143 Sequence< Locale > aDisableSeq( nNum );
144 Locale *pDisableSeq = aDisableSeq.getArray();
145 for (sal_Int32 i = 0;
i < nNum; ++
i)
148 aLocale.Language = OUString::createFromAscii( aDisable[i].pLang );
149 aLocale.Country = OUString::createFromAscii( aDisable[i].pCountry );
150 pDisableSeq[
i] = aLocale;
152 disableLanguages( aDisableSeq );
157Locale SAL_CALL LangGuess_Impl::guessPrimaryLanguage(
158 const OUString& rText,
159 ::sal_Int32 nStartPos,
166 if (nStartPos < 0 || nLen < 0 || nStartPos + nLen > rText.getLength())
167 throw lang::IllegalArgumentException();
169 OString o(
OUStringToOString( rText.subView(nStartPos, nLen), RTL_TEXTENCODING_UTF8 ) );
170 Guess g = m_aGuesser.GuessPrimaryLanguage(o.getStr());
172 aRes.Language = OUString::createFromAscii( g.
GetLanguage() );
173 aRes.Country = OUString::createFromAscii( g.
GetCountry() );
177#define DEFAULT_CONF_FILE_NAME "fpdb.conf"
179void LangGuess_Impl::SetFingerPrintsDB(
180 std::u16string_view filePath )
186 m_aGuesser.SetDBPath(conf_file_path.getStr(), path.getStr());
189uno::Sequence< Locale > SAL_CALL LangGuess_Impl::getAvailableLanguages( )
195 Sequence< css::lang::Locale > aRes;
196 std::vector<Guess> gs = m_aGuesser.GetAllManagedLanguages();
197 aRes.realloc(gs.size());
199 css::lang::Locale *pRes = aRes.getArray();
201 for(
size_t i = 0;
i < gs.size() ;
i++ ){
202 css::lang::Locale current_aRes;
203 current_aRes.Language = OUString::createFromAscii( gs[i].
GetLanguage() );
204 current_aRes.Country = OUString::createFromAscii( gs[i].GetCountry() );
205 pRes[
i] = current_aRes;
211uno::Sequence< Locale > SAL_CALL LangGuess_Impl::getEnabledLanguages( )
217 Sequence< css::lang::Locale > aRes;
218 std::vector<Guess> gs = m_aGuesser.GetAvailableLanguages();
219 aRes.realloc(gs.size());
221 css::lang::Locale *pRes = aRes.getArray();
223 for(
size_t i = 0;
i < gs.size() ;
i++ ){
224 css::lang::Locale current_aRes;
225 current_aRes.Language = OUString::createFromAscii( gs[i].
GetLanguage() );
226 current_aRes.Country = OUString::createFromAscii( gs[i].GetCountry() );
227 pRes[
i] = current_aRes;
233uno::Sequence< Locale > SAL_CALL LangGuess_Impl::getDisabledLanguages( )
239 Sequence< css::lang::Locale > aRes;
240 std::vector<Guess> gs = m_aGuesser.GetUnavailableLanguages();
241 aRes.realloc(gs.size());
243 css::lang::Locale *pRes = aRes.getArray();
245 for(
size_t i = 0;
i < gs.size() ;
i++ ){
246 css::lang::Locale current_aRes;
247 current_aRes.Language = OUString::createFromAscii( gs[i].
GetLanguage() );
248 current_aRes.Country = OUString::createFromAscii( gs[i].GetCountry() );
249 pRes[
i] = current_aRes;
255void SAL_CALL LangGuess_Impl::disableLanguages(
256 const uno::Sequence< Locale >& rLanguages )
262 for (
const Locale& rLanguage : rLanguages)
264 std::string language;
269 language += l.getStr();
271 language += c.getStr();
272 m_aGuesser.DisableLanguage(language);
276void SAL_CALL LangGuess_Impl::enableLanguages(
277 const uno::Sequence< Locale >& rLanguages )
283 for (
const Locale& rLanguage : rLanguages)
285 std::string language;
290 language += l.getStr();
292 language += c.getStr();
293 m_aGuesser.EnableLanguage(language);
297OUString SAL_CALL LangGuess_Impl::getImplementationName( )
299 return "com.sun.star.lingu2.LanguageGuessing";
302sal_Bool SAL_CALL LangGuess_Impl::supportsService(
const OUString& ServiceName )
307Sequence<OUString> SAL_CALL LangGuess_Impl::getSupportedServiceNames( )
309 return {
"com.sun.star.linguistic2.LanguageGuessing" };
312extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
314 css::uno::XComponentContext* , css::uno::Sequence<css::uno::Any>
const&)
316 return cppu::acquire(
new LangGuess_Impl());
const std::string & GetCountry() const
const std::string & GetLanguage() const
#define DBG_ASSERT(sCon, aError)
#define DEFAULT_CONF_FILE_NAME
SAL_DLLPUBLIC_EXPORT css::uno::XInterface * lingucomponent_LangGuess_get_implementation(css::uno::XComponentContext *, css::uno::Sequence< css::uno::Any > const &)
static std::mutex & GetLangGuessMutex()
#define SAL_N_ELEMENTS(arr)
LanguageType GetLanguage(SfxItemSet const &aSet, sal_uInt16 nLangWhichId)
double getLength(const B2DPolygon &rCandidate)
css::uno::Sequence< OUString > getSupportedServiceNames()
OUString getImplementationName()
bool CPPUHELPER_DLLPUBLIC supportsService(css::lang::XServiceInfo *implementation, rtl::OUString const &name)
OString OUStringToOString(std::u16string_view str, ConnectionSettings const *settings)