From be933ef2241d79558f91796cc5b3a161f72ebf9c Mon Sep 17 00:00:00 2001 From: manuel Date: Mon, 19 Oct 2020 00:52:24 +0200 Subject: sync with upstream --- xbmc/utils/LangCodeExpander.h | 143 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 143 insertions(+) create mode 100644 xbmc/utils/LangCodeExpander.h (limited to 'xbmc/utils/LangCodeExpander.h') diff --git a/xbmc/utils/LangCodeExpander.h b/xbmc/utils/LangCodeExpander.h new file mode 100644 index 0000000..5e26a65 --- /dev/null +++ b/xbmc/utils/LangCodeExpander.h @@ -0,0 +1,143 @@ +/* + * Copyright (C) 2005-2018 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#pragma once + +#include +#include +#include + +class TiXmlElement; + +class CLangCodeExpander +{ +public: + CLangCodeExpander(); + ~CLangCodeExpander(); + + enum LANGFORMATS + { + ISO_639_1, + ISO_639_2, + ENGLISH_NAME + }; + + void LoadUserCodes(const TiXmlElement* pRootElement); + void Clear(); + + bool Lookup(const std::string& code, std::string& desc); + bool Lookup(const int code, std::string& desc); + + /** \brief Determines if two english language names represent the same language. + * \param[in] lang1 The first language string to compare given as english language name. + * \param[in] lang2 The second language string to compare given as english language name. + * \return true if the two language strings represent the same language, false otherwise. + * For example "Abkhaz" and "Abkhazian" represent the same language. + */ + bool CompareFullLanguageNames(const std::string& lang1, const std::string& lang2); + + /** \brief Determines if two languages given as ISO 639-1, ISO 639-2/T, or ISO 639-2/B codes represent the same language. + * \param[in] code1 The first language to compare given as ISO 639-1, ISO 639-2/T, or ISO 639-2/B code. + * \param[in] code2 The second language to compare given as ISO 639-1, ISO 639-2/T, or ISO 639-2/B code. + * \return true if the two language codes represent the same language, false otherwise. + * For example "ger", "deu" and "de" represent the same language. + */ + bool CompareISO639Codes(const std::string& code1, const std::string& code2); + + /** \brief Converts a language given as 2-Char (ISO 639-1), + * 3-Char (ISO 639-2/T or ISO 639-2/B), + * or full english name string to a 2-Char (ISO 639-1) code. + * \param[out] code The 2-Char language code of the given language lang. + * \param[in] lang The language that should be converted. + * \return true if the conversion succeeded, false otherwise. + */ + bool ConvertToISO6391(const std::string& lang, std::string& code); + + /** \brief Converts a language given as 2-Char (ISO 639-1), + * 3-Char (ISO 639-2/T or ISO 639-2/B), + * or full english name string to a 3-Char ISO 639-2/B code. + * \param[in] lang The language that should be converted. + * \return The 3-Char ISO 639-2/B code of lang if that code exists, lang otherwise. + */ + std::string ConvertToISO6392B(const std::string& lang); + + /** \brief Converts a language given as 2-Char (ISO 639-1) to a 3-Char (ISO 639-2/T) code. + * \param[in] strISO6391 The language that should be converted. + * \param[out] strISO6392B The 3-Char (ISO 639-2/B) language code of the given language strISO6391. + * \param[in] checkWin32Locales Whether to also check WIN32 specific language codes. + * \return true if the conversion succeeded, false otherwise. + */ + static bool ConvertISO6391ToISO6392B(const std::string& strISO6391, std::string& strISO6392B, bool checkWin32Locales = false); + + /** \brief Converts a language given as 2-Char (ISO 639-1), + * 3-Char (ISO 639-2/T or ISO 639-2/B), + * or full english name string to a 3-Char ISO 639-2/T code. + * \param[in] strCharCode The language that should be converted. + * \param[out] strISO6392B The 3-Char (ISO 639-2/B) language code of the given language strISO6391. + * \param[in] checkWin32Locales Whether to also check WIN32 specific language codes. + * \return true if the conversion succeeded, false otherwise. + */ + bool ConvertToISO6392B(const std::string& strCharCode, std::string& strISO6392B, bool checkWin32Locales = false); + + /** \brief Converts a language given as 2-Char (ISO 639-1), + * 3-Char (ISO 639-2/T or ISO 639-2/B), + * or full english name string to a 3-Char ISO 639-2/T code. + * \param[in] strCharCode The language that should be converted. + * \param[out] strISO6392T The 3-Char (ISO 639-2/T) language code of the given language strISO6391. + * \param[in] checkWin32Locales Whether to also check WIN32 specific language codes. + * \return true if the conversion succeeded, false otherwise. + */ + bool ConvertToISO6392T(const std::string& strCharCode, std::string& strISO6392T, bool checkWin32Locales = false); + + /** \brief Converts a language given as 2-Char (ISO 639-1), + * 3-Char (ISO 639-2/T or ISO 639-2/B), + * or full english name string to a 3-Char ISO 639-2/T code. + * \param[in] lang The language that should be converted. + * \return The 3-Char ISO 639-2/T code of lang if that code exists, lang otherwise. + */ + std::string ConvertToISO6392T(const std::string& lang); + +#ifdef TARGET_WINDOWS + static bool ConvertISO31661Alpha2ToISO31661Alpha3(const std::string& strISO31661Alpha2, std::string& strISO31661Alpha3); + static bool ConvertWindowsLanguageCodeToISO6392B(const std::string& strWindowsLanguageCode, std::string& strISO6392B); +#endif + + std::vector GetLanguageNames(LANGFORMATS format = ISO_639_1, bool customNames = false); +protected: + + /** \brief Converts a language code given as a long, see #MAKECODE(a, b, c, d) + * to its string representation. + * \param[in] code The language code given as a long, see #MAKECODE(a, b, c, d). + * \param[out] ret The string representation of the given language code code. + */ + static void CodeToString(long code, std::string& ret); + + static bool LookupInISO639Tables(const std::string& code, std::string& desc); + bool LookupInUserMap(const std::string& code, std::string& desc); + + /** \brief Looks up the ISO 639-1, ISO 639-2/T, or ISO 639-2/B, whichever it finds first, + * code of the given english language name. + * \param[in] desc The english language name for which a code is looked for. + * \param[out] code The ISO 639-1, ISO 639-2/T, or ISO 639-2/B code of the given language desc. + * \return true if the a code was found, false otherwise. + */ + bool ReverseLookup(const std::string& desc, std::string& code); + + + /** \brief Looks up the user defined code of the given code or language name. + * \param[in] desc The language code or name that should be converted. + * \param[out] userCode The user defined language code of the given language desc. + * \return true if desc was found, false otherwise. + */ + bool LookupUserCode(const std::string& desc, std::string &userCode); + + typedef std::map STRINGLOOKUPTABLE; + STRINGLOOKUPTABLE m_mapUser; +}; + +extern CLangCodeExpander g_LangCodeExpander; -- cgit v1.2.3