2 * Copyright (C) 2005-2018 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
8 #include "LanguageResource.h"
11 #include "ServiceBroker.h"
12 #include "addons/AddonManager.h"
13 #include "addons/Skin.h"
14 #include "addons/addoninfo/AddonType.h"
15 #include "guilib/GUIWindowManager.h"
16 #include "messaging/helpers/DialogHelper.h"
17 #include "settings/Settings.h"
18 #include "settings/SettingsComponent.h"
19 #include "utils/StringUtils.h"
20 #include "utils/Variant.h"
22 using namespace KODI::MESSAGING
;
24 using KODI::MESSAGING::HELPERS::DialogResponse
;
26 #define LANGUAGE_ADDON_PREFIX "resource.language."
31 CLanguageResource::CLanguageResource(const AddonInfoPtr
& addonInfo
)
32 : CResource(addonInfo
, AddonType::RESOURCE_LANGUAGE
)
34 // parse <extension> attributes
36 CLocale::FromString(Type(AddonType::RESOURCE_LANGUAGE
)->GetValue("@locale").asString());
39 const CAddonExtensions
* charsetsElement
=
40 Type(AddonType::RESOURCE_LANGUAGE
)->GetElement("charsets");
41 if (charsetsElement
!= nullptr)
43 m_charsetGui
= charsetsElement
->GetValue("gui").asString();
44 m_forceUnicodeFont
= charsetsElement
->GetValue("gui@unicodefont").asBoolean();
45 m_charsetSubtitle
= charsetsElement
->GetValue("subtitle").asString();
49 const CAddonExtensions
* dvdElement
= Type(AddonType::RESOURCE_LANGUAGE
)->GetElement("dvd");
50 if (dvdElement
!= nullptr)
52 m_dvdLanguageMenu
= dvdElement
->GetValue("menu").asString();
53 m_dvdLanguageAudio
= dvdElement
->GetValue("audio").asString();
54 m_dvdLanguageSubtitle
= dvdElement
->GetValue("subtitle").asString();
56 // fall back to the language of the addon if a DVD language is not defined
57 if (m_dvdLanguageMenu
.empty())
58 m_dvdLanguageMenu
= m_locale
.GetLanguageCode();
59 if (m_dvdLanguageAudio
.empty())
60 m_dvdLanguageAudio
= m_locale
.GetLanguageCode();
61 if (m_dvdLanguageSubtitle
.empty())
62 m_dvdLanguageSubtitle
= m_locale
.GetLanguageCode();
65 const CAddonExtensions
* sorttokensElement
=
66 Type(AddonType::RESOURCE_LANGUAGE
)->GetElement("sorttokens");
67 if (sorttokensElement
!= nullptr)
69 /* First loop goes around rows e.g.
70 * <token separators="'">L</token>
74 for (const auto& values
: sorttokensElement
->GetValues())
76 /* Second loop goes around the row parts, e.g.
80 std::string token
= values
.second
.GetValue("token").asString();
81 std::string separators
= values
.second
.GetValue("token@separators").asString();
84 if (separators
.empty())
87 for (auto separator
: separators
)
88 m_sortTokens
.insert(token
+ separator
);
94 bool CLanguageResource::IsInUse() const
96 return StringUtils::EqualsNoCase(CServiceBroker::GetSettingsComponent()->GetSettings()->GetString(CSettings::SETTING_LOCALE_LANGUAGE
), ID());
99 void CLanguageResource::OnPostInstall(bool update
, bool modal
)
104 if (IsInUse() || (!update
&& !modal
&&
105 (HELPERS::ShowYesNoDialogText(CVariant
{Name()}, CVariant
{24132}) ==
106 DialogResponse::CHOICE_YES
)))
109 g_langInfo
.SetLanguage(ID());
111 CServiceBroker::GetSettingsComponent()->GetSettings()->SetString(CSettings::SETTING_LOCALE_LANGUAGE
, ID());
115 bool CLanguageResource::IsAllowed(const std::string
&file
) const
117 return file
.empty() ||
118 StringUtils::EqualsNoCase(file
.c_str(), "langinfo.xml") ||
119 StringUtils::EqualsNoCase(file
.c_str(), "strings.po");
122 std::string
CLanguageResource::GetAddonId(const std::string
& locale
)
127 std::string addonId
= locale
;
128 if (!StringUtils::StartsWith(addonId
, LANGUAGE_ADDON_PREFIX
))
129 addonId
= LANGUAGE_ADDON_PREFIX
+ locale
;
131 StringUtils::ToLower(addonId
);
135 bool CLanguageResource::FindLegacyLanguage(const std::string
&locale
, std::string
&legacyLanguage
)
140 std::string addonId
= GetAddonId(locale
);
143 if (!CServiceBroker::GetAddonMgr().GetAddon(addonId
, addon
, AddonType::RESOURCE_LANGUAGE
,
144 OnlyEnabled::CHOICE_YES
))
147 legacyLanguage
= addon
->Name();