Files
o3de/Gems/GraphCanvas/Code/Source/Translation/TranslationDatabase.cpp
T
lumberyard-employee-dm 20d55c6267 Fixed the translation error messages for GraphCanvas
It was unconditionally logging an AZ_Warning and AZ_Error if a
translation entry with the same key was added to the database.
This didn't account for the same key and value being added to the
database, so loading the same translation file twice would result in
error messages for each entry.

Signed-off-by: lumberyard-employee-dm <56135373+lumberyard-employee-dm@users.noreply.github.com>
2021-12-17 18:32:05 -06:00

183 lines
5.6 KiB
C++

/*
* Copyright (c) Contributors to the Open 3D Engine Project.
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
*
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
#include "GraphCanvas.h"
namespace GraphCanvas
{
TranslationDatabase::TranslationDatabase()
{
TranslationRequestBus::Handler::BusConnect();
}
TranslationDatabase::~TranslationDatabase()
{
TranslationRequestBus::Handler::BusDisconnect();
AZ::Data::AssetBus::MultiHandler::BusDisconnect();
}
void TranslationDatabase::Init()
{
AzFramework::AssetCatalogEventBus::Handler::BusConnect();
}
void TranslationDatabase::Restore()
{
AZStd::lock_guard<AZStd::recursive_mutex> lock(m_mutex);
m_database.clear();
AZStd::function<void()> reloadFn = []()
{
// Collects all script assets for reloading
AZ::Data::AssetCatalogRequests::AssetEnumerationCB collectAssetsCb = [](const AZ::Data::AssetId, const AZ::Data::AssetInfo& info)
{
// Check asset type
if (info.m_assetType == azrtti_typeid<TranslationAsset>())
{
auto asset = AZ::Data::AssetManager::Instance().GetAsset<TranslationAsset>(info.m_assetId, AZ::Data::AssetLoadBehavior::Default);
if (asset && asset.IsReady())
{
// Reload the asset from it's current data
asset.Reload();
}
}
};
AZ::Data::AssetCatalogRequestBus::Broadcast(&AZ::Data::AssetCatalogRequestBus::Events::EnumerateAssets, nullptr, collectAssetsCb, nullptr);
};
AZ::TickBus::QueueFunction(reloadFn);
}
void TranslationDatabase::DumpDatabase(const AZStd::string& filename)
{
rapidjson::Document document;
document.SetObject();
rapidjson::Value entries(rapidjson::kArrayType);
for (const auto& entry : m_database)
{
rapidjson::Value key(rapidjson::kStringType);
key.SetString(entry.first.c_str(), document.GetAllocator());
rapidjson::Value value(rapidjson::kStringType);
value.SetString(entry.second.c_str(), document.GetAllocator());
rapidjson::Value item(rapidjson::kObjectType);
item.AddMember(key, value, document.GetAllocator());
entries.PushBack(item, document.GetAllocator());
}
document.AddMember("entries", entries, document.GetAllocator());
AZ::IO::SystemFile outputFile;
if (!outputFile.Open(filename.c_str(),
AZ::IO::SystemFile::OpenMode::SF_OPEN_CREATE |
AZ::IO::SystemFile::OpenMode::SF_OPEN_CREATE_PATH |
AZ::IO::SystemFile::OpenMode::SF_OPEN_WRITE_ONLY))
{
AZ_Error("Translation", false, "Failed to create output file: %s", filename.c_str());
return;
}
rapidjson::StringBuffer scratchBuffer;
rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(scratchBuffer);
document.Accept(writer);
outputFile.Write(scratchBuffer.GetString(), scratchBuffer.GetSize());
outputFile.Close();
scratchBuffer.Clear();
}
bool TranslationDatabase::HasKey(const AZStd::string& key)
{
return m_database.find(key) != m_database.end();
}
GraphCanvas::TranslationRequests::Details TranslationDatabase::GetDetails(const AZStd::string& key, const Details& fallbackDetails)
{
Details details;
if (!Get(key + ".name", details.m_name))
{
details.m_name = fallbackDetails.m_name;
}
if (!Get(key + ".tooltip", details.m_tooltip))
{
details.m_tooltip = fallbackDetails.m_tooltip;
}
if (!Get(key + ".subtitle", details.m_subtitle))
{
details.m_subtitle = fallbackDetails.m_subtitle;
}
if (!Get(key + ".category", details.m_category))
{
details.m_category = fallbackDetails.m_category;
}
return details;
}
bool TranslationDatabase::Get(const AZStd::string& key, AZStd::string& value)
{
AZStd::lock_guard<AZStd::recursive_mutex> lock(m_mutex);
if (m_database.find(key) != m_database.end())
{
value = m_database[key];
return true;
}
static bool s_traceMissingItems = false;
if (s_traceMissingItems)
{
AZ_TracePrintf("GraphCanvas", AZStd::string::format("Value not found for key: %s", key.c_str()).c_str());
}
return false;
}
bool TranslationDatabase::Add(const TranslationFormat& format)
{
AZStd::lock_guard<AZStd::recursive_mutex> lock(m_mutex);
bool warnings = false;
for (auto& entry : format.m_database)
{
if (m_database.find(entry.first) == m_database.end())
{
m_database[entry.first] = entry.second;
}
else
{
const bool valueMatches = entry.second == m_database[entry.first];
AZ_Warning("TranslationDatabase", valueMatches,
R"(Unable to store key: "%s" with value: "%s" because that key already exists with value: "%s")",
entry.first.c_str(), entry.second.c_str(), m_database[entry.first].c_str());
warnings = !valueMatches;
}
}
return warnings;
}
bool TranslationDatabase::IsDuplicate(const AZStd::string& key)
{
return m_database.find(key) != m_database.end();
}
}