]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/client/scoreboard.qc
Merge branch 'master' into terencehill/centerprint_stuff
[xonotic/xonotic-data.pk3dir.git] / qcsrc / client / scoreboard.qc
index aabc069f17a88620c618c0a4dfd3013d499d1339..93f851876da157a0a229127cfdf8cac4111272b9 100644 (file)
@@ -11,6 +11,47 @@ void drawstringcenter(vector, string, vector, vector, float, float);
 
 float SCOREBOARD_OFFSET = 50;
 
+// wrapper to put all possible scores titles through gettext
+string TranslateScoresLabel(string l)
+{
+       switch(l)
+       {
+               case "bckills": return CTX(_("SCO^bckills"));
+               case "bctime": return CTX(_("SCO^bctime"));
+               case "caps": return CTX(_("SCO^caps"));
+               case "deaths": return CTX(_("SCO^deaths"));
+               case "destroyed": return CTX(_("SCO^destroyed"));
+               case "drops": return CTX(_("SCO^drops"));
+               case "faults": return CTX(_("SCO^faults"));
+               case "fckills": return CTX(_("SCO^fckills"));
+               case "goals": return CTX(_("SCO^goals"));
+               case "kckills": return CTX(_("SCO^kckills"));
+               case "kdratio": return CTX(_("SCO^kdratio"));
+               case "k/d": return CTX(_("SCO^k/d"));
+               case "kd": return CTX(_("SCO^kd"));
+               case "kdr": return CTX(_("SCO^kdr"));
+               case "kills": return CTX(_("SCO^kills"));
+               case "laps": return CTX(_("SCO^laps"));
+               case "lives": return CTX(_("SCO^lives"));
+               case "losses": return CTX(_("SCO^losses"));
+               case "name": return CTX(_("SCO^name"));
+               case "nick": return CTX(_("SCO^nick"));
+               case "objectives": return CTX(_("SCO^objectives"));
+               case "pickups": return CTX(_("SCO^pickups"));
+               case "ping": return CTX(_("SCO^ping"));
+               case "pl": return CTX(_("SCO^pl"));
+               case "pushes": return CTX(_("SCO^pushes"));
+               case "rank": return CTX(_("SCO^rank"));
+               case "returns": return CTX(_("SCO^returns"));
+               case "revivals": return CTX(_("SCO^revivals"));
+               case "score": return CTX(_("SCO^score"));
+               case "suicides": return CTX(_("SCO^suicides"));
+               case "takes": return CTX(_("SCO^takes"));
+               case "ticks": return CTX(_("SCO^ticks"));
+               default: return l;
+       }
+}
+
 void MapVote_Draw();
 void HUD_FinaleOverlay()
 {
@@ -195,53 +236,55 @@ void HUD_UpdateTeamPos(entity Team)
 
 void Cmd_HUD_Help(float argc)
 {
-       print("You can modify the scoreboard using the ^2scoreboard_columns_set command.\n");
-       print("^3|---------------------------------------------------------------|\n");
-       print("Usage:\n");
-       print("^2scoreboard_columns_set default\n");
-       print("^2scoreboard_columns_set ^7filed1 field2 ...\n");
-       print("The following field names are recognized (case insensitive):\n");
-       print("You can use a ^3|^7 to start the right-aligned fields.\n\n");
-
-       print("^3name^7 or ^3nick^7         Name of a player\n");
-       print("^3ping^7                     Ping time\n");
-       print("^3pl^7                       Packet loss\n");
-       print("^3kills^7                    Number of kills\n");
-       print("^3deaths^7                   Number of deaths\n");
-       print("^3suicides^7                 Number of suicides\n");
-       print("^3frags^7                    kills - suicides\n");
-       print("^3kd^7                       The kill-death ratio\n");
-       print("^3caps^7                     How often a flag (CTF) or a key (KeyHunt) was captured\n");
-       print("^3pickups^7                  How often a flag (CTF) or a key (KeyHunt) was picked up\n");
-       print("^3fckills^7                  Number of flag carrier kills\n");
-       print("^3returns^7                  Number of flag returns\n");
-       print("^3drops^7                    Number of flag drops\n");
-       print("^3lives^7                    Number of lives (LMS)\n");
-       print("^3rank^7                     Player rank\n");
-       print("^3pushes^7                   Number of players pushed into void\n");
-       print("^3destroyed^7                Number of keys destroyed by pushing them into void\n");
-       print("^3kckills^7                  Number of keys carrier kills\n");
-       print("^3losses^7                   Number of times a key was lost\n");
-       print("^3laps^7                     Number of laps finished (race/cts)\n");
-       print("^3time^7                     Total time raced (race/cts)\n");
-       print("^3fastest^7                  Time of fastest lap (race/cts)\n");
-       print("^3ticks^7                    Number of ticks (DOM)\n");
-       print("^3takes^7                    Number of domination points taken (DOM)\n");
-       print("^3score^7                    Total score\n\n");
-
-       print("Before a field you can put a + or - sign, then a comma separated list\n");
-       print("of game types, then a slash, to make the field show up only in these\n");
-       print("or in all but these game types. You can also specify 'all' as a\n");
-       print("field to show all fields available for the current game mode.\n\n");
-
-       print("The special game type names 'teams' and 'noteams' can be used to\n");
-       print("include/exclude ALL teams/noteams game modes.\n\n");
-
-       print("Example: scoreboard_columns_set name ping pl | +ctf/field3 -dm/field4\n");
-       print("will display name, ping and pl aligned to the left, and the fields\n");
-       print("right of the vertical bar aligned to the right.\n");
-       print("'field3' will only be shown in CTF, and 'field4' will be shown in all\n");
-       print("other gamemodes except DM.\n");
+       print(_("You can modify the scoreboard using the ^2scoreboard_columns_set command.\n"));
+       print(_("^3|---------------------------------------------------------------|\n"));
+       print(_("Usage:\n"));
+       print(_("^2scoreboard_columns_set default\n"));
+       print(_("^2scoreboard_columns_set ^7filed1 field2 ...\n"));
+       print(_("The following field names are recognized (case insensitive):\n"));
+       print(_("You can use a ^3|^7 to start the right-aligned fields.\n\n"));
+
+       print(_("^3name^7 or ^3nick^7         Name of a player\n"));
+       print(_("^3ping^7                     Ping time\n"));
+       print(_("^3pl^7                       Packet loss\n"));
+       print(_("^3kills^7                    Number of kills\n"));
+       print(_("^3deaths^7                   Number of deaths\n"));
+       print(_("^3suicides^7                 Number of suicides\n"));
+       print(_("^3frags^7                    kills - suicides\n"));
+       print(_("^3kd^7                       The kill-death ratio\n"));
+       print(_("^3caps^7                     How often a flag (CTF) or a key (KeyHunt) was captured\n"));
+       print(_("^3pickups^7                  How often a flag (CTF) or a key (KeyHunt) or a ball (Keepaway) was picked up\n"));
+       print(_("^3fckills^7                  Number of flag carrier kills\n"));
+       print(_("^3returns^7                  Number of flag returns\n"));
+       print(_("^3drops^7                    Number of flag drops\n"));
+       print(_("^3lives^7                    Number of lives (LMS)\n"));
+       print(_("^3rank^7                     Player rank\n"));
+       print(_("^3pushes^7                   Number of players pushed into void\n"));
+       print(_("^3destroyed^7                Number of keys destroyed by pushing them into void\n"));
+       print(_("^3kckills^7                  Number of keys carrier kills\n"));
+       print(_("^3losses^7                   Number of times a key was lost\n"));
+       print(_("^3laps^7                     Number of laps finished (race/cts)\n"));
+       print(_("^3time^7                     Total time raced (race/cts)\n"));
+       print(_("^3fastest^7                  Time of fastest lap (race/cts)\n"));
+       print(_("^3ticks^7                    Number of ticks (DOM)\n"));
+       print(_("^3takes^7                    Number of domination points taken (DOM)\n"));
+       print(_("^3bckills^7                  Number of ball carrier kills\n"));
+       print(_("^3bctime^7                   Total amount of time holding the ball in Keepaway\n"));
+       print(_("^3score^7                    Total score\n\n"));
+
+       print(_("Before a field you can put a + or - sign, then a comma separated list\n"
+               "of game types, then a slash, to make the field show up only in these\n"
+               "or in all but these game types. You can also specify 'all' as a\n"
+               "field to show all fields available for the current game mode.\n\n"));
+
+       print(_("The special game type names 'teams' and 'noteams' can be used to\n"
+               "include/exclude ALL teams/noteams game modes.\n\n"));
+
+       print(_("Example: scoreboard_columns_set name ping pl | +ctf/field3 -dm/field4\n"));
+       print(_("will display name, ping and pl aligned to the left, and the fields\n"
+               "right of the vertical bar aligned to the right.\n"));
+       print(_("'field3' will only be shown in CTF, and 'field4' will be shown in all\n"
+               "other gamemodes except DM.\n"));
 }
 
 string HUD_DefaultColumnLayout()
@@ -253,7 +296,7 @@ string HUD_DefaultColumnLayout()
                "+lms/lives +lms/rank ",
                "+kh/caps +kh/pushes +kh/destroyed ",
                "?+race/laps ?+race/time ?+race/fastest ",
-               "+as/objectives +nexball/faults +nexball/goals +ka/drops +ka/pickups +ka/bckills +ka/time +freezetag/revivals ",
+               "+as/objectives +nexball/faults +nexball/goals +ka/pickups +ka/bckills +ka/bctime +freezetag/revivals ",
                "-lms,race,nexball/score");
 }
 
