Skip to content

Commit

Permalink
Merge pull request #18308 from hrydgard/fix-translation-string-order
Browse files Browse the repository at this point in the history
Add support for using %1 and %2 in some more translation strings.
  • Loading branch information
hrydgard committed Oct 4, 2023
2 parents 166ea2b + b2f97d5 commit 2c4fda0
Show file tree
Hide file tree
Showing 46 changed files with 132 additions and 96 deletions.
36 changes: 35 additions & 1 deletion Common/StringUtils.cpp
Expand Up @@ -385,7 +385,7 @@ std::string UnescapeMenuString(const char *input, char *shortcutChar) {
return output;
}

std::string ApplySafeSubstitutions(const char *format, const std::string &string1, const std::string &string2, const std::string &string3) {
std::string ApplySafeSubstitutions(const char *format, std::string_view string1, std::string_view string2, std::string_view string3, std::string_view string4) {
size_t formatLen = strlen(format);
std::string output;
output.reserve(formatLen + 20);
Expand All @@ -408,6 +408,40 @@ std::string ApplySafeSubstitutions(const char *format, const std::string &string
case '3':
output += string3; i++;
break;
case '4':
output += string4; i++;
break;
}
}
return output;
}

std::string ApplySafeSubstitutions(const char *format, int i1, int i2, int i3, int i4) {
size_t formatLen = strlen(format);
std::string output;
output.reserve(formatLen + 20);
for (size_t i = 0; i < formatLen; i++) {
char c = format[i];
if (c != '%') {
output.push_back(c);
continue;
}
if (i >= formatLen - 1) {
break;
}
switch (format[i + 1]) {
case '1':
output += StringFromInt(i1); i++;
break;
case '2':
output += StringFromInt(i2); i++;
break;
case '3':
output += StringFromInt(i3); i++;
break;
case '4':
output += StringFromInt(i4); i++;
break;
}
}
return output;
Expand Down
4 changes: 3 additions & 1 deletion Common/StringUtils.h
Expand Up @@ -127,4 +127,6 @@ bool SplitPath(const std::string& full_path, std::string* _pPath, std::string* _

// Replaces %1, %2, %3 in format with arg1, arg2, arg3.
// Much safer than snprintf and friends.
std::string ApplySafeSubstitutions(const char *format, const std::string &string1, const std::string &string2 = "", const std::string &string3 = "");
// For mixes of strings and ints, manually convert the ints to strings.
std::string ApplySafeSubstitutions(const char *format, std::string_view string1, std::string_view string2 = "", std::string_view string3 = "", std::string_view string4 = "");
std::string ApplySafeSubstitutions(const char *format, int i1, int i2 = 0, int i3 = 0, int i4 = 0);
4 changes: 2 additions & 2 deletions Core/RetroAchievements.cpp
Expand Up @@ -246,7 +246,7 @@ static void event_handler_callback(const rc_client_event_t *event, rc_client_t *
rc_client_user_game_summary_t summary;
rc_client_get_user_game_summary(g_rcClient, &summary);

std::string message = StringFromFormat(ac->T("%d achievements"), summary.num_unlocked_achievements);
std::string message = ApplySafeSubstitutions(ac->T("%d achievements, %d points"), summary.num_unlocked_achievements, summary.points_unlocked);

g_OSD.Show(OSDType::MESSAGE_INFO, title, message, DeNull(gameInfo->badge_name), 10.0f);

Expand Down Expand Up @@ -725,7 +725,7 @@ std::string GetGameAchievementSummary() {
if (summary.num_core_achievements + summary.num_unofficial_achievements == 0) {
summaryString = ac->T("This game has no achievements");
} else {
summaryString = StringFromFormat(ac->T("Earned", "You have unlocked %d of %d achievements, earning %d of %d points"),
summaryString = ApplySafeSubstitutions(ac->T("Earned", "You have unlocked %1 of %2 achievements, earning %3 of %4 points"),
summary.num_unlocked_achievements, summary.num_core_achievements + summary.num_unofficial_achievements,
summary.points_unlocked, summary.points_core);
if (ChallengeModeActive()) {
Expand Down
4 changes: 2 additions & 2 deletions assets/lang/ar_AE.ini
Expand Up @@ -9,7 +9,7 @@
[Achievements]
%1: Attempt failed = %1: Attempt failed
%1: Attempt started = %1: Attempt started
%d achievements, %d points = %d achievements, %d points
%1 achievements, %2 points = %1 achievements, %2 points
Account = Account
Achievement progress = Achievement progress
Achievement unlocked = Achievement unlocked
Expand All @@ -25,7 +25,7 @@ Challenge Mode = Challenge Mode
Challenge Mode (no savestates) = Challenge Mode (no savestates)
Contacting RetroAchievements server... = Contacting RetroAchievements server...
Customize = Customize
Earned = You have earned %d of %d achievements, and %d of %d points
Earned = You have unlocked %1 of %2 achievements, and %3 of %4 points
Encore Mode = Encore Mode
Failed logging in to RetroAchievements = Failed logging in to RetroAchievements
Failed to connect to RetroAchievements. Achievements will not unlock. = Failed to connect to RetroAchievements. Achievements will not unlock.
Expand Down
4 changes: 2 additions & 2 deletions assets/lang/az_AZ.ini
@@ -1,7 +1,7 @@
[Achievements]
%1: Attempt failed = %1: Attempt failed
%1: Attempt started = %1: Attempt started
%d achievements, %d points = %d achievements, %d points
%1 achievements, %2 points = %1 achievements, %2 points
Account = Account
Achievement progress = Achievement progress
Achievement unlocked = Achievement unlocked
Expand All @@ -17,7 +17,7 @@ Challenge Mode = Challenge Mode
Challenge Mode (no savestates) = Challenge Mode (no savestates)
Contacting RetroAchievements server... = Contacting RetroAchievements server...
Customize = Customize
Earned = You have earned %d of %d achievements, and %d of %d points
Earned = You have unlocked %1 of %2 achievements, and %3 of %4 points
Encore Mode = Encore Mode
Failed logging in to RetroAchievements = Failed logging in to RetroAchievements
Failed to connect to RetroAchievements. Achievements will not unlock. = Failed to connect to RetroAchievements. Achievements will not unlock.
Expand Down
4 changes: 2 additions & 2 deletions assets/lang/bg_BG.ini
@@ -1,7 +1,7 @@
[Achievements]
%1: Attempt failed = %1: Attempt failed
%1: Attempt started = %1: Attempt started
%d achievements, %d points = %d achievements, %d points
%1 achievements, %2 points = %1 achievements, %2 points
Account = Account
Achievement progress = Achievement progress
Achievement unlocked = Achievement unlocked
Expand All @@ -17,7 +17,7 @@ Challenge Mode = Challenge Mode
Challenge Mode (no savestates) = Challenge Mode (no savestates)
Contacting RetroAchievements server... = Contacting RetroAchievements server...
Customize = Customize
Earned = You have earned %d of %d achievements, and %d of %d points
Earned = You have unlocked %1 of %2 achievements, and %3 of %4 points
Encore Mode = Encore Mode
Failed logging in to RetroAchievements = Failed logging in to RetroAchievements
Failed to connect to RetroAchievements. Achievements will not unlock. = Failed to connect to RetroAchievements. Achievements will not unlock.
Expand Down
4 changes: 2 additions & 2 deletions assets/lang/ca_ES.ini
@@ -1,7 +1,7 @@
[Achievements]
%1: Attempt failed = %1: Attempt failed
%1: Attempt started = %1: Attempt started
%d achievements, %d points = %d achievements, %d points
%1 achievements, %2 points = %1 achievements, %2 points
Account = Account
Achievement progress = Achievement progress
Achievement unlocked = Achievement unlocked
Expand All @@ -17,7 +17,7 @@ Challenge Mode = Challenge Mode
Challenge Mode (no savestates) = Challenge Mode (no savestates)
Contacting RetroAchievements server... = Contacting RetroAchievements server...
Customize = Customize
Earned = You have earned %d of %d achievements, and %d of %d points
Earned = You have unlocked %1 of %2 achievements, and %3 of %4 points
Encore Mode = Encore Mode
Failed logging in to RetroAchievements = Failed logging in to RetroAchievements
Failed to connect to RetroAchievements. Achievements will not unlock. = Failed to connect to RetroAchievements. Achievements will not unlock.
Expand Down
4 changes: 2 additions & 2 deletions assets/lang/cz_CZ.ini
@@ -1,7 +1,7 @@
[Achievements]
%1: Attempt failed = %1: Attempt failed
%1: Attempt started = %1: Attempt started
%d achievements, %d points = %d achievements, %d points
%1 achievements, %2 points = %1 achievements, %2 points
Account = Account
Achievement progress = Achievement progress
Achievement unlocked = Achievement unlocked
Expand All @@ -17,7 +17,7 @@ Challenge Mode = Challenge Mode
Challenge Mode (no savestates) = Challenge Mode (no savestates)
Contacting RetroAchievements server... = Contacting RetroAchievements server...
Customize = Customize
Earned = You have earned %d of %d achievements, and %d of %d points
Earned = You have unlocked %1 of %2 achievements, and %3 of %4 points
Encore Mode = Encore Mode
Failed logging in to RetroAchievements = Failed logging in to RetroAchievements
Failed to connect to RetroAchievements. Achievements will not unlock. = Failed to connect to RetroAchievements. Achievements will not unlock.
Expand Down
4 changes: 2 additions & 2 deletions assets/lang/da_DK.ini
@@ -1,7 +1,7 @@
[Achievements]
%1: Attempt failed = %1: Attempt failed
%1: Attempt started = %1: Attempt started
%d achievements, %d points = %d achievements, %d points
%1 achievements, %2 points = %1 achievements, %2 points
Account = Account
Achievement progress = Achievement progress
Achievement unlocked = Achievement unlocked
Expand All @@ -17,7 +17,7 @@ Challenge Mode = Challenge Mode
Challenge Mode (no savestates) = Challenge Mode (no savestates)
Contacting RetroAchievements server... = Contacting RetroAchievements server...
Customize = Customize
Earned = You have earned %d of %d achievements, and %d of %d points
Earned = You have unlocked %1 of %2 achievements, and %3 of %4 points
Encore Mode = Encore Mode
Failed logging in to RetroAchievements = Failed logging in to RetroAchievements
Failed to connect to RetroAchievements. Achievements will not unlock. = Failed to connect to RetroAchievements. Achievements will not unlock.
Expand Down
4 changes: 2 additions & 2 deletions assets/lang/de_DE.ini
@@ -1,7 +1,7 @@
[Achievements]
%1: Attempt failed = %1: Attempt failed
%1: Attempt started = %1: Attempt started
%d achievements, %d points = %d achievements, %d points
%1 achievements, %2 points = %1 achievements, %2 points
Account = Account
Achievement progress = Achievement progress
Achievement unlocked = Achievement unlocked
Expand All @@ -17,7 +17,7 @@ Challenge Mode = Challenge Mode
Challenge Mode (no savestates) = Challenge Mode (no savestates)
Contacting RetroAchievements server... = Contacting RetroAchievements server...
Customize = Customize
Earned = You have earned %d of %d achievements, and %d of %d points
Earned = You have unlocked %1 of %2 achievements, and %3 of %4 points
Encore Mode = Encore Mode
Failed logging in to RetroAchievements = Failed logging in to RetroAchievements
Failed to connect to RetroAchievements. Achievements will not unlock. = Failed to connect to RetroAchievements. Achievements will not unlock.
Expand Down
4 changes: 2 additions & 2 deletions assets/lang/dr_ID.ini
@@ -1,7 +1,7 @@
[Achievements]
%1: Attempt failed = %1: Attempt failed
%1: Attempt started = %1: Attempt started
%d achievements, %d points = %d achievements, %d points
%1 achievements, %2 points = %1 achievements, %2 points
Account = Account
Achievement progress = Achievement progress
Achievement unlocked = Achievement unlocked
Expand All @@ -17,7 +17,7 @@ Challenge Mode = Challenge Mode
Challenge Mode (no savestates) = Challenge Mode (no savestates)
Contacting RetroAchievements server... = Contacting RetroAchievements server...
Customize = Customize
Earned = You have earned %d of %d achievements, and %d of %d points
Earned = You have unlocked %1 of %2 achievements, and %3 of %4 points
Encore Mode = Encore Mode
Failed logging in to RetroAchievements = Failed logging in to RetroAchievements
Failed to connect to RetroAchievements. Achievements will not unlock. = Failed to connect to RetroAchievements. Achievements will not unlock.
Expand Down
4 changes: 2 additions & 2 deletions assets/lang/en_US.ini
Expand Up @@ -23,7 +23,7 @@
# Happy translating.

[Achievements]
%d achievements, %d points = %d achievements, %d points
%1 achievements, %2 points = %1 achievements, %2 points
%1: Attempt started = %1: Attempt started
%1: Attempt failed = %1: Attempt failed
Account = Account
Expand All @@ -40,7 +40,7 @@ Challenge Mode = Challenge Mode
Challenge Mode (no savestates) = Challenge Mode (no savestates)
Contacting RetroAchievements server... = Contacting RetroAchievements server...
Customize = Customize
Earned = You have unlocked %d of %d achievements, and earned %d of %d points
Earned = You have unlocked %1 of %2 achievements, and earned %3 of %4 points
Encore Mode = Encore Mode
Failed logging in to RetroAchievements = Failed logging in to RetroAchievements
Failed to connect to RetroAchievements. Achievements will not unlock. = Failed to connect to RetroAchievements. Achievements will not unlock.
Expand Down
4 changes: 2 additions & 2 deletions assets/lang/es_ES.ini
@@ -1,5 +1,5 @@
[Achievements]
%d achievements, %d points = %d logros, %d puntos
%1 achievements, %2 points = %1 logros, %2 puntos
%1: Attempt started = %1: intento para el leaderboard iniciado
%1: Attempt failed = %1: intento para el leaderboard fallido
Account = Cuenta
Expand All @@ -17,7 +17,7 @@ Challenge Mode = Modo Desafío
Challenge Mode (no savestates) = Modo Desafío (Sin estados)
Contacting RetroAchievements server... = Contactando al servidor de RetroAchievements...
Customize = Customizar
Earned = Has obtenido %d de %d logros y %d de %d puntos
Earned = Has obtenido %1 de %2 logros y %3 de %4 puntos
Encore Mode = Modo Encore
Failed logging in to RetroAchievements = No se pudo iniciar sesión a RetroAchievements
Failed to connect to RetroAchievements. Achievements will not unlock. = Failed to connect to RetroAchievements. Achievements will not unlock.
Expand Down
4 changes: 2 additions & 2 deletions assets/lang/es_LA.ini
@@ -1,5 +1,5 @@
[Achievements]
%d achievements, %d points = %d logros, %d puntos
%1 achievements, %2 points = %1 logros, %2 puntos
%1: Attempt started = %1: intento para el leaderboard iniciado
%1: Attempt failed = %1: intento para el leaderboard fallido
Account = Cuenta
Expand All @@ -17,7 +17,7 @@ Challenge Mode = Modo Desafío
Challenge Mode (no savestates) = Modo Desafío (Sin estados)
Contacting RetroAchievements server... = Contactando al servidor de RetroAchievements...
Customize = Customizar
Earned = Has obtenido %d de %d logros y %d de %d puntos
Earned = Has obtenido %1 de %2 logros y %3 de %4 puntos
Encore Mode = Modo Encore
Failed logging in to RetroAchievements = Failed logging in to RetroAchievements
Failed to connect to RetroAchievements. Achievements will not unlock. = Failed to connect to RetroAchievements. Achievements will not unlock.
Expand Down
4 changes: 2 additions & 2 deletions assets/lang/fa_IR.ini
@@ -1,7 +1,7 @@
[Achievements]
%1: Attempt failed = %1: Attempt failed
%1: Attempt started = %1: Attempt started
%d achievements, %d points = %d achievements, %d points
%1 achievements, %2 points = %1 achievements, %2 points
Account = Account
Achievement progress = Achievement progress
Achievement unlocked = Achievement unlocked
Expand All @@ -17,7 +17,7 @@ Challenge Mode = Challenge Mode
Challenge Mode (no savestates) = Challenge Mode (no savestates)
Contacting RetroAchievements server... = Contacting RetroAchievements server...
Customize = Customize
Earned = You have earned %d of %d achievements, and %d of %d points
Earned = You have unlocked %1 of %2 achievements, and %3 of %4 points
Encore Mode = Encore Mode
Failed logging in to RetroAchievements = Failed logging in to RetroAchievements
Failed to connect to RetroAchievements. Achievements will not unlock. = Failed to connect to RetroAchievements. Achievements will not unlock.
Expand Down
2 changes: 1 addition & 1 deletion assets/lang/fi_FI.ini
@@ -1,7 +1,7 @@
[Achievements]
%1: Attempt failed = %1: Attempt failed
%1: Attempt started = %1: Attempt started
%d achievements, %d points = %d saavutusta, %d pistettä
%1 achievements, %2 points = %1 saavutusta, %2 pistettä
Account = Tili
Achievement progress = Achievement progress
Achievement unlocked = Saavutus avattu
Expand Down
4 changes: 2 additions & 2 deletions assets/lang/fr_FR.ini
@@ -1,7 +1,7 @@
[Achievements]
%1: Attempt failed = %1: Attempt failed
%1: Attempt started = %1: Attempt started
%d achievements, %d points = %d achievements, %d points
%1 achievements, %2 points = %1 achievements, %2 points
Account = Account
Achievement progress = Achievement progress
Achievement unlocked = Achievement unlocked
Expand All @@ -17,7 +17,7 @@ Challenge Mode = Challenge Mode
Challenge Mode (no savestates) = Challenge Mode (no savestates)
Contacting RetroAchievements server... = Contacting RetroAchievements server...
Customize = Customize
Earned = You have earned %d of %d achievements, and %d of %d points
Earned = You have unlocked %1 of %2 achievements, and %3 of %4 points
Encore Mode = Encore Mode
Failed logging in to RetroAchievements = Failed logging in to RetroAchievements
Failed to connect to RetroAchievements. Achievements will not unlock. = Failed to connect to RetroAchievements. Achievements will not unlock.
Expand Down
4 changes: 2 additions & 2 deletions assets/lang/gl_ES.ini
@@ -1,7 +1,7 @@
[Achievements]
%1: Attempt failed = %1: Attempt failed
%1: Attempt started = %1: Attempt started
%d achievements, %d points = %d achievements, %d points
%1 achievements, %2 points = %1 achievements, %2 points
Account = Account
Achievement progress = Achievement progress
Achievement unlocked = Achievement unlocked
Expand All @@ -17,7 +17,7 @@ Challenge Mode = Challenge Mode
Challenge Mode (no savestates) = Challenge Mode (no savestates)
Contacting RetroAchievements server... = Contacting RetroAchievements server...
Customize = Customize
Earned = You have earned %d of %d achievements, and %d of %d points
Earned = You have unlocked %1 of %2 achievements, and %3 of %4 points
Encore Mode = Encore Mode
Failed logging in to RetroAchievements = Failed logging in to RetroAchievements
Failed to connect to RetroAchievements. Achievements will not unlock. = Failed to connect to RetroAchievements. Achievements will not unlock.
Expand Down
4 changes: 2 additions & 2 deletions assets/lang/gr_EL.ini
@@ -1,7 +1,7 @@
[Achievements]
%1: Attempt failed = %1: Attempt failed
%1: Attempt started = %1: Attempt started
%d achievements, %d points = %d achievements, %d points
%1 achievements, %2 points = %1 achievements, %2 points
Account = Account
Achievement progress = Achievement progress
Achievement unlocked = Achievement unlocked
Expand All @@ -17,7 +17,7 @@ Challenge Mode = Challenge Mode
Challenge Mode (no savestates) = Challenge Mode (no savestates)
Contacting RetroAchievements server... = Contacting RetroAchievements server...
Customize = Customize
Earned = You have earned %d of %d achievements, and %d of %d points
Earned = You have unlocked %1 of %2 achievements, and %3 of %4 points
Encore Mode = Encore Mode
Failed logging in to RetroAchievements = Failed logging in to RetroAchievements
Failed to connect to RetroAchievements. Achievements will not unlock. = Failed to connect to RetroAchievements. Achievements will not unlock.
Expand Down
4 changes: 2 additions & 2 deletions assets/lang/he_IL.ini
@@ -1,7 +1,7 @@
[Achievements]
%1: Attempt failed = %1: Attempt failed
%1: Attempt started = %1: Attempt started
%d achievements, %d points = %d achievements, %d points
%1 achievements, %2 points = %1 achievements, %2 points
Account = Account
Achievement progress = Achievement progress
Achievement unlocked = Achievement unlocked
Expand All @@ -17,7 +17,7 @@ Challenge Mode = Challenge Mode
Challenge Mode (no savestates) = Challenge Mode (no savestates)
Contacting RetroAchievements server... = Contacting RetroAchievements server...
Customize = Customize
Earned = You have earned %d of %d achievements, and %d of %d points
Earned = You have unlocked %1 of %2 achievements, and %3 of %4 points
Encore Mode = Encore Mode
Failed logging in to RetroAchievements = Failed logging in to RetroAchievements
Failed to connect to RetroAchievements. Achievements will not unlock. = Failed to connect to RetroAchievements. Achievements will not unlock.
Expand Down
4 changes: 2 additions & 2 deletions assets/lang/he_IL_invert.ini
@@ -1,7 +1,7 @@
[Achievements]
%1: Attempt failed = %1: Attempt failed
%1: Attempt started = %1: Attempt started
%d achievements, %d points = %d achievements, %d points
%1 achievements, %2 points = %1 achievements, %2 points
Account = Account
Achievement progress = Achievement progress
Achievement unlocked = Achievement unlocked
Expand All @@ -17,7 +17,7 @@ Challenge Mode = Challenge Mode
Challenge Mode (no savestates) = Challenge Mode (no savestates)
Contacting RetroAchievements server... = Contacting RetroAchievements server...
Customize = Customize
Earned = You have earned %d of %d achievements, and %d of %d points
Earned = You have unlocked %1 of %2 achievements, and %3 of %4 points
Encore Mode = Encore Mode
Failed logging in to RetroAchievements = Failed logging in to RetroAchievements
Failed to connect to RetroAchievements. Achievements will not unlock. = Failed to connect to RetroAchievements. Achievements will not unlock.
Expand Down

0 comments on commit 2c4fda0

Please sign in to comment.