diff --git a/dep/imgui/include/IconsEmoji.h b/dep/imgui/include/IconsEmoji.h index 097bbf1b1..349783afb 100644 --- a/dep/imgui/include/IconsEmoji.h +++ b/dep/imgui/include/IconsEmoji.h @@ -48,3 +48,6 @@ #define ICON_EMOJI_NOTEBOOK "\xf0\x9f\x93\x99" #define ICON_EMOJI_GEAR "\xe2\x9a\x99" #define ICON_EMOJI_NO_ENTRY_SIGN "\xe2\x9b\x94" +#define ICON_EMOJI_BAR_CHART "\xf0\x9f\x93\x8a" +#define ICON_EMOJI_CHART_UPWARDS_TREND "\xf0\x9f\x93\x88" +#define ICON_EMOJI_DIRECT_HIT "\xf0\x9f\x8e\xaf" diff --git a/src/core/achievements.cpp b/src/core/achievements.cpp index dfc114b94..9816c052a 100644 --- a/src/core/achievements.cpp +++ b/src/core/achievements.cpp @@ -74,6 +74,7 @@ static constexpr const char* UNLOCK_SOUND_NAME = "sounds/achievements/unlock.wav static constexpr const char* LBSUBMIT_SOUND_NAME = "sounds/achievements/lbsubmit.wav"; static constexpr const char* CACHE_SUBDIRECTORY_NAME = "achievement_images"; constexpr const char* const RA_LOGO_ICON_NAME = "images/ra-icon.webp"; +constexpr const std::string_view NOTIFICATION_SPINNER_NOTE = "__spinner__"; static constexpr float LOGIN_NOTIFICATION_TIME = 5.0f; static constexpr float ACHIEVEMENT_SUMMARY_NOTIFICATION_TIME = 5.0f; @@ -84,6 +85,7 @@ static constexpr float CHALLENGE_STARTED_NOTIFICATION_TIME = 5.0f; static constexpr float CHALLENGE_FAILED_NOTIFICATION_TIME = 5.0f; static constexpr float LEADERBOARD_STARTED_NOTIFICATION_TIME = 3.0f; static constexpr float LEADERBOARD_FAILED_NOTIFICATION_TIME = 3.0f; +static constexpr float LEADERBOARD_NOTIFICATION_MIN_WIDTH = 380.0f; // Some API calls are really slow. Set a longer timeout. static constexpr float SERVER_CALL_TIMEOUT = 60.0f; @@ -1444,23 +1446,26 @@ void Achievements::HandleLeaderboardSubmittedEvent(const rc_client_event_t* even if (g_settings.achievements_leaderboard_notifications) { - static const char* value_strings[NUM_RC_CLIENT_LEADERBOARD_FORMATS] = { - TRANSLATE_NOOP("Achievements", "Your Time: {}{}"), - TRANSLATE_NOOP("Achievements", "Your Score: {}{}"), - TRANSLATE_NOOP("Achievements", "Your Value: {}{}"), + static const char* value_strings[NUM_RC_CLIENT_LEADERBOARD_FORMATS][2] = { + {ICON_EMOJI_CLOCK_FIVE_OCLOCK, TRANSLATE_NOOP("Achievements", "Your Time: {}")}, + {ICON_EMOJI_DIRECT_HIT, TRANSLATE_NOOP("Achievements", "Your Score: {}")}, + {ICON_EMOJI_CLIPBOARD, TRANSLATE_NOOP("Achievements", "Your Value: {}")}, }; std::string message = fmt::format( - fmt::runtime(Host::TranslateToStringView( - "Achievements", - value_strings[std::min(event->leaderboard->format, NUM_RC_CLIENT_LEADERBOARD_FORMATS - 1)])), - event->leaderboard->tracker_value ? event->leaderboard->tracker_value : "Unknown", - g_settings.achievements_spectator_mode ? std::string_view() : TRANSLATE_SV("Achievements", " (Submitting)")); + "{} {}", value_strings[std::min(event->leaderboard->format, NUM_RC_CLIENT_LEADERBOARD_FORMATS - 1)][0], + TinyString::from_format( + fmt::runtime(Host::TranslateToStringView( + "Achievements", + value_strings[std::min(event->leaderboard->format, NUM_RC_CLIENT_LEADERBOARD_FORMATS - 1)][1])), + event->leaderboard->tracker_value ? event->leaderboard->tracker_value : "Unknown")); - FullscreenUI::AddAchievementNotification(fmt::format("leaderboard_{}", event->leaderboard->id), - static_cast(g_settings.achievements_leaderboard_duration), - s_state.game_icon, std::string(event->leaderboard->title), - std::move(message), {}); + FullscreenUI::AddAchievementNotification( + fmt::format("leaderboard_{}", event->leaderboard->id), + static_cast(g_settings.achievements_leaderboard_duration), s_state.game_icon, + std::string(event->leaderboard->title), std::move(message), + std::string(g_settings.achievements_spectator_mode ? std::string_view() : NOTIFICATION_SPINNER_NOTE), + LEADERBOARD_NOTIFICATION_MIN_WIDTH); } if (g_settings.achievements_sound_effects) @@ -1474,24 +1479,28 @@ void Achievements::HandleLeaderboardScoreboardEvent(const rc_client_event_t* eve if (g_settings.achievements_leaderboard_notifications) { - static const char* value_strings[NUM_RC_CLIENT_LEADERBOARD_FORMATS] = { - TRANSLATE_NOOP("Achievements", "Your Time: {} (Best: {})"), - TRANSLATE_NOOP("Achievements", "Your Score: {} (Best: {})"), - TRANSLATE_NOOP("Achievements", "Your Value: {} (Best: {})"), + static const char* value_strings[NUM_RC_CLIENT_LEADERBOARD_FORMATS][2] = { + {ICON_EMOJI_CLOCK_FIVE_OCLOCK, TRANSLATE_NOOP("Achievements", "Your Time: {0} (Best: {1})")}, + {ICON_EMOJI_DIRECT_HIT, TRANSLATE_NOOP("Achievements", "Your Score: {0} (Best: {1})")}, + {ICON_EMOJI_CLIPBOARD, TRANSLATE_NOOP("Achievements", "Your Value: {0} (Best: {1})")}, }; - std::string title = event->leaderboard->title; std::string message = fmt::format( - TRANSLATE_FS("Achievements", "{}\nLeaderboard Position: {} of {}"), - fmt::format(fmt::runtime(Host::TranslateToStringView( - "Achievements", - value_strings[std::min(event->leaderboard->format, NUM_RC_CLIENT_LEADERBOARD_FORMATS - 1)])), - event->leaderboard_scoreboard->submitted_score, event->leaderboard_scoreboard->best_score), - event->leaderboard_scoreboard->new_rank, event->leaderboard_scoreboard->num_entries); + "{} {}\n" ICON_EMOJI_BAR_CHART " {}", + value_strings[std::min(event->leaderboard->format, NUM_RC_CLIENT_LEADERBOARD_FORMATS - 1)][0], + TinyString::from_format( + fmt::runtime(Host::TranslateToStringView( + "Achievements", + value_strings[std::min(event->leaderboard->format, NUM_RC_CLIENT_LEADERBOARD_FORMATS - 1)][1])), + event->leaderboard_scoreboard->submitted_score, event->leaderboard_scoreboard->best_score), + TinyString::from_format(TRANSLATE_FS("Achievements", "Your Position: {0} of {1}"), + event->leaderboard_scoreboard->new_rank, event->leaderboard_scoreboard->num_entries)); FullscreenUI::AddAchievementNotification(fmt::format("leaderboard_{}", event->leaderboard->id), static_cast(g_settings.achievements_leaderboard_duration), - s_state.game_icon, std::move(title), std::move(message), {}); + s_state.game_icon, std::string(event->leaderboard->title), + std::move(message), ICON_EMOJI_CHART_UPWARDS_TREND, + LEADERBOARD_NOTIFICATION_MIN_WIDTH); } } diff --git a/src/core/achievements_private.h b/src/core/achievements_private.h index d74c1a52a..4790325f7 100644 --- a/src/core/achievements_private.h +++ b/src/core/achievements_private.h @@ -9,12 +9,14 @@ #include #include +#include #include namespace Achievements { -static constexpr float INDICATOR_FADE_IN_TIME = 0.2f; -static constexpr float INDICATOR_FADE_OUT_TIME = 0.4f; +inline constexpr float INDICATOR_FADE_IN_TIME = 0.2f; +inline constexpr float INDICATOR_FADE_OUT_TIME = 0.4f; +extern const std::string_view NOTIFICATION_SPINNER_NOTE; struct LeaderboardTrackerIndicator { diff --git a/src/core/fullscreenui_achievements.cpp b/src/core/fullscreenui_achievements.cpp index 5e8b6e873..93dd66008 100644 --- a/src/core/fullscreenui_achievements.cpp +++ b/src/core/fullscreenui_achievements.cpp @@ -59,6 +59,7 @@ struct Notification float duration; float target_y; float last_y; + float min_width; }; struct PauseMenuAchievementInfo @@ -226,7 +227,7 @@ void FullscreenUI::DrawAchievementsOverlays() } void FullscreenUI::AddAchievementNotification(std::string key, float duration, std::string image_path, - std::string title, std::string text, std::string note) + std::string title, std::string text, std::string note, float min_width) { const bool prev_had_notifications = s_achievements_locals.notifications.empty(); const Timer::Value current_time = Timer::GetCurrentValue(); @@ -242,6 +243,7 @@ void FullscreenUI::AddAchievementNotification(std::string key, float duration, s it->text = std::move(text); it->note = std::move(note); it->badge_path = std::move(image_path); + it->min_width = min_width; // Don't fade it in again const float time_passed = static_cast(Timer::ConvertValueToSeconds(current_time - it->start_time)); @@ -263,6 +265,7 @@ void FullscreenUI::AddAchievementNotification(std::string key, float duration, s notif.move_time = current_time; notif.target_y = -1.0f; notif.last_y = -1.0f; + notif.min_width = min_width; s_achievements_locals.notifications.push_back(std::move(notif)); if (!prev_had_notifications) @@ -288,6 +291,7 @@ void FullscreenUI::DrawNotifications(NotificationLayout& layout) const float max_text_width = max_width - badge_size - (horizontal_padding * 2.0f) - horizontal_spacing; const float min_height = (vertical_padding * 2.0f) + badge_size; const float rounding = FullscreenUI::LayoutScale(20.0f); + const float spinner_size = FullscreenUI::LayoutScale(16.0f); const float min_rounded_width = rounding * 2.0f; ImFont*& font = UIStyle.Font; @@ -295,8 +299,9 @@ void FullscreenUI::DrawNotifications(NotificationLayout& layout) const float& title_font_weight = UIStyle.BoldFontWeight; const float& text_font_size = UIStyle.MediumFontSize; const float& text_font_weight = UIStyle.NormalFontWeight; - const float& note_font_size = UIStyle.MediumFontSize; - const float& note_font_weight = UIStyle.BoldFontWeight; + const float& note_text_size = UIStyle.MediumFontSize; + const float& note_text_weight = UIStyle.BoldFontWeight; + const float& note_icon_size = UIStyle.LargeFontSize; const ImVec4 left_background_color = DarkerColor(UIStyle.ToastBackgroundColor, 1.3f); const ImVec4 right_background_color = DarkerColor(UIStyle.ToastBackgroundColor, 0.8f); @@ -313,9 +318,16 @@ void FullscreenUI::DrawNotifications(NotificationLayout& layout) } // place note to the right of the title - const ImVec2 note_size = notif.note.empty() ? ImVec2() : - font->CalcTextSizeA(note_font_size, note_font_weight, FLT_MAX, 0.0f, - IMSTR_START_END(notif.note)); + const bool is_spinner = (notif.note == Achievements::NOTIFICATION_SPINNER_NOTE); + const bool is_icon_note = + (!is_spinner && !notif.note.empty() && (StringUtil::GetUTF8CharacterCount(notif.note) == 1)); + const float note_font_size = is_spinner ? spinner_size : (is_icon_note ? note_icon_size : note_text_size); + const float note_font_weight = is_icon_note ? UIStyle.NormalFontWeight : note_text_weight; + const ImVec2 note_size = is_spinner ? + LayoutScale(note_font_size, note_font_size) : + (notif.note.empty() ? ImVec2() : + font->CalcTextSizeA(note_font_size, note_font_weight, FLT_MAX, + 0.0f, IMSTR_START_END(notif.note))); const ImVec2 title_size = font->CalcTextSizeA(title_font_size, title_font_weight, max_text_width - note_size.x, max_text_width - note_size.x, IMSTR_START_END(notif.title)); const ImVec2 text_size = font->CalcTextSizeA(text_font_size, text_font_weight, max_text_width, max_text_width, @@ -325,7 +337,7 @@ void FullscreenUI::DrawNotifications(NotificationLayout& layout) std::max((horizontal_padding * 2.0f) + badge_size + horizontal_spacing + ImCeil(std::max(title_size.x + (notif.note.empty() ? 0.0f : (larger_horizontal_spacing + note_size.x)), text_size.x)), - min_width); + std::max(LayoutScale(notif.min_width), min_width)); const float box_height = std::max((vertical_padding * 2.0f) + ImCeil(title_size.y) + vertical_spacing + ImCeil(text_size.y), min_height); @@ -401,7 +413,27 @@ void FullscreenUI::DrawNotifications(NotificationLayout& layout) RenderShadowedTextClipped(dl, font, text_font_size, text_font_weight, text_bb.Min, text_bb.Max, text_col, notif.text, &text_size, ImVec2(0.0f, 0.0f), max_text_width, &text_bb); - if (!notif.note.empty()) + if (notif.note == Achievements::NOTIFICATION_SPINNER_NOTE) + { + // based on https://github.com/ocornut/imgui/issues/1901 + static constexpr u32 num_segments = 30; + const float radius = ImFloor(note_size.x * 0.5f); + const float thickness = LayoutScale(4.0f); + const ImVec2 pos = ImVec2((box_min.x + box_width) - horizontal_padding - note_size.x + radius, + box_min.y + vertical_padding + radius); + const float start = + std::abs(ImSin(static_cast(GImGui->Time * 1.8f)) * static_cast(num_segments - 5)); + const float a_min = IM_PI * 2.0f * start / static_cast(num_segments); + const float a_max = IM_PI * 2.0f * (static_cast(num_segments - 3) / static_cast(num_segments)); + for (u32 i = 0; i < num_segments; i++) + { + const float a = a_min + ((float)i / (float)num_segments) * (a_max - a_min); + dl->PathLineTo(ImVec2(pos.x + ImCos(static_cast(a + GImGui->Time * 8.0f)) * radius, + pos.y + ImSin(static_cast(a + GImGui->Time * 8.0f)) * radius)); + } + dl->PathStroke(title_col, false, thickness); + } + else if (!notif.note.empty()) { const ImVec2 note_pos = ImVec2((box_min.x + box_width) - horizontal_padding - note_size.x, box_min.y + vertical_padding); diff --git a/src/core/fullscreenui_private.h b/src/core/fullscreenui_private.h index 7874897df..ff1bf0393 100644 --- a/src/core/fullscreenui_private.h +++ b/src/core/fullscreenui_private.h @@ -121,7 +121,7 @@ bool IsInputBindingDialogOpen(); /// Schedules an achievement notification to be shown. void AddAchievementNotification(std::string key, float duration, std::string image_path, std::string title, - std::string text, std::string note); + std::string text, std::string note = {}, float min_width = 0.0f); /// Draws ImGui overlays when ingame. void DrawAchievementsOverlays(); diff --git a/src/duckstation-qt/translations/duckstation-qt_es-ES.ts b/src/duckstation-qt/translations/duckstation-qt_es-ES.ts index 8232d0bc5..94594f5ad 100644 --- a/src/duckstation-qt/translations/duckstation-qt_es-ES.ts +++ b/src/duckstation-qt/translations/duckstation-qt_es-ES.ts @@ -478,18 +478,18 @@ Fecha de creación del token de acceso: %2. - Your Time: {}{} - Tu tiempo: {}{} + Your Time: {} + Tu tiempo: {} - Your Score: {}{} - Tu puntuación: {}{} + Your Score: {} + Tu puntuación: {} - Your Value: {}{} - Tu valor: {}{} + Your Value: {} + Tu valor: {} @@ -498,25 +498,23 @@ Fecha de creación del token de acceso: %2. - Your Time: {} (Best: {}) - Tu tiempo: {} (Mejor: {}) + Your Time: {0} (Best: {1}) + Tu tiempo: {0} (Mejor: {1}) - Your Score: {} (Best: {}) - Tu puntuación: {} (Mejor: {}) + Your Score: {0} (Best: {1}) + Tu puntuación: {0} (Mejor: {1}) - Your Value: {} (Best: {}) - Tu valor: {} (Mejor: {}) + Your Value: {0} (Best: {1}) + Tu valor: {0} (Mejor: {1}) - {} -Leaderboard Position: {} of {} - {} -Posición en tabla: {} de {} + Leaderboard Position: {0} of {1} + Posición en tabla: {0} de {1} diff --git a/src/duckstation-qt/translations/duckstation-qt_es.ts b/src/duckstation-qt/translations/duckstation-qt_es.ts index dbc1544aa..fba905a02 100644 --- a/src/duckstation-qt/translations/duckstation-qt_es.ts +++ b/src/duckstation-qt/translations/duckstation-qt_es.ts @@ -419,18 +419,18 @@ Token de inicio de sesión generado en %2. - Your Time: {}{} - Tu tiempo: {}{} + Your Time: {} + Tu tiempo: {} - Your Score: {}{} - Tu puntuación: {}{} + Your Score: {} + Tu puntuación: {} - Your Value: {}{} - Tu valor: {}{} + Your Value: {} + Tu valor: {} @@ -439,25 +439,23 @@ Token de inicio de sesión generado en %2. - Your Time: {} (Best: {}) - Tu tiempo: {} (Mejor: {}) + Your Time: {0} (Best: {1}) + Tu tiempo: {0} (Mejor: {1}) - Your Score: {} (Best: {}) - Tu puntuación {} (Mejor: {}) + Your Score: {0} (Best: {1}) + Tu puntuación {0} (Mejor: {1}) - Your Value: {} (Best: {}) - Tu valor: {} (Mejor: {}) + Your Value: {0} (Best: {1}) + Tu valor: {0} (Mejor: {1}) - {} -Leaderboard Position: {} of {} - {} -Posición en tabla: {} de {} + Leaderboard Position: {0} of {1} + Posición en tabla: {0} de {1} diff --git a/src/duckstation-qt/translations/duckstation-qt_id.ts b/src/duckstation-qt/translations/duckstation-qt_id.ts index 485b9765f..6360b2400 100644 --- a/src/duckstation-qt/translations/duckstation-qt_id.ts +++ b/src/duckstation-qt/translations/duckstation-qt_id.ts @@ -507,13 +507,13 @@ Pesan yang belum dibaca: {} - Your Score: {}{} - Skor Anda: {} {} + Your Score: {} + Skor Anda: {} - Your Value: {}{} - Nilai Anda: {} {} + Your Value: {} + Nilai Anda: {} @@ -522,25 +522,23 @@ Pesan yang belum dibaca: {} - Your Time: {} (Best: {}) - Waktu Anda: {} (Terbaik: {}) + Your Time: {0} (Best: {1}) + Waktu Anda: {0} (Terbaik: {1}) - Your Score: {} (Best: {}) - Skor Anda: {} (Terbaik: {}) + Your Score: {0} (Best: {1}) + Skor Anda: {0} (Terbaik: {1}) - Your Value: {} (Best: {}) - Nilai Anda: {} (Terbaik: {}) + Your Value: {0} (Best: {1}) + Nilai Anda: {0} (Terbaik: {1}) - {} -Leaderboard Position: {} of {} - {} -Posisi Papan Pencapaian: {} of {} + Leaderboard Position: {0} of {1} + Posisi Papan Pencapaian: {0} of {1} diff --git a/src/duckstation-qt/translations/duckstation-qt_it.ts b/src/duckstation-qt/translations/duckstation-qt_it.ts index f1bbeed99..7ba2052a7 100644 --- a/src/duckstation-qt/translations/duckstation-qt_it.ts +++ b/src/duckstation-qt/translations/duckstation-qt_it.ts @@ -432,13 +432,13 @@ Token di accesso generato il %2. - Your Score: {}{} - Il tuo Punteggio: {}{} + Your Score: {} + Il tuo Punteggio: {} - Your Value: {}{} - Il tuo Valore: {}{} + Your Value: {} + Il tuo Valore: {} @@ -447,25 +447,23 @@ Token di accesso generato il %2. - Your Time: {} (Best: {}) - Il tuo Tempo: {} (Migliore: {}) + Your Time: {0} (Best: {1}) + Il tuo Tempo: {0} (Migliore: {1}) - Your Score: {} (Best: {}) - Il tuo Punteggio: {} (Migliore: {}) + Your Score: {0} (Best: {1}) + Il tuo Punteggio: {0} (Migliore: {1}) - Your Value: {} (Best: {}) - Il tuo Valore: {} (Migliore: {}) + Your Value: {0} (Best: {1}) + Il tuo Valore: {0} (Migliore: {1}) - {} -Leaderboard Position: {} of {} - {} -Posizione in Classifica: {} di {} + Leaderboard Position: {0} of {1} + Posizione in Classifica: {0} di {1} diff --git a/src/duckstation-qt/translations/duckstation-qt_ko.ts b/src/duckstation-qt/translations/duckstation-qt_ko.ts index 8a1f7233b..6f955db8e 100644 --- a/src/duckstation-qt/translations/duckstation-qt_ko.ts +++ b/src/duckstation-qt/translations/duckstation-qt_ko.ts @@ -497,25 +497,23 @@ Login token generated on %2. - Your Time: {} (Best: {}) - 사용 시간 : {}(최고 기록 : {}) + Your Time: {0} (Best: {1}) + 사용 시간 : {0}(최고 기록 : {1}) - Your Score: {} (Best: {}) - 현재 점수 : {}(최고 기록 : {}) + Your Score: {0} (Best: {1}) + 현재 점수 : {0}(최고 기록 : {1}) - Your Value: {} (Best: {}) - 현재 가치 : {}(최고 기록 : {}) + Your Value: {0} (Best: {1}) + 현재 가치 : {0}(최고 기록 : {1}) - {} -Leaderboard Position: {} of {} - {} -순위표 위치 : {}의 {} + Leaderboard Position: {0} of {1} + 순위표 위치 : {0}의 {1} diff --git a/src/duckstation-qt/translations/duckstation-qt_pl.ts b/src/duckstation-qt/translations/duckstation-qt_pl.ts index d7f86e240..dbd885cb4 100644 --- a/src/duckstation-qt/translations/duckstation-qt_pl.ts +++ b/src/duckstation-qt/translations/duckstation-qt_pl.ts @@ -441,18 +441,18 @@ Token logowania wygenerowany %2. - Your Time: {}{} - Twój czas: {}{} + Your Time: {} + Twój czas: {} - Your Score: {}{} - Twój wynik: {}{} + Your Score: {} + Twój wynik: {} - Your Value: {}{} - Twój wartość: {}{} + Your Value: {} + Twój wartość: {} @@ -461,25 +461,23 @@ Token logowania wygenerowany %2. - Your Time: {} (Best: {}) - Twój czas: {} (Najlepszy: {}) + Your Time: {0} (Best: {1}) + Twój czas: {0} (Najlepszy: {1}) - Your Score: {} (Best: {}) - Twój wynik: {} (Najlepszy: {}) + Your Score: {0} (Best: {1}) + Twój wynik: {0} (Najlepszy: {1}) - Your Value: {} (Best: {}) - Twój watość: {} (Najlepszy: {}) + Your Value: {0} (Best: {1}) + Twój watość: {0} (Najlepszy: {1}) - {} -Leaderboard Position: {} of {} - {} -Pozycja w tabeli wyników: {} z {} + Leaderboard Position: {0} of {1} + Pozycja w tabeli wyników: {0} z {1} diff --git a/src/duckstation-qt/translations/duckstation-qt_pt-BR.ts b/src/duckstation-qt/translations/duckstation-qt_pt-BR.ts index e9902b954..5598199eb 100644 --- a/src/duckstation-qt/translations/duckstation-qt_pt-BR.ts +++ b/src/duckstation-qt/translations/duckstation-qt_pt-BR.ts @@ -495,25 +495,23 @@ Token gerado %2. - Your Time: {} (Best: {}) - Seu tempo: {} (melhor: {}) + Your Time: {0} (Best: {1}) + Seu tempo: {0} (melhor: {1}) - Your Score: {} (Best: {}) - Sua pontuação: {} (melhor: {}) + Your Score: {0} (Best: {1}) + Sua pontuação: {0} (melhor: {1}) - Your Value: {} (Best: {}) - Sua pontuação: {} (melhor: {}) + Your Value: {0} (Best: {1}) + Sua pontuação: {0} (melhor: {1}) - {} -Leaderboard Position: {} of {} - {} -Posição na tabela de classificação: {} de {} + Leaderboard Position: {0} of {1} + Posição na tabela de classificação: {0} de {1} Server error in {}: @@ -762,18 +760,18 @@ Mensagens não lidas: {} - Your Time: {}{} - Seu tempo: {}{} + Your Time: {} + Seu tempo: {} - Your Score: {}{} - Sua pontuação: {}{} + Your Score: {} + Sua pontuação: {} - Your Value: {}{} - Sua pontuação: {}{} + Your Value: {} + Sua pontuação: {} diff --git a/src/duckstation-qt/translations/duckstation-qt_pt-PT.ts b/src/duckstation-qt/translations/duckstation-qt_pt-PT.ts index 566e57a92..515ab602e 100644 --- a/src/duckstation-qt/translations/duckstation-qt_pt-PT.ts +++ b/src/duckstation-qt/translations/duckstation-qt_pt-PT.ts @@ -430,18 +430,18 @@ Código de auteticação gerado em %2. - Your Time: {}{} - O teu tempo: {}{} + Your Time: {} + O teu tempo: {} - Your Score: {}{} - A tua pontuação: {}{} + Your Score: {} + A tua pontuação: {} - Your Value: {}{} - O teu valor: {}{} + Your Value: {} + O teu valor: {} @@ -450,25 +450,23 @@ Código de auteticação gerado em %2. - Your Time: {} (Best: {}) - O teu tempo: {} (Melhor: {}) + Your Time: {0} (Best: {1}) + O teu tempo: {0} (Melhor: {1}) - Your Score: {} (Best: {}) - A tua pontuação: {} (Melhor: {}) + Your Score: {0} (Best: {1}) + A tua pontuação: {0} (Melhor: {1}) - Your Value: {} (Best: {}) - O teu valor: {} (Melhor: {}) + Your Value: {0} (Best: {1}) + O teu valor: {0} (Melhor: {1}) - {} -Leaderboard Position: {} of {} - {} -Posição na classificação: {} de {} + Leaderboard Position: {0} of {1} + Posição na classificação: {0} de {1} diff --git a/src/duckstation-qt/translations/duckstation-qt_ru.ts b/src/duckstation-qt/translations/duckstation-qt_ru.ts index 7c651c5cb..6700bcb37 100644 --- a/src/duckstation-qt/translations/duckstation-qt_ru.ts +++ b/src/duckstation-qt/translations/duckstation-qt_ru.ts @@ -486,18 +486,18 @@ Login token generated on %2. - Your Time: {}{} - Ваше время: {}{} + Your Time: {} + Ваше время: {} - Your Score: {}{} - Ваш результат: {}{} + Your Score: {} + Ваш результат: {} - Your Value: {}{} - Ваше значение: {}{} + Your Value: {} + Ваше значение: {} @@ -506,25 +506,23 @@ Login token generated on %2. - Your Time: {} (Best: {}) - Ваше время: {} (Лучший результат: {}) + Your Time: {0} (Best: {1}) + Ваше время: {0} (Лучший результат: {1}) - Your Score: {} (Best: {}) - Ваш результат: {} (Лучший: {}) + Your Score: {0} (Best: {1}) + Ваш результат: {0} (Лучший: {1}) - Your Value: {} (Best: {}) - Ваше значение: {} (Лучший: {}) + Your Value: {0} (Best: {1}) + Ваше значение: {0} (Лучший: {1}) - {} -Leaderboard Position: {} of {} - {} -Позиция в списке лидеров: {} из {} + Leaderboard Position: {0} of {1} + Позиция в списке лидеров: {0} из {1} diff --git a/src/duckstation-qt/translations/duckstation-qt_sv.ts b/src/duckstation-qt/translations/duckstation-qt_sv.ts index 6d36ec4bb..56d31a4c6 100644 --- a/src/duckstation-qt/translations/duckstation-qt_sv.ts +++ b/src/duckstation-qt/translations/duckstation-qt_sv.ts @@ -408,30 +408,28 @@ Inloggningstoken genererades %2. Ledartavleförsök misslyckades. - Your Score: {}{} - Dina poäng: {}{} + Your Score: {} + Dina poäng: {} (Submitting) (Skickar in) - Your Time: {} (Best: {}) - Din tid: {} (Bästa: {}) + Your Time: {0} (Best: {1}) + Din tid: {0} (Bästa: {1}) - Your Score: {} (Best: {}) - Dina poäng: {} (Bästa: {}) + Your Score: {0} (Best: {1}) + Dina poäng: {0} (Bästa: {1}) - Your Value: {} (Best: {}) - Ditt värde: {} (Bästa: {}) + Your Value: {0} (Best: {1}) + Ditt värde: {0} (Bästa: {1}) - {} -Leaderboard Position: {} of {} - {} -Position på ledartavlan: {} av {} + Leaderboard Position: {0} of {1} + Position på ledartavlan: {0} av {1} Server error in {}: diff --git a/src/duckstation-qt/translations/duckstation-qt_tr.ts b/src/duckstation-qt/translations/duckstation-qt_tr.ts index f3990e3f9..0d5746712 100644 --- a/src/duckstation-qt/translations/duckstation-qt_tr.ts +++ b/src/duckstation-qt/translations/duckstation-qt_tr.ts @@ -429,18 +429,18 @@ Tek kullanımlık giriş kodu (access token) oluşturulma tarihi: %2. - Your Time: {}{} - Süren: {}{} + Your Time: {} + Süren: {} - Your Score: {}{} - Skorun: {}{} + Your Score: {} + Skorun: {} - Your Value: {}{} - Puanın: {}{} + Your Value: {} + Puanın: {}} @@ -449,25 +449,23 @@ Tek kullanımlık giriş kodu (access token) oluşturulma tarihi: %2. - Your Time: {} (Best: {}) - Süren: {} (Rekorun: {}) + Your Time: {0} (Best: {1}) + Süren: {0} (Rekorun: {1}) - Your Score: {} (Best: {}) - Skorun: {} (Rekorun: {}) + Your Score: {0} (Best: {1}) + Skorun: {0} (Rekorun: {1}) - Your Value: {} (Best: {}) - Puanın: {} (Rekorun: {}) + Your Value: {0} (Best: {1}) + Puanın: {0} (Rekorun: {1}) - {} -Leaderboard Position: {} of {} - {} -Lider Tahtasındaki Yer : {} inci {} + Leaderboard Position: {0} of {1} + Lider Tahtasındaki Yer : {0} inci {1} diff --git a/src/duckstation-qt/translations/duckstation-qt_zh-CN.ts b/src/duckstation-qt/translations/duckstation-qt_zh-CN.ts index a0f0b5eb5..c8fb4be5f 100644 --- a/src/duckstation-qt/translations/duckstation-qt_zh-CN.ts +++ b/src/duckstation-qt/translations/duckstation-qt_zh-CN.ts @@ -527,13 +527,13 @@ Login token generated at: - Your Score: {}{} - 您的得分: {}{} + Your Score: {} + 您的得分: {} - Your Value: {}{} - 您的值: {}{} + Your Value: {} + 您的值: {} @@ -542,25 +542,23 @@ Login token generated at: - Your Time: {} (Best: {}) - 您的时间: {} (最佳: {}) + Your Time: {0} (Best: {1}) + 您的时间: {0} (最佳: {1}) - Your Score: {} (Best: {}) - 您的得分: {} (最佳: {}) + Your Score: {0} (Best: {1}) + 您的得分: {0} (最佳: {1}) - Your Value: {} (Best: {}) - 您的值: {} (最佳: {}) + Your Value: {0} (Best: {1}) + 您的值: {0} (最佳: {1}) - {} -Leaderboard Position: {} of {} - {} -排行榜位置: {}/{} + Leaderboard Position: {0} of {1} + 排行榜位置: {0}/{1}