diff --git a/src/core/fullscreen_ui.cpp b/src/core/fullscreen_ui.cpp index 8aa5c806d..bf2f96a33 100644 --- a/src/core/fullscreen_ui.cpp +++ b/src/core/fullscreen_ui.cpp @@ -41,7 +41,6 @@ #include "IconsEmoji.h" #include "IconsFontAwesome6.h" #include "IconsPromptFont.h" -#include "fmt/chrono.h" #include "imgui.h" #include "imgui_internal.h" @@ -249,6 +248,7 @@ static GPUTexture* GetUserThemeableTexture( const ImVec2& svg_size = LayoutScale(LAYOUT_HORIZONTAL_MENU_ITEM_IMAGE_SIZE, LAYOUT_HORIZONTAL_MENU_ITEM_IMAGE_SIZE)); static bool UserThemeableHorizontalButton(const std::string_view png_name, const std::string_view svg_name, std::string_view title, std::string_view description); +static void UpdateCurrentTimeString(); ////////////////////////////////////////////////////////////////////////// // Landing @@ -536,6 +536,10 @@ struct ALIGN_TO_CACHE_LINE UIState float transition_total_time = 0.0f; float transition_remaining_time = 0.0f; + // Pause Menu + std::time_t current_time = 0; + std::string current_time_string; + // Settings float settings_last_bg_alpha = 1.0f; SettingsPage settings_page = SettingsPage::Interface; @@ -1186,6 +1190,8 @@ void FullscreenUI::Shutdown(bool clear_state) s_state.fullscreen_mode_list_cache = {}; s_state.graphics_adapter_list_cache = {}; s_state.hotkey_list_cache = {}; + s_state.current_time_string = {}; + s_state.current_time = 0; } DestroyResources(); @@ -1400,6 +1406,17 @@ bool FullscreenUI::UserThemeableHorizontalButton(const std::string_view png_name is_colorable ? ImGui::GetColorU32(ImGuiCol_Text) : IM_COL32(255, 255, 255, 255)); } +void FullscreenUI::UpdateCurrentTimeString() +{ + const std::time_t current_time = std::time(nullptr); + if (s_state.current_time == current_time) + return; + + s_state.current_time = current_time; + s_state.current_time_string = {}; + s_state.current_time_string = Host::FormatNumber(Host::NumberFormatType::ShortTime, static_cast(current_time)); +} + ////////////////////////////////////////////////////////////////////////// // Utility ////////////////////////////////////////////////////////////////////////// @@ -2085,14 +2102,15 @@ void FullscreenUI::DrawLandingTemplate(ImVec2* menu_pos, ImVec2* menu_size) // draw time ImVec2 time_pos; { - heading_str.format(FSUI_FSTR("{:%H:%M}"), fmt::localtime(std::time(nullptr))); + UpdateCurrentTimeString(); - const ImVec2 time_size = - heading_font->CalcTextSizeA(heading_font_size, heading_font_weight, FLT_MAX, 0.0f, "00:00"); + const ImVec2 time_size = heading_font->CalcTextSizeA(heading_font_size, heading_font_weight, FLT_MAX, 0.0f, + IMSTR_START_END(s_state.current_time_string)); time_pos = ImVec2(heading_size.x - LayoutScale(LAYOUT_MENU_BUTTON_X_PADDING) - time_size.x, LayoutScale(LAYOUT_MENU_BUTTON_Y_PADDING)); ImGuiFullscreen::RenderShadowedTextClipped(heading_font, heading_font_size, heading_font_weight, time_pos, - time_pos + time_size, text_color, heading_str, &time_size); + time_pos + time_size, text_color, s_state.current_time_string, + &time_size); } // draw achievements info @@ -6439,11 +6457,9 @@ void FullscreenUI::DrawAchievementsSettingsPage(std::unique_lock& se if (bsi->ContainsValue("Cheevos", "Token")) { - TinyString ts_string; - ts_string.format( - FSUI_FSTR("{:%Y-%m-%d %H:%M:%S}"), - fmt::localtime( - StringUtil::FromChars(bsi->GetTinyStringValue("Cheevos", "LoginTimestamp", "0")).value_or(0))); + const std::string ts_string = Host::FormatNumber( + Host::NumberFormatType::LongDateTime, + StringUtil::FromChars(bsi->GetTinyStringValue("Cheevos", "LoginTimestamp", "0")).value_or(0)); MenuButtonWithoutSummary( SmallString::from_format(fmt::runtime(FSUI_ICONVSTR(ICON_FA_CLOCK, "Login token generated on {}")), ts_string), false); @@ -6994,13 +7010,13 @@ void FullscreenUI::DrawPauseMenu() display_size, text_color, buffer); // current time / play time - buffer.format("{:%X}", fmt::localtime(std::time(nullptr))); + UpdateCurrentTimeString(); ImVec2 text_size = UIStyle.Font->CalcTextSizeA(UIStyle.LargeFontSize, UIStyle.BoldFontWeight, std::numeric_limits::max(), -1.0f, IMSTR_START_END(buffer)); text_pos = ImVec2(display_size.x - scaled_top_bar_padding - text_size.x, scaled_top_bar_padding); RenderShadowedTextClipped(dl, UIStyle.Font, UIStyle.LargeFontSize, UIStyle.BoldFontWeight, text_pos, display_size, - title_text_color, buffer); + title_text_color, s_state.current_time_string); text_pos.y += UIStyle.LargeFontSize + scaled_text_spacing; if (!game_serial.empty()) @@ -7224,7 +7240,8 @@ bool FullscreenUI::InitializeSaveStateListEntryFromPath(SaveStateListEntry* li, li->title = (slot > 0) ? fmt::format(FSUI_FSTR("Game Slot {0}##game_slot_{0}"), slot) : FSUI_STR("Game Quick Save"); } - li->summary = fmt::format(FSUI_FSTR("Saved {:%c}"), fmt::localtime(ssi->timestamp)); + li->summary = fmt::format( + FSUI_FSTR("Saved {}"), Host::FormatNumber(Host::NumberFormatType::ShortDateTime, static_cast(ssi->timestamp))); li->timestamp = ssi->timestamp; li->slot = slot; li->state_path = std::move(path); @@ -7643,8 +7660,8 @@ void FullscreenUI::DrawResumeStateSelector() SaveStateListEntry& entry = s_state.save_state_selector_slots.front(); SmallString sick; - sick.format(FSUI_FSTR("Do you want to continue from the automatic save created at {:%c}?"), - fmt::localtime(entry.timestamp)); + sick.format(FSUI_FSTR("Do you want to continue from the automatic save created at {}?"), + Host::FormatNumber(Host::NumberFormatType::LongDateTime, static_cast(entry.timestamp))); ImGui::PushFont(nullptr, 0.0f, UIStyle.BoldFontWeight); ImGuiFullscreen::TextAlignedMultiLine(0.5f, IMSTR_START_END(sick)); ImGui::PopFont(); @@ -9566,7 +9583,7 @@ TRANSLATE_NOOP("FullscreenUI", "Displays only the game title in the list, instea TRANSLATE_NOOP("FullscreenUI", "Displays popup messages on events such as achievement unlocks and leaderboard submissions."); TRANSLATE_NOOP("FullscreenUI", "Displays popup messages when starting, submitting, or failing a leaderboard challenge."); TRANSLATE_NOOP("FullscreenUI", "Dithering"); -TRANSLATE_NOOP("FullscreenUI", "Do you want to continue from the automatic save created at {:%c}?"); +TRANSLATE_NOOP("FullscreenUI", "Do you want to continue from the automatic save created at {}?"); TRANSLATE_NOOP("FullscreenUI", "Double-Click Toggles Fullscreen"); TRANSLATE_NOOP("FullscreenUI", "Download Covers"); TRANSLATE_NOOP("FullscreenUI", "Downloads covers from a user-specified URL template."); @@ -9901,7 +9918,7 @@ TRANSLATE_NOOP("FullscreenUI", "Save State"); TRANSLATE_NOOP("FullscreenUI", "Save State Compression"); TRANSLATE_NOOP("FullscreenUI", "Save State On Shutdown"); TRANSLATE_NOOP("FullscreenUI", "Save as Serial File Names"); -TRANSLATE_NOOP("FullscreenUI", "Saved {:%c}"); +TRANSLATE_NOOP("FullscreenUI", "Saved {}"); TRANSLATE_NOOP("FullscreenUI", "Saves state periodically so you can rewind any mistakes while playing."); TRANSLATE_NOOP("FullscreenUI", "Scaled Interlacing"); TRANSLATE_NOOP("FullscreenUI", "Scales line skipping in interlaced rendering to the internal resolution, making it less noticeable. Usually safe to enable."); @@ -10108,8 +10125,6 @@ TRANSLATE_NOOP("FullscreenUI", "\"PlayStation\" and \"PSX\" are registered trade TRANSLATE_NOOP("FullscreenUI", "change disc"); TRANSLATE_NOOP("FullscreenUI", "reset"); TRANSLATE_NOOP("FullscreenUI", "shut down"); -TRANSLATE_NOOP("FullscreenUI", "{:%H:%M}"); -TRANSLATE_NOOP("FullscreenUI", "{:%Y-%m-%d %H:%M:%S}"); TRANSLATE_NOOP("FullscreenUI", "{} Frames"); TRANSLATE_NOOP("FullscreenUI", "{} deleted."); TRANSLATE_NOOP("FullscreenUI", "{} does not exist."); diff --git a/src/duckstation-qt/translations/duckstation-qt_de.ts b/src/duckstation-qt/translations/duckstation-qt_de.ts index a959f302f..4002b9c47 100644 --- a/src/duckstation-qt/translations/duckstation-qt_de.ts +++ b/src/duckstation-qt/translations/duckstation-qt_de.ts @@ -8067,7 +8067,7 @@ Error was: - Saved {:%c} + Saved {} diff --git a/src/duckstation-qt/translations/duckstation-qt_es-ES.ts b/src/duckstation-qt/translations/duckstation-qt_es-ES.ts index c56871233..f93db997e 100644 --- a/src/duckstation-qt/translations/duckstation-qt_es-ES.ts +++ b/src/duckstation-qt/translations/duckstation-qt_es-ES.ts @@ -6879,8 +6879,8 @@ Se eliminarán todas las asignaciones y configuraciones. Esta acción no puede d - Do you want to continue from the automatic save created at {:%c}? - ¿Deseas retomar el guardado automático creado el: {:%c}? + Do you want to continue from the automatic save created at {}? + ¿Deseas retomar el guardado automático creado el: {}? @@ -9175,8 +9175,8 @@ Comprueba tu nombre de usuario y contraseña y vuelve a intentarlo. - Saved {:%c} - Archivo guardado: {:%c} + Saved {} + Archivo guardado: {} diff --git a/src/duckstation-qt/translations/duckstation-qt_es.ts b/src/duckstation-qt/translations/duckstation-qt_es.ts index 2c84ba3bf..62590f625 100755 --- a/src/duckstation-qt/translations/duckstation-qt_es.ts +++ b/src/duckstation-qt/translations/duckstation-qt_es.ts @@ -9162,8 +9162,8 @@ Comprueba el nombre de usuario y contraseña e intenta de nuevo. - Saved {:%c} - Guardado {:%c} + Saved {} + Guardado {} diff --git a/src/duckstation-qt/translations/duckstation-qt_fr.ts b/src/duckstation-qt/translations/duckstation-qt_fr.ts index f7348f797..b1a64b920 100644 --- a/src/duckstation-qt/translations/duckstation-qt_fr.ts +++ b/src/duckstation-qt/translations/duckstation-qt_fr.ts @@ -8094,7 +8094,7 @@ Error was: - Saved {:%c} + Saved {} diff --git a/src/duckstation-qt/translations/duckstation-qt_he.ts b/src/duckstation-qt/translations/duckstation-qt_he.ts index be1df4920..6473bee70 100644 --- a/src/duckstation-qt/translations/duckstation-qt_he.ts +++ b/src/duckstation-qt/translations/duckstation-qt_he.ts @@ -8059,7 +8059,7 @@ Error was: - Saved {:%c} + Saved {} diff --git a/src/duckstation-qt/translations/duckstation-qt_id.ts b/src/duckstation-qt/translations/duckstation-qt_id.ts index dcff3da5d..b9d71f5b2 100644 --- a/src/duckstation-qt/translations/duckstation-qt_id.ts +++ b/src/duckstation-qt/translations/duckstation-qt_id.ts @@ -7220,7 +7220,7 @@ Please check your username and password, and try again. - Saved {:%c} + Saved {} diff --git a/src/duckstation-qt/translations/duckstation-qt_it.ts b/src/duckstation-qt/translations/duckstation-qt_it.ts index 560a5e365..2771a10f5 100644 --- a/src/duckstation-qt/translations/duckstation-qt_it.ts +++ b/src/duckstation-qt/translations/duckstation-qt_it.ts @@ -8615,8 +8615,8 @@ L'errore è: - Saved {:%c} - Salvato {:%c} + Saved {} + Salvato {} Saves screenshots at internal render resolution and without postprocessing. diff --git a/src/duckstation-qt/translations/duckstation-qt_ja.ts b/src/duckstation-qt/translations/duckstation-qt_ja.ts index 26cb9efd9..dc00d1777 100644 --- a/src/duckstation-qt/translations/duckstation-qt_ja.ts +++ b/src/duckstation-qt/translations/duckstation-qt_ja.ts @@ -9041,7 +9041,7 @@ Error was: - Saved {:%c} + Saved {} diff --git a/src/duckstation-qt/translations/duckstation-qt_ko.ts b/src/duckstation-qt/translations/duckstation-qt_ko.ts index 9d984f52e..b658091f2 100644 --- a/src/duckstation-qt/translations/duckstation-qt_ko.ts +++ b/src/duckstation-qt/translations/duckstation-qt_ko.ts @@ -8298,8 +8298,8 @@ Please check your username and password, and try again. - Do you want to continue from the automatic save created at {:%c}? - {:%c}에 생성된 자동 저장을 계속 진행하시겠습니까? + Do you want to continue from the automatic save created at {}? + {}에 생성된 자동 저장을 계속 진행하시겠습니까? @@ -9485,8 +9485,8 @@ Please check your username and password, and try again. - Saved {:%c} - {:%c} 저장 + Saved {} + {} 저장 diff --git a/src/duckstation-qt/translations/duckstation-qt_nl.ts b/src/duckstation-qt/translations/duckstation-qt_nl.ts index fcf786f16..877b32fc5 100644 --- a/src/duckstation-qt/translations/duckstation-qt_nl.ts +++ b/src/duckstation-qt/translations/duckstation-qt_nl.ts @@ -8066,7 +8066,7 @@ Error was: - Saved {:%c} + Saved {} diff --git a/src/duckstation-qt/translations/duckstation-qt_pl.ts b/src/duckstation-qt/translations/duckstation-qt_pl.ts index 39f9759c7..2fae20af3 100644 --- a/src/duckstation-qt/translations/duckstation-qt_pl.ts +++ b/src/duckstation-qt/translations/duckstation-qt_pl.ts @@ -7811,8 +7811,8 @@ Spowodowany błąd: - Saved {:%c} - Zapisano {:%c} + Saved {} + Zapisano {} diff --git a/src/duckstation-qt/translations/duckstation-qt_pt-BR.ts b/src/duckstation-qt/translations/duckstation-qt_pt-BR.ts index bc41b0843..ab635717d 100644 --- a/src/duckstation-qt/translations/duckstation-qt_pt-BR.ts +++ b/src/duckstation-qt/translations/duckstation-qt_pt-BR.ts @@ -8641,8 +8641,8 @@ Por favor verifique seu nome de usuário e senha, e tente novamente. - Do you want to continue from the automatic save created at {:%c}? - Deseja continuar a partir do salvamento automático criado em {:%c}? + Do you want to continue from the automatic save created at {}? + Deseja continuar a partir do salvamento automático criado em {}? @@ -9982,8 +9982,8 @@ Por favor verifique seu nome de usuário e senha, e tente novamente. - Saved {:%c} - Salvo {:%c} + Saved {} + Salvo {} diff --git a/src/duckstation-qt/translations/duckstation-qt_pt-PT.ts b/src/duckstation-qt/translations/duckstation-qt_pt-PT.ts index 80ab97a89..d3e914ab3 100644 --- a/src/duckstation-qt/translations/duckstation-qt_pt-PT.ts +++ b/src/duckstation-qt/translations/duckstation-qt_pt-PT.ts @@ -8065,7 +8065,7 @@ Error was: - Saved {:%c} + Saved {} diff --git a/src/duckstation-qt/translations/duckstation-qt_ru.ts b/src/duckstation-qt/translations/duckstation-qt_ru.ts index 29b5e0862..603597eb3 100644 --- a/src/duckstation-qt/translations/duckstation-qt_ru.ts +++ b/src/duckstation-qt/translations/duckstation-qt_ru.ts @@ -6924,8 +6924,8 @@ You cannot undo this action. - Do you want to continue from the automatic save created at {:%c}? - Хотите ли вы продолжить с автоматического сохранения, созданного в {:%c}? + Do you want to continue from the automatic save created at {}? + Хотите ли вы продолжить с автоматического сохранения, созданного в {}? @@ -9231,8 +9231,8 @@ Please check your username and password, and try again. - Saved {:%c} - Сохранен {:%c} + Saved {} + Сохранен {} diff --git a/src/duckstation-qt/translations/duckstation-qt_sv.ts b/src/duckstation-qt/translations/duckstation-qt_sv.ts index cbddc32b6..700322052 100644 --- a/src/duckstation-qt/translations/duckstation-qt_sv.ts +++ b/src/duckstation-qt/translations/duckstation-qt_sv.ts @@ -6803,8 +6803,8 @@ Kontrollera ditt användarnamn och lösenord. Försök igen. Spara tillstånd vid avslut - Saved {:%c} - Sparat {:%c} + Saved {} + Sparat {} Saves state periodically so you can rewind any mistakes while playing. @@ -7719,8 +7719,8 @@ Du kan inte ångra den här åtgärden. Standardvärde - Do you want to continue from the automatic save created at {:%c}? - Vill du fortsätta från den automatiska sparning som skapades vid {:%c}? + Do you want to continue from the automatic save created at {}? + Vill du fortsätta från den automatiska sparning som skapades vid {}? Enable Achievements to see your user summary. diff --git a/src/duckstation-qt/translations/duckstation-qt_tr.ts b/src/duckstation-qt/translations/duckstation-qt_tr.ts index 671a770e6..325724970 100644 --- a/src/duckstation-qt/translations/duckstation-qt_tr.ts +++ b/src/duckstation-qt/translations/duckstation-qt_tr.ts @@ -9641,8 +9641,8 @@ Hata: {} - Saved {:%c} - Kaydedildi {:%c} + Saved {} + Kaydedildi {} diff --git a/src/duckstation-qt/translations/duckstation-qt_zh-CN.ts b/src/duckstation-qt/translations/duckstation-qt_zh-CN.ts index 9e8d2db89..99479bc66 100644 --- a/src/duckstation-qt/translations/duckstation-qt_zh-CN.ts +++ b/src/duckstation-qt/translations/duckstation-qt_zh-CN.ts @@ -7218,8 +7218,8 @@ You cannot undo this action. - Do you want to continue from the automatic save created at {:%c}? - 您想要从创建于{:%c}的自动保存中继续吗? + Do you want to continue from the automatic save created at {}? + 您想要从创建于{}的自动保存中继续吗? @@ -8556,8 +8556,8 @@ Error was: - Saved {:%c} - 保存{:%c} + Saved {} + 保存{}