@@ -316,13 +359,13 @@ void Cmd_HUD_SetFields(float argc)
                        pattern = substring(str, 0, slash);
                        str = substring(str, slash + 1, strlen(str) - (slash + 1));
 
-                       if not(isGametypeInFilter(gametype, teamplay, pattern))
+                       if not(isGametypeInFilter(gametype, teamplay, FALSE, pattern))
                                continue;
                }
 
                strunzone(hud_title[hud_num_fields]);
-               hud_title[hud_num_fields] = strzone(str);
-               hud_size[hud_num_fields] = stringwidth(str, FALSE, hud_fontsize);
+               hud_title[hud_num_fields] = strzone(TranslateScoresLabel(str));
+               hud_size[hud_num_fields] = stringwidth(hud_title[hud_num_fields], FALSE, hud_fontsize);
                str = strtolower(str);
 
                if(str == "ping") {
@@ -349,7 +392,7 @@ void Cmd_HUD_SetFields(float argc)
                        else
                        {
                                if not(nocomplain)
-                                       print(strcat("^1Error:^7 Unknown score field: '", str, "'\n"));
+                                       print(sprintf("^1Error:^7 Unknown score field: '%s'\n", str));
                                continue;
                        }
 :found
@@ -383,10 +426,10 @@ void Cmd_HUD_SetFields(float argc)
                                hud_size[i] = hud_size[i-1];
                                hud_field[i] = hud_field[i-1];
                        }
