From b1d829e52e826b6ea4ae884a64fdb68b66c74dd7 Mon Sep 17 00:00:00 2001 From: Caolán McNamara Date: Mon, 31 Jul 2017 17:16:27 +0100 Subject: move resmgr to unotools and the vast majority of translations is to the ui language so default ctor with that arg and now drop OModuleResourceClient Change-Id: I3b85a560ffdfe5f019c2271ac56a5fe4a361522b --- unotools/source/i18n/resmgr.cxx | 158 ++++++++++++++++++++++++++++ unotools/source/misc/componentresmodule.cxx | 87 --------------- 2 files changed, 158 insertions(+), 87 deletions(-) create mode 100644 unotools/source/i18n/resmgr.cxx delete mode 100644 unotools/source/misc/componentresmodule.cxx (limited to 'unotools/source') diff --git a/unotools/source/i18n/resmgr.cxx b/unotools/source/i18n/resmgr.cxx new file mode 100644 index 000000000000..492c7fcf8632 --- /dev/null +++ b/unotools/source/i18n/resmgr.cxx @@ -0,0 +1,158 @@ +/* -*- 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 . + */ + +#include + +#include + +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include + +namespace +{ + OUString createFromUtf8(const char* data, size_t size) + { + OUString aTarget; + bool bSuccess = rtl_convertStringToUString(&aTarget.pData, + data, + size, + RTL_TEXTENCODING_UTF8, + RTL_TEXTTOUNICODE_FLAGS_UNDEFINED_ERROR|RTL_TEXTTOUNICODE_FLAGS_MBUNDEFINED_ERROR|RTL_TEXTTOUNICODE_FLAGS_INVALID_ERROR); + (void) bSuccess; + assert(bSuccess); + return aTarget; + } + + OString genKeyId(const OString& rGenerator) + { + sal_uInt32 nCRC = rtl_crc32(0, rGenerator.getStr(), rGenerator.getLength()); + // Use simple ASCII characters, exclude I, l, 1 and O, 0 to avoid confusing IDs + static const char sSymbols[] = + "ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz23456789"; + char sKeyId[6]; + for (short nKeyInd = 0; nKeyInd < 5; ++nKeyInd) + { + sKeyId[nKeyInd] = sSymbols[(nCRC & 63) % strlen(sSymbols)]; + nCRC >>= 6; + } + sKeyId[5] = '\0'; + return OString(sKeyId); + } +} + +namespace Translate +{ + std::locale Create(const sal_Char* pPrefixName, const LanguageTag& rLocale) + { + static std::unordered_map aCache; + OString sIdentifier = rLocale.getGlibcLocaleString(".UTF-8").toUtf8(); + OString sUnique = sIdentifier + OString(pPrefixName); + auto aFind = aCache.find(sUnique); + if (aFind != aCache.end()) + return aFind->second; + boost::locale::generator gen; + gen.characters(boost::locale::char_facet); + gen.categories(boost::locale::message_facet | boost::locale::information_facet); + OUString uri("$BRAND_BASE_DIR/$BRAND_SHARE_RESOURCE_SUBDIR/"); + rtl::Bootstrap::expandMacros(uri); + OUString path; + osl::File::getSystemPathFromFileURL(uri, path); + gen.add_messages_path(OUStringToOString(path, osl_getThreadTextEncoding()).getStr()); + gen.add_messages_domain(pPrefixName); + std::locale aRet(gen(sIdentifier.getStr())); + aCache[sUnique] = aRet; + return aRet; + } + + OUString get(const char* pContextAndId, const std::locale &loc) + { + OString sContext; + const char *pId = strchr(pContextAndId, '\004'); + if (!pId) + pId = pContextAndId; + else + { + sContext = OString(pContextAndId, pId - pContextAndId); + ++pId; + } + + //if its a key id locale, generate it here + if (std::use_facet(loc).language() == "qtz") + { + OString sKeyId(genKeyId(OString(pContextAndId).replace('\004', '|'))); + return OUString::fromUtf8(sKeyId) + OUStringLiteral1(0x2016) + createFromUtf8(pId, strlen(pId)); + } + + //otherwise translate it + const std::string ret = boost::locale::pgettext(sContext.getStr(), pId, loc); + return ExpandVariables(createFromUtf8(ret.data(), ret.size())); + } + + static ResHookProc pImplResHookProc = nullptr; + + OUString ExpandVariables(const OUString& rString) + { + if (pImplResHookProc) + return pImplResHookProc(rString); + return rString; + } + + void SetReadStringHook( ResHookProc pProc ) + { + pImplResHookProc = pProc; + } + + ResHookProc GetReadStringHook() + { + return pImplResHookProc; + } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/unotools/source/misc/componentresmodule.cxx b/unotools/source/misc/componentresmodule.cxx deleted file mode 100644 index cb1f718fca44..000000000000 --- a/unotools/source/misc/componentresmodule.cxx +++ /dev/null @@ -1,87 +0,0 @@ -/* -*- 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 . - */ - -#include -#include -#include -#include - -namespace utl -{ - - //= OComponentResModuleImpl - - /** PIMPL-class for OComponentResourceModule - - not threadsafe! - */ - class OComponentResModuleImpl - { - private: - std::locale m_aLocale; - bool m_bLocaleInitialized; - OString m_sResFilePrefix; - LanguageTag m_aLanguage; - - OComponentResModuleImpl(const OComponentResModuleImpl&) = delete; - OComponentResModuleImpl& operator=(const OComponentResModuleImpl&) = delete; - - public: - explicit OComponentResModuleImpl(const OString& _rResFilePrefix, const LanguageTag& rLanguage) - : m_bLocaleInitialized( false ) - , m_sResFilePrefix( _rResFilePrefix ) - , m_aLanguage( rLanguage ) - { - } - - /** retrieves our resource manager - */ - const std::locale& getResLocale(); - }; - - const std::locale& OComponentResModuleImpl::getResLocale() - { - if (!m_bLocaleInitialized) - { - m_aLocale = Translate::Create(m_sResFilePrefix.getStr(), m_aLanguage); - m_bLocaleInitialized = true; - } - return m_aLocale; - } - - //= OComponentResourceModule - OComponentResourceModule::OComponentResourceModule(const OString& _rResFilePrefix, const LanguageTag& rLanguage) - :BaseClass() - ,m_pImpl( new OComponentResModuleImpl( _rResFilePrefix, rLanguage ) ) - { - } - - OComponentResourceModule::~OComponentResourceModule() - { - } - - const std::locale& OComponentResourceModule::getResLocale() - { - ::osl::MutexGuard aGuard( m_aMutex ); - return m_pImpl->getResLocale(); - } - -} // namespace utl - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ -- cgit v1.2.3