diff --git a/cockatrice/src/game_graphics/log/message_log_widget.cpp b/cockatrice/src/game_graphics/log/message_log_widget.cpp
index 06b0301bd..b998a3650 100644
--- a/cockatrice/src/game_graphics/log/message_log_widget.cpp
+++ b/cockatrice/src/game_graphics/log/message_log_widget.cpp
@@ -6,6 +6,7 @@
#include "../../game/game_state.h"
#include "../../game/phase.h"
#include "../../game/player/player_logic.h"
+#include "../../interface/card_localization.h"
#include "../../interface/widgets/tabs/tab_game.h"
#include "../board/card_item.h"
#include "../board/translate_counter_name.h"
@@ -23,7 +24,11 @@ static QString sanitizeHtml(QString dirty)
static QString cardLink(const QString &cardName)
{
- return QString("%2").arg(cardName).arg(cardName);
+ // The href keeps the canonical name so the card popup can resolve it, while the label shows the name
+ // in the configured card language.
+ return QString("%2")
+ .arg(sanitizeHtml(cardName))
+ .arg(sanitizeHtml(CardLocalization::displayNameFor(cardName)));
}
QPair
@@ -803,10 +808,9 @@ void MessageLogWidget::logUndoDraw(PlayerLogic *player, QString cardName)
if (cardName.isEmpty()) {
appendHtmlServerMessage(tr("%1 undoes their last draw.").arg(sanitizeHtml(player->getPlayerInfo()->getName())));
} else {
- appendHtmlServerMessage(
- tr("%1 undoes their last draw (%2).")
- .arg(sanitizeHtml(player->getPlayerInfo()->getName()))
- .arg(QString("%2").arg(sanitizeHtml(cardName)).arg(sanitizeHtml(cardName))));
+ appendHtmlServerMessage(tr("%1 undoes their last draw (%2).")
+ .arg(sanitizeHtml(player->getPlayerInfo()->getName()))
+ .arg(cardLink(std::move(cardName))));
}
}
diff --git a/cockatrice/src/interface/card_localization.h b/cockatrice/src/interface/card_localization.h
index 0bfe4a764..1a1e7be5d 100644
--- a/cockatrice/src/interface/card_localization.h
+++ b/cockatrice/src/interface/card_localization.h
@@ -5,6 +5,7 @@
#include
#include
+#include
#include
namespace CardLocalization
@@ -54,6 +55,25 @@ inline QString displayText(const CardInfo &card)
{
return card.getLocalizedText(displayLang());
}
+
+/**
+ * @brief Looks a card up by its canonical name and returns its name in the configured display language.
+ *
+ * Use this where only the canonical name is known, such as the game log or [card] chat tags. Callers that
+ * already hold a resolved card and need to keep the canonical name around (as a link target, say) should
+ * use displayName() directly instead.
+ *
+ * @param cardName The canonical card name.
+ * @return The localized name, or cardName unchanged when the card is unknown to the database.
+ */
+inline QString displayNameFor(const QString &cardName)
+{
+ if (cardName.isEmpty()) {
+ return cardName;
+ }
+ const QString localizedName = displayName(CardDatabaseManager::query()->getCardInfo(cardName));
+ return localizedName.isEmpty() ? cardName : localizedName;
+}
} // namespace CardLocalization
#endif // COCKATRICE_CARD_LOCALIZATION_H
\ No newline at end of file
diff --git a/cockatrice/src/interface/widgets/server/chat_view/chat_view.cpp b/cockatrice/src/interface/widgets/server/chat_view/chat_view.cpp
index ae9b2deb4..91a7cb965 100644
--- a/cockatrice/src/interface/widgets/server/chat_view/chat_view.cpp
+++ b/cockatrice/src/interface/widgets/server/chat_view/chat_view.cpp
@@ -2,6 +2,7 @@
#include "../../../../client/settings/cache_settings.h"
#include "../../client/sound_engine.h"
+#include "../../interface/card_localization.h"
#include "../../interface/pixel_map_generator.h"
#include "../../interface/widgets/tabs/tab_account.h"
#include "../user/user_context_menu.h"
@@ -190,7 +191,8 @@ void ChatView::appendCardTag(QTextCursor &cursor, const QString &cardName)
QTextCharFormat cardFormat = oldFormat;
cardFormat.setFontItalic(true);
- if (!CardDatabaseManager::query()->lookupCardByName(cardName)) {
+ const CardInfoPtr card = CardDatabaseManager::query()->lookupCardByName(cardName);
+ if (card.isNull()) {
cardFormat.setForeground(unresolvedCardTagColor);
cursor.setCharFormat(cardFormat);
cursor.insertText(cardName);
@@ -200,10 +202,12 @@ void ChatView::appendCardTag(QTextCursor &cursor, const QString &cardName)
cardFormat.setForeground(linkColor);
cardFormat.setAnchor(true);
+ // The href keeps the canonical name so the card popup can resolve it, while the text shows the name
+ // in the configured card language.
cardFormat.setAnchorHref("card://" + cardName);
cursor.setCharFormat(cardFormat);
- cursor.insertText(cardName);
+ cursor.insertText(CardLocalization::displayName(card));
cursor.setCharFormat(oldFormat);
}