-                       hud_title[0] = strzone("name");
+                       hud_title[0] = strzone(TranslateScoresLabel("name"));
                        hud_field[0] = SP_NAME;
                        ++hud_num_fields;
-                       print("fixed missing field 'name'\n");
+                       print(sprintf(_("fixed missing field '%s'\n"), "name"));
 
                        if(!have_separator)
                        {
@@ -401,7 +444,7 @@ void Cmd_HUD_SetFields(float argc)
                                hud_field[1] = SP_SEPARATOR;
                                hud_size[1] = stringwidth("|", FALSE, hud_fontsize);
                                ++hud_num_fields;
-                               print("fixed missing field '|'\n");
+                               print(sprintf(_("fixed missing field '%s'\n"), "|"));
                        }
                }
                else if(!have_separator)
@@ -411,25 +454,25 @@ void Cmd_HUD_SetFields(float argc)
                        hud_size[hud_num_fields] = stringwidth("|", FALSE, hud_fontsize);
                        hud_field[hud_num_fields] = SP_SEPARATOR;
                        ++hud_num_fields;
-                       print("fixed missing field '|'\n");
+                       print(sprintf(_("fixed missing field '%s'\n"), "|"));
                }
                if(!have_secondary)
                {
                        strunzone(hud_title[hud_num_fields]);
-                       hud_title[hud_num_fields] = strzone(scores_label[ps_secondary]);
+                       hud_title[hud_num_fields] = strzone(TranslateScoresLabel(scores_label[ps_secondary]));
                        hud_size[hud_num_fields] = stringwidth(hud_title[hud_num_fields], FALSE, hud_fontsize);
                        hud_field[hud_num_fields] = ps_secondary;
                        ++hud_num_fields;
-                       print("fixed missing field '", scores_label[ps_secondary], "'\n");
+                       print(sprintf(_("fixed missing field '%s'\n"), scores_label[ps_secondary]));
                }
                if(!have_primary)
                {
                        strunzone(hud_title[hud_num_fields]);
-                       hud_title[hud_num_fields] = strzone(scores_label[ps_primary]);
+                       hud_title[hud_num_fields] = strzone(TranslateScoresLabel(scores_label[ps_primary]));
                        hud_size[hud_num_fields] = stringwidth(hud_title[hud_num_fields], FALSE, hud_fontsize);
                        hud_field[hud_num_fields] = ps_primary;
                        ++hud_num_fields;
-                       print("fixed missing field '", scores_label[ps_primary], "'\n");
+                       print(sprintf(_("fixed missing field '%s'\n"), scores_label[ps_primary]));
                }
        }
 
