summaryrefslogtreecommitdiff
path: root/Source/Core/DolphinQt/GameList/GameFile.cpp
diff options
context:
space:
mode:
authorJosJuice <josjuice@gmail.com>2015-04-09 17:44:53 +0200
committerJosJuice <josjuice@gmail.com>2015-04-23 08:14:39 +0200
commit235ecfbed71986f0be2ecf469a10e1105dcb3c96 (patch)
tree36427d6c1bedd2b695fc3bd68a66743d8c26e33f /Source/Core/DolphinQt/GameList/GameFile.cpp
parent87a63713f4f7c583545f23b75ed8395913c8e600 (diff)
Return GetNames languages, to avoid hardcoded language lists in callers
This makes the code cleaner and also leads to some user-visible changes: The wx game properties will no longer let the user select WAD languages that don't have any names. The Qt game list will now display names using the languages set in the configuration instead of always using English for PAL GC games and Japanese for WADs. If a WAD doesn't have a name in the user's preferred language, English is now selected as a fallback before Japanese.
Diffstat (limited to 'Source/Core/DolphinQt/GameList/GameFile.cpp')
-rw-r--r--Source/Core/DolphinQt/GameList/GameFile.cpp127
1 files changed, 73 insertions, 54 deletions
diff --git a/Source/Core/DolphinQt/GameList/GameFile.cpp b/Source/Core/DolphinQt/GameList/GameFile.cpp
index 67b7d7855f..9b36e86069 100644
--- a/Source/Core/DolphinQt/GameList/GameFile.cpp
+++ b/Source/Core/DolphinQt/GameList/GameFile.cpp
@@ -26,23 +26,48 @@
#include "DolphinQt/Utils/Resources.h"
#include "DolphinQt/Utils/Utils.h"
-static const u32 CACHE_REVISION = 0x006;
+static const u32 CACHE_REVISION = 0x007;
static const u32 DATASTREAM_REVISION = 15; // Introduced in Qt 5.2
-static QStringList VectorToStringList(std::vector<std::string> vec, bool trim = false)
+static QMap<IVolume::ELanguage, QString> ConvertLocalizedStrings(std::map<IVolume::ELanguage, std::string> strings)
{
- QStringList result;
- if (trim)
- {
- for (const std::string& member : vec)
- result.append(QString::fromStdString(member).trimmed());
- }
- else
+ QMap<IVolume::ELanguage, QString> result;
+
+ for (auto entry : strings)
+ result.insert(entry.first, QString::fromStdString(entry.second).trimmed());
+
+ return result;
+}
+
+template<class to, class from>
+static QMap<to, QString> CastLocalizedStrings(QMap<from, QString> strings)
+{
+ QMap<to, QString> result;
+
+ auto end = strings.cend();
+ for (auto it = strings.cbegin(); it != end; ++it)
+ result.insert((to)it.key(), it.value());
+
+ return result;
+}
+
+static QString GetLanguageString(IVolume::ELanguage language, QMap<IVolume::ELanguage, QString> strings)
+{
+ if (strings.contains(language))
+ return strings.value(language);
+
+ // English tends to be a good fallback when the requested language isn't available
+ if (language != IVolume::ELanguage::LANGUAGE_ENGLISH)
{
- for (const std::string& member : vec)
- result.append(QString::fromStdString(member));
+ if (strings.contains(IVolume::ELanguage::LANGUAGE_ENGLISH))
+ return strings.value(IVolume::ELanguage::LANGUAGE_ENGLISH);
}
- return result;
+
+ // If English isn't available either, just pick something
+ if (!strings.empty())
+ return strings.cbegin().value();
+
+ return SL("");
}
GameFile::GameFile(const QString& fileName)
@@ -66,7 +91,7 @@ GameFile::GameFile(const QString& fileName)
else
m_platform = WII_WAD;
- m_volume_names = VectorToStringList(volume->GetNames());
+ m_volume_names = ConvertLocalizedStrings(volume->GetNames());
m_country = volume->GetCountry();
m_file_size = volume->GetRawSize();
@@ -92,9 +117,9 @@ GameFile::GameFile(const QString& fileName)
if (bannerLoader->IsValid())
{
if (m_platform != WII_WAD)
- m_names = VectorToStringList(bannerLoader->GetNames());
+ m_names = ConvertLocalizedStrings(bannerLoader->GetNames());
m_company = QString::fromStdString(bannerLoader->GetCompany());
- m_descriptions = VectorToStringList(bannerLoader->GetDescriptions(), true);
+ m_descriptions = ConvertLocalizedStrings(bannerLoader->GetDescriptions());
int width, height;
std::vector<u32> buffer = bannerLoader->GetBanner(&width, &height);
@@ -158,11 +183,15 @@ bool GameFile::LoadFromCache()
if (cache_rev != CACHE_REVISION)
return false;
- int country;
+ u32 country;
+ QMap<u8, QString> volume_names;
+ QMap<u8, QString> names;
+ QMap<u8, QString> descriptions;
stream >> m_folder_name
- >> m_volume_names
+ >> volume_names
+ >> names
>> m_company
- >> m_descriptions
+ >> descriptions
>> m_unique_id
>> m_file_size
>> m_volume_size
@@ -173,6 +202,9 @@ bool GameFile::LoadFromCache()
>> m_is_disc_two
>> m_revision;
m_country = (DiscIO::IVolume::ECountry)country;
+ m_volume_names = CastLocalizedStrings<IVolume::ELanguage>(volume_names);
+ m_names = CastLocalizedStrings<IVolume::ELanguage>(names);
+ m_descriptions = CastLocalizedStrings<IVolume::ELanguage>(descriptions);
file.close();
return true;
}
@@ -198,13 +230,14 @@ void GameFile::SaveToCache()
stream << CACHE_REVISION;
stream << m_folder_name
- << m_volume_names
+ << CastLocalizedStrings<u8>(m_volume_names)
+ << CastLocalizedStrings<u8>(m_names)
<< m_company
- << m_descriptions
+ << CastLocalizedStrings<u8>(m_descriptions)
<< m_unique_id
<< m_file_size
<< m_volume_size
- << (int)m_country
+ << (u32)m_country
<< m_banner
<< m_compressed
<< m_platform
@@ -233,55 +266,36 @@ QString GameFile::CreateCacheFilename()
QString GameFile::GetCompany() const
{
- if (m_company.isEmpty())
- return QObject::tr("N/A");
- else
- return m_company;
+ return m_company;
}
-// For all of the following functions that accept an "index" parameter,
-// (-1 = Japanese, 0 = English, etc)?
-
-QString GameFile::GetDescription(int index) const
+QString GameFile::GetDescription(IVolume::ELanguage language) const
{
- if (index < m_descriptions.size())
- return m_descriptions[index];
-
- if (!m_descriptions.empty())
- return m_descriptions[0];
-
- return SL("");
+ return GetLanguageString(language, m_descriptions);
}
-QString GameFile::GetVolumeName(int index) const
+QString GameFile::GetDescription() const
{
- if (index < m_volume_names.size() && !m_volume_names[index].isEmpty())
- return m_volume_names[index];
-
- if (!m_volume_names.isEmpty())
- return m_volume_names[0];
-
- return SL("");
+ return GetDescription(SConfig::GetInstance().m_LocalCoreStartupParameter.GetCurrentLanguage(m_platform != GAMECUBE_DISC));
}
-QString GameFile::GetBannerName(int index) const
+QString GameFile::GetVolumeName(IVolume::ELanguage language) const
{
- if (index < m_names.size() && !m_names[index].isEmpty())
- return m_names[index];
-
- if (!m_names.isEmpty())
- return m_names[0];
+ return GetLanguageString(language, m_volume_names);
+}
- return SL("");
+QString GameFile::GetBannerName(IVolume::ELanguage language) const
+{
+ return GetLanguageString(language, m_names);
}
-QString GameFile::GetName(int index) const
+QString GameFile::GetName(IVolume::ELanguage language) const
{
// Prefer name from banner, fallback to name from volume, fallback to filename
- QString name = GetBannerName(index);
+ QString name = GetBannerName(language);
if (name.isEmpty())
- name = GetVolumeName(index);
+ name = GetVolumeName(language);
if (name.isEmpty())
{
@@ -294,6 +308,11 @@ QString GameFile::GetName(int index) const
return name;
}
+QString GameFile::GetName() const
+{
+ return GetName(SConfig::GetInstance().m_LocalCoreStartupParameter.GetCurrentLanguage(m_platform != GAMECUBE_DISC));
+}
+
const QString GameFile::GetWiiFSPath() const
{
std::unique_ptr<DiscIO::IVolume> volume(DiscIO::CreateVolumeFromFilename(m_file_name.toStdString()));