Added localization support to parts of the application

This commit is contained in:
Leon Styhre 2024-07-14 16:48:31 +02:00
parent d2d4b6d45c
commit 557748970a
5 changed files with 77 additions and 71 deletions

View file

@ -768,8 +768,8 @@ void GuiScraperMenu::openOfflineGenerator(GuiSettings* settings)
_("OK"), nullptr, "", nullptr, "", nullptr, nullptr, false, _("OK"), nullptr, "", nullptr, "", nullptr, nullptr, false,
true, true,
(mRenderer->getIsVerticalOrientation() ? (mRenderer->getIsVerticalOrientation() ?
0.78f : 0.80f :
0.48f * (1.778f / mRenderer->getScreenAspectRatio())))); 0.50f * (1.778f / mRenderer->getScreenAspectRatio()))));
return; return;
} }

View file

@ -22,6 +22,7 @@
#include "components/TextComponent.h" #include "components/TextComponent.h"
#include "guis/GuiMsgBox.h" #include "guis/GuiMsgBox.h"
#include "guis/GuiScraperSearch.h" #include "guis/GuiScraperSearch.h"
#include "utils/LocalizationUtil.h"
GuiScraperMulti::GuiScraperMulti( GuiScraperMulti::GuiScraperMulti(
const std::pair<std::queue<ScraperSearchParams>, std::map<SystemData*, int>>& searches, const std::pair<std::queue<ScraperSearchParams>, std::map<SystemData*, int>>& searches,
@ -48,11 +49,11 @@ GuiScraperMulti::GuiScraperMulti(
mQueueCountPerSystem[(*it).first] = std::make_pair(0, (*it).second); mQueueCountPerSystem[(*it).first] = std::make_pair(0, (*it).second);
// Set up grid. // Set up grid.
mTitle = std::make_shared<TextComponent>("SCRAPING IN PROGRESS", Font::get(FONT_SIZE_LARGE), mTitle = std::make_shared<TextComponent>(_("SCRAPING IN PROGRESS"), Font::get(FONT_SIZE_LARGE),
mMenuColorTitle, ALIGN_CENTER); mMenuColorTitle, ALIGN_CENTER);
mGrid.setEntry(mTitle, glm::ivec2 {0, 0}, false, true, glm::ivec2 {2, 2}); mGrid.setEntry(mTitle, glm::ivec2 {0, 0}, false, true, glm::ivec2 {2, 2});
mSystem = std::make_shared<TextComponent>("SYSTEM", Font::get(FONT_SIZE_MEDIUM), mSystem = std::make_shared<TextComponent>(_("SYSTEM"), Font::get(FONT_SIZE_MEDIUM),
mMenuColorPrimary, ALIGN_CENTER); mMenuColorPrimary, ALIGN_CENTER);
mGrid.setEntry(mSystem, glm::ivec2 {0, 2}, false, true, glm::ivec2 {2, 1}); mGrid.setEntry(mSystem, glm::ivec2 {0, 2}, false, true, glm::ivec2 {2, 1});
@ -105,38 +106,39 @@ GuiScraperMulti::GuiScraperMulti(
std::vector<std::shared_ptr<ButtonComponent>> buttons; std::vector<std::shared_ptr<ButtonComponent>> buttons;
if (mApproveResults) { if (mApproveResults) {
buttons.push_back(std::make_shared<ButtonComponent>("REFINE SEARCH", "refine search", [&] { buttons.push_back(
// Check whether we should allow a refine of the game name. std::make_shared<ButtonComponent>(_("REFINE SEARCH"), _("refine search"), [&] {
if (!mSearchComp->getAcceptedResult()) { // Check whether we should allow a refine of the game name.
bool allowRefine = false; if (!mSearchComp->getAcceptedResult()) {
bool allowRefine = false;
// Previously refined. // Previously refined.
if (mSearchComp->getRefinedSearch()) if (mSearchComp->getRefinedSearch())
allowRefine = true; allowRefine = true;
// Interactive mode and "Auto-accept single game matches" not enabled. // Interactive mode and "Auto-accept single game matches" not enabled.
else if (mSearchComp->getSearchType() != GuiScraperSearch::SEMIAUTOMATIC_MODE) else if (mSearchComp->getSearchType() != GuiScraperSearch::SEMIAUTOMATIC_MODE)
allowRefine = true; allowRefine = true;
// Interactive mode with "Auto-accept single game matches" enabled and more // Interactive mode with "Auto-accept single game matches" enabled and more
// than one result. // than one result.
else if (mSearchComp->getSearchType() == GuiScraperSearch::SEMIAUTOMATIC_MODE && else if (mSearchComp->getSearchType() == GuiScraperSearch::SEMIAUTOMATIC_MODE &&
mSearchComp->getScraperResultsSize() > 1) mSearchComp->getScraperResultsSize() > 1)
allowRefine = true; allowRefine = true;
// Dito but there were no games found, or the search has not been completed. // Dito but there were no games found, or the search has not been completed.
else if (mSearchComp->getSearchType() == GuiScraperSearch::SEMIAUTOMATIC_MODE && else if (mSearchComp->getSearchType() == GuiScraperSearch::SEMIAUTOMATIC_MODE &&
!mSearchComp->getFoundGame()) !mSearchComp->getFoundGame())
allowRefine = true; allowRefine = true;
if (allowRefine) { if (allowRefine) {
// Copy any search refine that may have been previously entered by opening // Copy any search refine that may have been previously entered by opening
// the input screen using the "Y" button shortcut. // the input screen using the "Y" button shortcut.
mSearchQueue.front().nameOverride = mSearchComp->getNameOverride(); mSearchQueue.front().nameOverride = mSearchComp->getNameOverride();
mSearchComp->openInputScreen(mSearchQueue.front()); mSearchComp->openInputScreen(mSearchQueue.front());
mGrid.resetCursor(); mGrid.resetCursor();
}
} }
} }));
}));
buttons.push_back(std::make_shared<ButtonComponent>("SKIP", "skip game", [&] { buttons.push_back(std::make_shared<ButtonComponent>(_("SKIP"), _("skip game"), [&] {
// Skip game, unless the result has already been accepted. // Skip game, unless the result has already been accepted.
if (!mSearchComp->getAcceptedResult()) { if (!mSearchComp->getAcceptedResult()) {
skip(); skip();
@ -145,7 +147,7 @@ GuiScraperMulti::GuiScraperMulti(
})); }));
} }
buttons.push_back(std::make_shared<ButtonComponent>("STOP", "stop", buttons.push_back(std::make_shared<ButtonComponent>(_("STOP"), _("stop"),
std::bind(&GuiScraperMulti::finish, this))); std::bind(&GuiScraperMulti::finish, this)));
mButtonGrid = MenuComponent::makeButtonGrid(buttons); mButtonGrid = MenuComponent::makeButtonGrid(buttons);
@ -308,7 +310,7 @@ void GuiScraperMulti::finish()
{ {
std::stringstream ss; std::stringstream ss;
if (mTotalSuccessful == 0) { if (mTotalSuccessful == 0) {
ss << "NO GAMES WERE SCRAPED"; ss << _("NO GAMES WERE SCRAPED");
} }
else { else {
ss << mTotalSuccessful << " GAME" << ((mTotalSuccessful > 1) ? "S" : "") ss << mTotalSuccessful << " GAME" << ((mTotalSuccessful > 1) ? "S" : "")
@ -321,7 +323,7 @@ void GuiScraperMulti::finish()
// Pressing either OK or using the back button should delete us. // Pressing either OK or using the back button should delete us.
mWindow->pushGui(new GuiMsgBox( mWindow->pushGui(new GuiMsgBox(
getHelpStyle(), ss.str(), "OK", getHelpStyle(), ss.str(), _("OK"),
[&] { [&] {
mIsProcessing = false; mIsProcessing = false;
delete this; delete this;

View file

@ -32,6 +32,7 @@
#include "guis/GuiTextEditKeyboardPopup.h" #include "guis/GuiTextEditKeyboardPopup.h"
#include "guis/GuiTextEditPopup.h" #include "guis/GuiTextEditPopup.h"
#include "resources/Font.h" #include "resources/Font.h"
#include "utils/LocalizationUtil.h"
#include "utils/StringUtil.h" #include "utils/StringUtil.h"
GuiScraperSearch::GuiScraperSearch(SearchType type, unsigned int scrapeCount, int rowCount) GuiScraperSearch::GuiScraperSearch(SearchType type, unsigned int scrapeCount, int rowCount)
@ -103,18 +104,18 @@ GuiScraperSearch::GuiScraperSearch(SearchType type, unsigned int scrapeCount, in
if (mScrapeRatings) if (mScrapeRatings)
mMD_Pairs.push_back(MetaDataPair( mMD_Pairs.push_back(MetaDataPair(
std::make_shared<TextComponent>("RATING:", font, mdLblColor), mMD_Rating, false)); std::make_shared<TextComponent>(_("RATING:"), font, mdLblColor), mMD_Rating, false));
mMD_Pairs.push_back(MetaDataPair(std::make_shared<TextComponent>("RELEASED:", font, mdLblColor),
mMD_ReleaseDate));
mMD_Pairs.push_back(MetaDataPair( mMD_Pairs.push_back(MetaDataPair(
std::make_shared<TextComponent>("DEVELOPER:", font, mdLblColor), mMD_Developer)); std::make_shared<TextComponent>(_("RELEASED:"), font, mdLblColor), mMD_ReleaseDate));
mMD_Pairs.push_back(MetaDataPair( mMD_Pairs.push_back(MetaDataPair(
std::make_shared<TextComponent>("PUBLISHER:", font, mdLblColor), mMD_Publisher)); std::make_shared<TextComponent>(_("DEVELOPER:"), font, mdLblColor), mMD_Developer));
mMD_Pairs.push_back(MetaDataPair(
std::make_shared<TextComponent>(_("PUBLISHER:"), font, mdLblColor), mMD_Publisher));
mMD_Pairs.push_back( mMD_Pairs.push_back(
MetaDataPair(std::make_shared<TextComponent>("GENRE:", font, mdLblColor), mMD_Genre)); MetaDataPair(std::make_shared<TextComponent>(_("GENRE:"), font, mdLblColor), mMD_Genre));
mMD_Pairs.push_back( mMD_Pairs.push_back(MetaDataPair(
MetaDataPair(std::make_shared<TextComponent>("PLAYERS:", font, mdLblColor), mMD_Players)); std::make_shared<TextComponent>(_("PLAYERS:"), font, mdLblColor), mMD_Players));
// If no rating is being scraped, add a filler to make sure that the fonts keep the same // If no rating is being scraped, add a filler to make sure that the fonts keep the same
// size so the GUI looks consistent. // size so the GUI looks consistent.
@ -428,7 +429,7 @@ void GuiScraperSearch::onSearchDone(std::vector<ScraperSearchResult>& results)
mFoundGame = false; mFoundGame = false;
ComponentListRow row; ComponentListRow row;
row.addElement(std::make_shared<TextComponent>("NO GAMES FOUND", font, color), true); row.addElement(std::make_shared<TextComponent>(_("NO GAMES FOUND"), font, color), true);
if (mSkipCallback) if (mSkipCallback)
row.makeAcceptInputHandler(mSkipCallback); row.makeAcceptInputHandler(mSkipCallback);
@ -578,16 +579,16 @@ void GuiScraperSearch::onSearchError(const std::string& error,
if (mScrapeCount > 1) { if (mScrapeCount > 1) {
LOG(LogError) << "GuiScraperSearch: " << Utils::String::replace(error, "\n", ""); LOG(LogError) << "GuiScraperSearch: " << Utils::String::replace(error, "\n", "");
mWindow->pushGui(new GuiMsgBox(getHelpStyle(), Utils::String::toUpper(error), "RETRY", mWindow->pushGui(new GuiMsgBox(getHelpStyle(), Utils::String::toUpper(error), _("RETRY"),
std::bind(&GuiScraperSearch::search, this, mLastSearch), std::bind(&GuiScraperSearch::search, this, mLastSearch),
"SKIP", mSkipCallback, "CANCEL", mCancelCallback, nullptr, _("SKIP"), mSkipCallback, _("CANCEL"), mCancelCallback,
true)); nullptr, true));
} }
else { else {
LOG(LogError) << "GuiScraperSearch: " << Utils::String::replace(error, "\n", ""); LOG(LogError) << "GuiScraperSearch: " << Utils::String::replace(error, "\n", "");
mWindow->pushGui(new GuiMsgBox(getHelpStyle(), Utils::String::toUpper(error), "RETRY", mWindow->pushGui(new GuiMsgBox(getHelpStyle(), Utils::String::toUpper(error), _("RETRY"),
std::bind(&GuiScraperSearch::search, this, mLastSearch), std::bind(&GuiScraperSearch::search, this, mLastSearch),
"CANCEL", mCancelCallback, "", nullptr, nullptr, true)); _("CANCEL"), mCancelCallback, "", nullptr, nullptr, true));
} }
} }
@ -1028,14 +1029,14 @@ void GuiScraperSearch::openInputScreen(ScraperSearchParams& params)
searchString = Utils::String::replace(searchString, "_", " "); searchString = Utils::String::replace(searchString, "_", " ");
if (Settings::getInstance()->getBool("VirtualKeyboard")) { if (Settings::getInstance()->getBool("VirtualKeyboard")) {
mWindow->pushGui(new GuiTextEditKeyboardPopup(getHelpStyle(), 0.0f, "REFINE SEARCH", mWindow->pushGui(new GuiTextEditKeyboardPopup(
searchString, searchForFunc, false, "SEARCH", getHelpStyle(), 0.0f, _("REFINE SEARCH"), searchString, searchForFunc, false,
"SEARCH USING REFINED NAME?")); _("SEARCH"), _("SEARCH USING REFINED NAME?")));
} }
else { else {
mWindow->pushGui(new GuiTextEditPopup(getHelpStyle(), "REFINE SEARCH", searchString, mWindow->pushGui(new GuiTextEditPopup(getHelpStyle(), _("REFINE SEARCH"), searchString,
searchForFunc, false, "SEARCH", searchForFunc, false, _("SEARCH"),
"SEARCH USING REFINED NAME?")); _("SEARCH USING REFINED NAME?")));
} }
} }
@ -1126,15 +1127,15 @@ std::vector<HelpPrompt> GuiScraperSearch::getHelpPrompts()
{ {
std::vector<HelpPrompt> prompts; std::vector<HelpPrompt> prompts;
prompts.push_back(HelpPrompt("y", "refine search")); prompts.push_back(HelpPrompt("y", _("refine search")));
// Only show the skip prompt during multi-scraping. // Only show the skip prompt during multi-scraping.
if (mSkipCallback != nullptr) if (mSkipCallback != nullptr)
prompts.push_back(HelpPrompt("x", "skip")); prompts.push_back(HelpPrompt("x", _("skip")));
if (mFoundGame && (mRefinedSearch || mSearchType != SEMIAUTOMATIC_MODE || if (mFoundGame && (mRefinedSearch || mSearchType != SEMIAUTOMATIC_MODE ||
(mSearchType == SEMIAUTOMATIC_MODE && mScraperResults.size() > 1))) (mSearchType == SEMIAUTOMATIC_MODE && mScraperResults.size() > 1)))
prompts.push_back(HelpPrompt("a", "accept result")); prompts.push_back(HelpPrompt("a", _("accept result")));
return prompts; return prompts;
} }

View file

@ -16,6 +16,7 @@
#include "components/ButtonComponent.h" #include "components/ButtonComponent.h"
#include "components/MenuComponent.h" #include "components/MenuComponent.h"
#include "components/TextComponent.h" #include "components/TextComponent.h"
#include "utils/LocalizationUtil.h"
GuiScraperSingle::GuiScraperSingle(ScraperSearchParams& params, GuiScraperSingle::GuiScraperSingle(ScraperSearchParams& params,
std::function<void(const ScraperSearchResult&)> doneFunc, std::function<void(const ScraperSearchResult&)> doneFunc,
@ -84,17 +85,18 @@ GuiScraperSingle::GuiScraperSingle(ScraperSearchParams& params,
// Buttons // Buttons
std::vector<std::shared_ptr<ButtonComponent>> buttons; std::vector<std::shared_ptr<ButtonComponent>> buttons;
buttons.push_back(std::make_shared<ButtonComponent>("REFINE SEARCH", "refine search", [&] { buttons.push_back(
// Refine the search, unless the result has already been accepted. std::make_shared<ButtonComponent>(_("REFINE SEARCH"), _("refine search"), [&] {
if (!mSearch->getAcceptedResult()) { // Refine the search, unless the result has already been accepted.
// Copy any search refine that may have been previously entered by opening if (!mSearch->getAcceptedResult()) {
// the input screen using the "Y" button shortcut. // Copy any search refine that may have been previously entered by opening
mSearchParams.nameOverride = mSearch->getNameOverride(); // the input screen using the "Y" button shortcut.
mSearch->openInputScreen(mSearchParams); mSearchParams.nameOverride = mSearch->getNameOverride();
mGrid.resetCursor(); mSearch->openInputScreen(mSearchParams);
} mGrid.resetCursor();
})); }
buttons.push_back(std::make_shared<ButtonComponent>("CANCEL", "cancel", [&] { }));
buttons.push_back(std::make_shared<ButtonComponent>(_("CANCEL"), _("cancel"), [&] {
if (mSearch->getSavedNewMedia()) { if (mSearch->getSavedNewMedia()) {
// If the user aborted the scraping but there was still some media downloaded, // If the user aborted the scraping but there was still some media downloaded,
// then flag to GuiMetaDataEd that the image and marquee textures need to be // then flag to GuiMetaDataEd that the image and marquee textures need to be
@ -194,7 +196,7 @@ void GuiScraperSingle::update(int deltaTime)
std::vector<HelpPrompt> GuiScraperSingle::getHelpPrompts() std::vector<HelpPrompt> GuiScraperSingle::getHelpPrompts()
{ {
std::vector<HelpPrompt> prompts {mGrid.getHelpPrompts()}; std::vector<HelpPrompt> prompts {mGrid.getHelpPrompts()};
prompts.push_back(HelpPrompt("b", "back (cancel)")); prompts.push_back(HelpPrompt("b", _("back (cancel)")));
return prompts; return prompts;
} }

View file

@ -10,13 +10,14 @@
#include "components/AnimatedImageComponent.h" #include "components/AnimatedImageComponent.h"
#include "components/ImageComponent.h" #include "components/ImageComponent.h"
#include "utils/LocalizationUtil.h"
BusyComponent::BusyComponent() BusyComponent::BusyComponent()
: mBackground {":/graphics/frame.png"} : mBackground {":/graphics/frame.png"}
, mGrid {glm::ivec2 {5, 3}} , mGrid {glm::ivec2 {5, 3}}
{ {
mAnimation = std::make_shared<AnimatedImageComponent>(); mAnimation = std::make_shared<AnimatedImageComponent>();
mText = std::make_shared<TextComponent>("WORKING...", Font::get(FONT_SIZE_MEDIUM), mText = std::make_shared<TextComponent>(_("WORKING..."), Font::get(FONT_SIZE_MEDIUM),
mMenuColorPrimary); mMenuColorPrimary);
// Col 0 = animation, col 1 = spacer, col 2 = text. // Col 0 = animation, col 1 = spacer, col 2 = text.