@@ -465,18 +508,18 @@ string HUD_GetField(entity pl, float field)
        {
                case SP_PING:
                        if not(pl.gotscores)
-                               return "\x8D\x8D\x8D"; // >>> sign
+                               return "\xEE\x82\x8D\xEE\x82\x8D\xEE\x82\x8D"; // >>> sign
                        //str = getplayerkey(pl.sv_entnum, "ping");
                        f = pl.ping;
                        if(f == 0)
-                               return "N/A";
+                               return _("N/A");
                        tmp = max(0, min(220, f-80)) / 220;
                        hud_field_rgb = '1 1 1' - '0 1 1'*tmp;
                        return ftos(f);
 
                case SP_PL:
                        if not(pl.gotscores)
-                               return "N/A";
+                               return _("N/A");
                        f = pl.ping_packetloss;
                        tmp = pl.ping_movementloss;
                        if(f == 0 && tmp == 0)
@@ -517,16 +560,12 @@ string HUD_GetField(entity pl, float field)
 
                        if(denom == 0) {
                                hud_field_rgb = '0 1 0';
-                               str = ftos(num);
+                               str = sprintf("%d", num);
                        } else if(num <= 0) {
                                hud_field_rgb = '1 0 0';
-                               str = ftos(num/denom);
+                               str = sprintf("%.1f", num/denom);
                        } else
-                               str = ftos(num/denom);
-
-                       tmp = strstrofs(str, ".", 0);
-                       if(tmp > 0)
-                               str = substring(str, 0, tmp+2);
+                               str = sprintf("%.1f", num/denom);
                        return str;
 
                default:
@@ -753,6 +792,7 @@ vector HUD_Scoreboard_MakeTable(vector pos, entity tm, vector rgb, vector bg_siz
 
        body_table_height = 1.25 * hud_fontsize_y * max(1, tm.team_size); // no player? show 1 empty line
 
+       pos_y += autocvar_scoreboard_border_thickness;
        pos -= '1 1 0';
 
        tmp_x = sbwidth + 2;
@@ -884,9 +924,7 @@ float HUD_WouldDrawScoreboard() {
                return 1;
        else if (intermission == 2)
                return 0;
-       else if (getstati(STAT_HEALTH) <= 0 && autocvar_cl_deathscoreboard && gametype != GAME_CTS)
-               return 1;
-       else if (spectatee_status == -1)
+       else if (spectatee_status != -1 && getstati(STAT_HEALTH) <= 0 && autocvar_cl_deathscoreboard && gametype != GAME_CTS)
                return 1;
        else if (scoreboard_showscores_force)
                return 1;
@@ -909,8 +947,8 @@ vector HUD_DrawScoreboardAccuracyStats(vector pos, vector rgb, vector bg_size)
        float weapon_height = height * 2/3;
        float weapon_width = sbwidth / weapon_cnt;
 
-       drawstring(pos, strcat("Accuracy stats (average ", ftos(average_accuracy), "%)"), hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
-       pos_y += 1.25 * hud_fontsize_y;
+       drawstring(pos, sprintf(_("Accuracy stats (average %d%%)"), average_accuracy), hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
+       pos_y += 1.25 * hud_fontsize_y + autocvar_scoreboard_border_thickness;
        vector tmp;
        tmp_x = sbwidth;
        tmp_y = height * rows;
@@ -943,7 +981,7 @@ vector HUD_DrawScoreboardAccuracyStats(vector pos, vector rgb, vector bg_size)
        if(getstati(STAT_SWITCHWEAPON) == WEP_MINSTANEX)
                g_minstagib = 1; // TODO: real detection for minstagib?
 
-       float weapon_stats, weapon_number;
+       float weapon_stats;
 
        if (!acc_levels)
                rgb = '1 1 1';
@@ -974,7 +1012,7 @@ vector HUD_DrawScoreboardAccuracyStats(vector pos, vector rgb, vector bg_size)
                        average_accuracy += weapon_stats; // store sum of all accuracies in average_accuracy
 
                        string s;
-                       s = sprintf("%d%%", weapon_stats*100);
+                       s = sprintf(_("%d%%"), weapon_stats*100);
 
                        float padding;
                        padding = (weapon_width - stringwidth(s, FALSE, '1 0 0' * fontsize)) / 2; // center the accuracy value
@@ -1034,8 +1072,8 @@ vector HUD_DrawScoreboardRankings(vector pos, entity pl,  vector rgb, vector bg_
        hl_rgb_z = autocvar_scoreboard_color_bg_b + 0.5;
 
        pos_y += hud_fontsize_y;
-       drawstring(pos, strcat("Rankings"), hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
-       pos_y += hud_fontsize_y;
+       drawstring(pos, _("Rankings"), hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
+       pos_y += hud_fontsize_y + autocvar_scoreboard_border_thickness;
        vector tmp;
        tmp_x = sbwidth;
        tmp_y = 1.25 * hud_fontsize_y * RANKINGS_RECEIVED_CNT;
@@ -1065,6 +1103,7 @@ vector HUD_DrawScoreboardRankings(vector pos, entity pl,  vector rgb, vector bg_
                drawcolorcodedstring(pos + '8 0 0' * hud_fontsize_y, n, '1 1 0' * hud_fontsize_y, scoreboard_alpha_fg, DRAWFLAG_NORMAL);
                pos_y += 1.25 * hud_fontsize_y;
        }
+       pos_y += autocvar_scoreboard_border_thickness;
 
        return pos;
 }
@@ -1110,6 +1149,7 @@ void HUD_DrawScoreboard()
 
        vector rgb, pos, tmp;
        entity pl, tm;
+       string str;
 
        xmin = autocvar_scoreboard_offset_left * vid_conwidth;
        ymin = autocvar_con_notify * autocvar_con_notifysize;
@@ -1125,29 +1165,33 @@ void HUD_DrawScoreboard()
        pos_z = 0;
 
        // Heading
-       drawstring(pos, "Scoreboard", '24 24 0', '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
-       
-       centerprint_start_x = vid_conwidth - 0.5 * (pos_x + stringwidth("Scoreboard", FALSE, '24 24 0'));
-       centerprint_start_y = pos_y;
+       vector sb_heading_fontsize;
+       sb_heading_fontsize = hud_fontsize * 2;
+       drawstring(pos, _("Scoreboard"), sb_heading_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
 
-       pos_y += 24;
+       pos_y += sb_heading_fontsize_y + hud_fontsize_y * 0.25;
 
        // Draw the scoreboard
        vector bg_size = drawgetimagesize("gfx/scoreboard/scoreboard_bg") * autocvar_scoreboard_bg_scale;
 
        if(teamplay)
        {
+               vector team_score_baseoffset;
+               team_score_baseoffset = eY * (2 * autocvar_scoreboard_border_thickness + hud_fontsize_y) - eX * (autocvar_scoreboard_border_thickness + hud_fontsize_x * 0.25);
                for(tm = teams.sort_next; tm; tm = tm.sort_next)
                {
                        if(tm.team == COLOR_SPECTATOR)
                                continue;
 
                        rgb = GetTeamRGB(tm.team);
-                       drawstring(pos - '2 0 0' * hud_fontsize_x + '0 1 0' * hud_fontsize_y, ftos(tm.(teamscores[ts_primary])), '1 1 0' * hud_fontsize_y * 1.5, rgb, scoreboard_alpha_fg, DRAWFLAG_NORMAL);
+                       str = ftos(tm.(teamscores[ts_primary]));
+                       drawstring(pos + team_score_baseoffset - eX * stringwidth(str, FALSE, hud_fontsize * 1.5), str, hud_fontsize * 1.5, rgb, scoreboard_alpha_fg, DRAWFLAG_NORMAL);
 
                        if(ts_primary != ts_secondary)
-                               drawstring(pos - '2 0 0' * hud_fontsize_x + '0 2.5 0' * hud_fontsize_y, ftos(tm.(teamscores[ts_secondary])), '1 1 0' * hud_fontsize_y * 1, rgb, scoreboard_alpha_fg, DRAWFLAG_NORMAL);
-
+                       {
+                               str = ftos(tm.(teamscores[ts_secondary]));
+                               drawstring(pos + team_score_baseoffset - eX * stringwidth(str, FALSE, hud_fontsize) + eY * hud_fontsize_y * 1.5, str, hud_fontsize, rgb, scoreboard_alpha_fg, DRAWFLAG_NORMAL);
+                       }
                        pos = HUD_Scoreboard_MakeTable(pos, tm, rgb, bg_size);
                }
        }
@@ -1168,11 +1212,11 @@ void HUD_DrawScoreboard()
 
        if(gametype == GAME_CTS || gametype == GAME_RACE) {
                if(race_speedaward) {
-                       drawcolorcodedstring(pos, strcat("Speed award: ", ftos(race_speedaward), " ^7(", race_speedaward_holder, "^7)"), hud_fontsize, scoreboard_alpha_fg, DRAWFLAG_NORMAL);
+                       drawcolorcodedstring(pos, sprintf(_("Speed award: %d ^7(%s^7)"), race_speedaward, race_speedaward_holder), hud_fontsize, scoreboard_alpha_fg, DRAWFLAG_NORMAL);
                        pos_y += 1.25 * hud_fontsize_y;
                }
                if(race_speedaward_alltimebest) {
-                       drawcolorcodedstring(pos, strcat("All-time fastest: ", ftos(race_speedaward_alltimebest), " ^7(", race_speedaward_alltimebest_holder, "^7)"), hud_fontsize, scoreboard_alpha_fg, DRAWFLAG_NORMAL);
+                       drawcolorcodedstring(pos, sprintf(_("All-time fastest: %d ^7(%s^7)"), race_speedaward_alltimebest, race_speedaward_alltimebest_holder), hud_fontsize, scoreboard_alpha_fg, DRAWFLAG_NORMAL);
                        pos_y += 1.25 * hud_fontsize_y;
                }
                pos = HUD_DrawScoreboardRankings(pos, pl, rgb, bg_size);
@@ -1199,74 +1243,61 @@ void HUD_DrawScoreboard()
 
        if(specs)
        {
-               drawstring(tmp, "Spectators", hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
+               drawstring(tmp, _("Spectators"), hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
                pos_y += 1.25 * hud_fontsize_y;
        }
 
        // Print info string
-       string str;
        float tl, fl, ll;
-       str = strcat("playing on ^2", shortmapname, "^7");
+       str = sprintf(_("playing on ^2%s^7"), shortmapname);
        tl = getstatf(STAT_TIMELIMIT);
        fl = getstatf(STAT_FRAGLIMIT);
        ll = getstatf(STAT_LEADLIMIT);
        if(gametype == GAME_LMS)
        {
                if(tl > 0)
-                       str = strcat(str, " for up to ^1", ftos(tl), " minutes^7");
+                       str = strcat(str, sprintf(_(" for up to ^1%1.0f minutes^7"), tl));
        }
        else
        {
                if(tl > 0)
-                       str = strcat(str, " for ^1", ftos(tl), " minutes^7");
+                       str = strcat(str, sprintf(_(" for up to ^1%1.0f minutes^7"), tl));
                if(fl > 0)
                {
                        if(tl > 0)
-                               str = strcat(str, " or");
+                               str = strcat(str, _(" or"));
                        if(teamplay)
                        {
-                               str = strcat(str, " until ^3", ScoreString(teamscores_flags[ts_primary], fl));
-                               if(teamscores_label[ts_primary] == "score")
-                                       str = strcat(str, " points^7");
-                               else if(teamscores_label[ts_primary] == "fastest")
-                                       str = strcat(str, " is beaten^7");
-                               else
-                                       str = strcat(str, " ", teamscores_label[ts_primary]);
+                               str = strcat(str, sprintf(_(" until ^3%s %s^7"), ScoreString(teamscores_flags[ts_primary], fl), 
+                                       (teamscores_label[ts_primary] == "score")   ? CTX(_("SCO^points")) :
+                                       (teamscores_label[ts_primary] == "fastest") ? CTX(_("SCO^is beaten")) :
+                                       TranslateScoresLabel(teamscores_label[ts_primary])));
                        }
                        else
                        {
-                               str = strcat(str, " until ^3", ScoreString(scores_flags[ps_primary], fl));
-                               if(scores_label[ps_primary] == "score")
-                                       str = strcat(str, " points^7");
-                               else if(scores_label[ps_primary] == "fastest")
-                                       str = strcat(str, " is beaten^7");
-                               else
-                                       str = strcat(str, " ", scores_label[ps_primary]);
+                               str = strcat(str, sprintf(_(" until ^3%s %s^7"), ScoreString(scores_flags[ps_primary], fl), 
+                                       (scores_label[ps_primary] == "score")   ? CTX(_("SCO^points")) :
+                                       (scores_label[ps_primary] == "fastest") ? CTX(_("SCO^is beaten")) :
+                                       TranslateScoresLabel(scores_label[ps_primary])));
                        }
                }
                if(ll > 0)
                {
                        if(tl > 0 || fl > 0)
-                               str = strcat(str, " or");
+                               str = strcat(str, _(" or"));
                        if(teamplay)
                        {
-                               str = strcat(str, " until a lead of ^3", ScoreString(teamscores_flags[ts_primary], ll));
-                               if(teamscores_label[ts_primary] == "score")
-                                       str = strcat(str, " points^7");
-                               else if(teamscores_label[ts_primary] == "fastest")
-                                       str = strcat(str, " is beaten^7");
-                               else
-                                       str = strcat(str, " ", teamscores_label[ts_primary]);
+                               str = strcat(str, sprintf(_(" until a lead of ^3%s %s^7"), ScoreString(teamscores_flags[ts_primary], ll), 
+                                       (teamscores_label[ts_primary] == "score")   ? CTX(_("SCO^points")) :
+                                       (teamscores_label[ts_primary] == "fastest") ? CTX(_("SCO^is beaten")) :
+                                       TranslateScoresLabel(teamscores_label[ts_primary])));
                        }
                        else
                        {
-                               str = strcat(str, " until a lead of ^3", ScoreString(scores_flags[ps_primary], ll));
-                               if(scores_label[ps_primary] == "score")
-                                       str = strcat(str, " points^7");
-                               else if(scores_label[ps_primary] == "fastest")
-                                       str = strcat(str, " is beaten^7");
-                               else
-                                       str = strcat(str, " ", scores_label[ps_primary]);
+                               str = strcat(str, sprintf(_(" until a lead of ^3%s %s^7"), ScoreString(scores_flags[ps_primary], ll), 
+                                       (scores_label[ps_primary] == "score")   ? CTX(_("SCO^points")) :
+                                       (scores_label[ps_primary] == "fastest") ? CTX(_("SCO^is beaten")) :
+                                       TranslateScoresLabel(scores_label[ps_primary])));
                        }
                }
        }