/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * 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 .
*/
// We prefer (now) to use language tags. // Avoid feeding in the older LANG_REGION scheme to the BCP47 // ctor as that triggers use of liblangtag and initializes its // database which we do not want during startup. Convert // instead.
sChunk = sChunk.replace( '_', '-');
// There's a known exception to the rule, the dreaded // hu_HU_u8.dic of the myspell-hu package, see // http://packages.debian.org/search?arch=any&searchon=contents&keywords=hu_HU_u8.dic // This was ignored because unknown in the old implementation, // truncate to the known locale and either insert because hu_HU // wasn't encountered yet, or skip because it was. It doesn't // really matter because the proper new-style hu_HU dictionary // will take precedence anyway if installed with a Hungarian // languagepack. Again, this is only to not pull in all // liblangtag and stuff during startup, the result would be // !isValidBcp47() and the dictionary ignored. if (sChunk == "hu-HU-u8")
sChunk = "hu-HU";
LanguageTag aLangTag(sChunk, true); if (!aLangTag.isValidBcp47()) continue;
// Thus we first get the language of the dictionary const OUString& aLocaleName(aLangTag.getBcp47());
// build list of old style dictionaries (not as extensions) to use. // User installed dictionaries (the ones residing in the user paths) // will get precedence over system installed ones for the same language.
std::vector< SvtLinguConfigDictionaryEntry > GetOldStyleDics( constchar *pDicType )
{
std::vector< SvtLinguConfigDictionaryEntry > aRes;
if (aFormatName.isEmpty() || aDicExtension.isEmpty()) return aRes;
#ifdefined SYSTEM_DICTS || defined IOS // set of languages to remember the language where it is already // decided to make use of the dictionary.
std::set< OUString > aDicLangInUse;
#ifndef IOS // follow the hunspell tool's example and check DICPATH for preferred dictionaries
rtl_uString * pSearchPath = nullptr;
osl_getEnvironment(u"DICPATH"_ustr.pData, &pSearchPath);
if (pSearchPath)
{
OUString aSearchPath(pSearchPath);
rtl_uString_release(pSearchPath);
if (!utl::Bootstrap::getProcessWorkingDir(aCWD)) continue; if (osl::FileBase::getFileURLFromSystemPath(aSystem, aRelative)
!= osl::FileBase::E_None) continue; if (osl::FileBase::getAbsoluteFileURL(aCWD, aRelative, aAbsolute)
!= osl::FileBase::E_None) continue;
// GetOldStyleDicsInDir will make sure the dictionary is the right // type based on its prefix, that way hyphen, mythes and regular // dictionaries can live in one directory
GetOldStyleDicsInDir(aAbsolute, aFormatName, aSystemSuffix,
aSystemPrefix, aDicLangInUse, aRes);
} while (nIndex != -1);
} #endif
// load system directories last so that DICPATH prevails
GetOldStyleDicsInDir(aSystemDir, aFormatName, aSystemSuffix, aSystemPrefix,
aDicLangInUse, aRes); #endif
return aRes;
}
void MergeNewStyleDicsAndOldStyleDics(
std::vector< SvtLinguConfigDictionaryEntry > &rNewStyleDics, const std::vector< SvtLinguConfigDictionaryEntry > &rOldStyleDics )
{ // get list of languages supported by new style dictionaries
std::set< OUString > aNewStyleLanguages; for (autoconst& newStyleDic : rNewStyleDics)
{ const uno::Sequence< OUString > aLocaleNames(newStyleDic.aLocaleNames);
sal_Int32 nLocaleNames = aLocaleNames.getLength(); for (sal_Int32 k = 0; k < nLocaleNames; ++k)
{
aNewStyleLanguages.insert( aLocaleNames[k] );
}
}
// now check all old style dictionaries if they will add a not yet // added language. If so add them to the resulting vector for (autoconst& oldStyleDic : rOldStyleDics)
{
sal_Int32 nOldStyleDics = oldStyleDic.aLocaleNames.getLength();
// old style dics should only have one language listed...
DBG_ASSERT( nOldStyleDics, "old style dictionary with more than one language found!"); if (nOldStyleDics > 0)
{ if (linguistic::LinguIsUnspecified( oldStyleDic.aLocaleNames[0]))
{
OSL_FAIL( "old style dictionary with invalid language found!" ); continue;
}
// language not yet added? if (aNewStyleLanguages.find( oldStyleDic.aLocaleNames[0] ) == aNewStyleLanguages.end())
rNewStyleDics.push_back(oldStyleDic);
} else
{
OSL_FAIL( "old style dictionary with no language found!" );
}
}
}
rtl_TextEncoding getTextEncodingFromCharset(constchar* pCharset)
{ // default result: used to indicate that we failed to get the proper encoding
rtl_TextEncoding eRet = RTL_TEXTENCODING_DONTKNOW;
if (pCharset)
{
eRet = rtl_getTextEncodingFromMimeCharset(pCharset); if (eRet == RTL_TEXTENCODING_DONTKNOW)
eRet = rtl_getTextEncodingFromUnixCharset(pCharset); if (eRet == RTL_TEXTENCODING_DONTKNOW)
{ if (strcmp("ISCII-DEVANAGARI", pCharset) == 0)
eRet = RTL_TEXTENCODING_ISCII_DEVANAGARI;
}
} return eRet;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.