From: TimePath Date: Wed, 26 Aug 2015 23:33:56 +0000 (+1000) Subject: Add translation helpers to /lib X-Git-Tag: xonotic-v0.8.2~2021 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=69c1e47c332a6f01f3e30f3d792afdc3c73fdf83;p=xonotic%2Fxonotic-data.pk3dir.git Add translation helpers to /lib --- diff --git a/qcsrc/client/hud.qc b/qcsrc/client/hud.qc index 7125739cf..f623e2706 100644 --- a/qcsrc/client/hud.qc +++ b/qcsrc/client/hud.qc @@ -12,7 +12,6 @@ #include "../common/buffs.qh" #include "../common/constants.qh" -#include "../common/counting.qh" #include "../common/deathtypes.qh" #include "../common/items/all.qc" #include "../common/mapinfo.qh" diff --git a/qcsrc/client/scoreboard.qc b/qcsrc/client/scoreboard.qc index a24b94379..1e2ef0baa 100644 --- a/qcsrc/client/scoreboard.qc +++ b/qcsrc/client/scoreboard.qc @@ -5,7 +5,6 @@ #include "sortlist.qh" #include "../common/constants.qh" -#include "../common/counting.qh" #include "../common/mapinfo.qh" #include "../common/minigames/cl_minigames.qh" #include "../common/stats.qh" diff --git a/qcsrc/common/counting.qh b/qcsrc/common/counting.qh deleted file mode 100644 index f464cdc32..000000000 --- a/qcsrc/common/counting.qh +++ /dev/null @@ -1,223 +0,0 @@ -#ifndef COUNTING_H -#define COUNTING_H - -#include "util.qh" - -// =============================================== -// Time processing and counting functions/macros -// =============================================== - -#define count_years_decs(time,decs) sprintf(ZCTX(_("CI_DEC^%s years")), ftos_decimals(time, decs)) -#define count_years(time) count_fill(time, \ - ZCTX(_("CI_ZER^%d years")), /* zeroth */ \ - ZCTX(_("CI_FIR^%d year")), /* first */ \ - ZCTX(_("CI_SEC^%d years")), /* year */ \ - ZCTX(_("CI_THI^%d years")), /* third */ \ - ZCTX(_("CI_MUL^%d years"))) /* multi */ - -#define count_weeks_decs(time,decs) sprintf(ZCTX(_("CI_DEC^%s weeks")), ftos_decimals(time, decs)) -#define count_weeks(time) count_fill(time, \ - ZCTX(_("CI_ZER^%d weeks")), /* zeroth */ \ - ZCTX(_("CI_FIR^%d week")), /* first */ \ - ZCTX(_("CI_SEC^%d weeks")), /* week */ \ - ZCTX(_("CI_THI^%d weeks")), /* third */ \ - ZCTX(_("CI_MUL^%d weeks"))) /* multi */ - -#define count_days_decs(time,decs) sprintf(ZCTX(_("CI_DEC^%s days")), ftos_decimals(time, decs)) -#define count_days(time) count_fill(time, \ - ZCTX(_("CI_ZER^%d days")), /* zeroth */ \ - ZCTX(_("CI_FIR^%d day")), /* first */ \ - ZCTX(_("CI_SEC^%d days")), /* day */ \ - ZCTX(_("CI_THI^%d days")), /* third */ \ - ZCTX(_("CI_MUL^%d days"))) /* multi */ - -#define count_hours_decs(time,decs) sprintf(ZCTX(_("CI_DEC^%s hours")), ftos_decimals(time, decs)) -#define count_hours(time) count_fill(time, \ - ZCTX(_("CI_ZER^%d hours")), /* zeroth */ \ - ZCTX(_("CI_FIR^%d hour")), /* first */ \ - ZCTX(_("CI_SEC^%d hours")), /* hour */ \ - ZCTX(_("CI_THI^%d hours")), /* third */ \ - ZCTX(_("CI_MUL^%d hours"))) /* multi */ - - -#define count_minutes_decs(time,decs) sprintf(ZCTX(_("CI_DEC^%s minutes")), ftos_decimals(time, decs)) -#define count_minutes(time) count_fill(time, \ - ZCTX(_("CI_ZER^%d minutes")), /* zeroth */ \ - ZCTX(_("CI_FIR^%d minute")), /* first */ \ - ZCTX(_("CI_SEC^%d minutes")), /* minute */ \ - ZCTX(_("CI_THI^%d minutes")), /* third */ \ - ZCTX(_("CI_MUL^%d minutes"))) /* multi */ - -#define count_seconds_decs(time,decs) sprintf(ZCTX(_("CI_DEC^%s seconds")), ftos_decimals(time, decs)) -#define count_seconds(time) count_fill(time, \ - ZCTX(_("CI_ZER^%d seconds")), /* zeroth */ \ - ZCTX(_("CI_FIR^%d second")), /* first */ \ - ZCTX(_("CI_SEC^%d seconds")), /* second */ \ - ZCTX(_("CI_THI^%d seconds")), /* third */ \ - ZCTX(_("CI_MUL^%d seconds"))) /* multi */ - -string count_ordinal(int interval) -{ - // This function is designed primarily for the English language, it's impossible - // to accomodate all languages unless we do a specific function for each one... - // and since that's not technically feasible/practical, this is all we've got folks. - - // Basically, it just allows you to represent a number or count in different ways - // depending on the number... like, with count_ordinal you can provide integers - // and retrieve 1st, 2nd, 3rd, nth ordinal numbers in a clean and simple way. - if(floor((interval % 100)/10) * 10 != 10) // examples: 12th, 111th, 213th will not execute this block - { - // otherwise, check normally for 1st,2nd,3rd insertions - switch(interval % 10) - { - case 1: return sprintf(_("%dst"), interval); - case 2: return sprintf(_("%dnd"), interval); - case 3: return sprintf(_("%drd"), interval); - default: return sprintf(_("%dth"), interval); - } - } - else { return sprintf(_("%dth"), interval); } - - return ""; -} - -string count_fill(float interval, string zeroth, string first, string second, string third, string multi) -{ - // This function is designed primarily for the English language, it's impossible - // to accomodate all languages unless we do a specific function for each one... - // and since that's not technically feasible/practical, this is all we've got folks. - - // Here you can insert specific strings based on the interval number, so you could do - // i.e. count_seconds which outputs like this: - // 0 seconds - // 1 second - // 2 seconds - // 3 seconds - // etc... minutes, hours, days, etc. - - switch(floor(interval)) - { - case 0: return sprintf(zeroth, interval); - case 1: - { - if(interval == 1) // EXACTLY value of 1 - return sprintf(first, interval); - else - return sprintf(multi, interval); - } - case 2: return sprintf(second, interval); - case 3: return sprintf(third, interval); - default: return sprintf(multi, interval); - } - return ""; -} - -string process_time(float outputtype, float seconds) -{ - float tmp_hours = 0, tmp_minutes = 0, tmp_seconds = 0; - float tmp_years = 0, tmp_weeks = 0, tmp_days = 0; - - tmp_seconds = floor(seconds); - - if(tmp_seconds) - { - tmp_minutes = floor(tmp_seconds / 60); - - if(tmp_minutes) - { - tmp_seconds -= (tmp_minutes * 60); - tmp_hours = floor(tmp_minutes / 60); - - if(tmp_hours) - { - tmp_minutes -= (tmp_hours * 60); - tmp_days = floor(tmp_hours / 24); - - if(tmp_days) - { - tmp_hours -= (tmp_days * 24); - tmp_weeks = floor(tmp_days / 7); - - if(tmp_weeks) - { - tmp_days -= (tmp_weeks * 7); - tmp_years = floor(tmp_weeks / 52); - } - } - } - } - } - - switch(outputtype) - { - case 1: return sprintf("%02d:%02d:%02d", tmp_hours, tmp_minutes, tmp_seconds); - case 2: - { - string output = ""; - - output = count_seconds(tmp_seconds); - - if(tmp_minutes) - { - output = sprintf( - "%s%s", - count_minutes(tmp_minutes), - ((output != "") ? sprintf(", %s", output) : "")); - } - - if(tmp_hours) - { - output = sprintf( - "%s%s", - count_hours(tmp_hours), - ((output != "") ? sprintf(", %s", output) : "")); - } - - if(tmp_days) - { - output = sprintf( - "%s%s", - count_days(tmp_days), - ((output != "") ? sprintf(", %s", output) : "")); - } - - if(tmp_weeks) - { - output = sprintf( - "%s%s", - count_weeks(tmp_weeks), - ((output != "") ? sprintf(", %s", output) : "")); - } - - if(tmp_years) - { - output = sprintf( - "%s%s", - count_years(tmp_years), - ((output != "") ? sprintf(", %s", output) : "")); - } - - return output; - } - case 3: - { - string output = ""; - - output = count_hours(tmp_hours); - - if(tmp_weeks) { tmp_days += (tmp_weeks * 7); } - if(tmp_years) { tmp_days += (tmp_years * 365); } - if(tmp_days) - { - output = sprintf( - "%s%s", - count_days(tmp_days), - ((output != "") ? sprintf(", %s", output) : "")); - } - - return output; - } - } - return ""; -} -#endif diff --git a/qcsrc/common/notifications.qc b/qcsrc/common/notifications.qc index 31f7e864c..2d4691021 100644 --- a/qcsrc/common/notifications.qc +++ b/qcsrc/common/notifications.qc @@ -5,7 +5,6 @@ #include "../dpdefs/dpextensions.qh" #include "constants.qh" #include "teams.qh" - #include "counting.qh" #include "../server/autocvars.qh" #include "../server/constants.qh" #include "../server/defs.qh" diff --git a/qcsrc/common/util.qc b/qcsrc/common/util.qc index c1ae4ad1a..56d64f561 100644 --- a/qcsrc/common/util.qc +++ b/qcsrc/common/util.qc @@ -2245,30 +2245,6 @@ float u8_strsize(string s) return l; } -// translation helpers -string language_filename(string s) -{ - string fn; - float fh; - fn = prvm_language; - if(fn == "" || fn == "dump") - return s; - fn = strcat(s, ".", fn); - if((fh = fopen(fn, FILE_READ)) >= 0) - { - fclose(fh); - return fn; - } - return s; -} -string CTX(string s) -{ - float p = strstrofs(s, "^", 0); - if(p < 0) - return s; - return substring(s, p+1, -1); -} - // x-encoding (encoding as zero length invisible string) const string XENCODE_2 = "xX"; const string XENCODE_22 = "0123456789abcdefABCDEF"; diff --git a/qcsrc/common/util.qh b/qcsrc/common/util.qh index 995d882f6..87aa3351c 100644 --- a/qcsrc/common/util.qh +++ b/qcsrc/common/util.qh @@ -223,12 +223,6 @@ float vercmp(string v1, string v2); float u8_strsize(string s); -// translation helpers -string prvm_language; -string language_filename(string s); -string CTX(string s); -#define ZCTX(s) strzone(CTX(s)) - // x-encoding (encoding as zero length invisible string) // encodes approx. 14 bits into 5 bytes of color code string const float XENCODE_MAX = 21295; // 2*22*22*22-1 diff --git a/qcsrc/lib/Counting.qh b/qcsrc/lib/Counting.qh new file mode 100644 index 000000000..cd0604bf5 --- /dev/null +++ b/qcsrc/lib/Counting.qh @@ -0,0 +1,223 @@ +#ifndef COUNTING_H +#define COUNTING_H + +#include "I18N.qh" + +// =============================================== +// Time processing and counting functions/macros +// =============================================== + +#define count_years_decs(time,decs) sprintf(ZCTX(_("CI_DEC^%s years")), ftos_decimals(time, decs)) +#define count_years(time) count_fill(time, \ + ZCTX(_("CI_ZER^%d years")), /* zeroth */ \ + ZCTX(_("CI_FIR^%d year")), /* first */ \ + ZCTX(_("CI_SEC^%d years")), /* year */ \ + ZCTX(_("CI_THI^%d years")), /* third */ \ + ZCTX(_("CI_MUL^%d years"))) /* multi */ + +#define count_weeks_decs(time,decs) sprintf(ZCTX(_("CI_DEC^%s weeks")), ftos_decimals(time, decs)) +#define count_weeks(time) count_fill(time, \ + ZCTX(_("CI_ZER^%d weeks")), /* zeroth */ \ + ZCTX(_("CI_FIR^%d week")), /* first */ \ + ZCTX(_("CI_SEC^%d weeks")), /* week */ \ + ZCTX(_("CI_THI^%d weeks")), /* third */ \ + ZCTX(_("CI_MUL^%d weeks"))) /* multi */ + +#define count_days_decs(time,decs) sprintf(ZCTX(_("CI_DEC^%s days")), ftos_decimals(time, decs)) +#define count_days(time) count_fill(time, \ + ZCTX(_("CI_ZER^%d days")), /* zeroth */ \ + ZCTX(_("CI_FIR^%d day")), /* first */ \ + ZCTX(_("CI_SEC^%d days")), /* day */ \ + ZCTX(_("CI_THI^%d days")), /* third */ \ + ZCTX(_("CI_MUL^%d days"))) /* multi */ + +#define count_hours_decs(time,decs) sprintf(ZCTX(_("CI_DEC^%s hours")), ftos_decimals(time, decs)) +#define count_hours(time) count_fill(time, \ + ZCTX(_("CI_ZER^%d hours")), /* zeroth */ \ + ZCTX(_("CI_FIR^%d hour")), /* first */ \ + ZCTX(_("CI_SEC^%d hours")), /* hour */ \ + ZCTX(_("CI_THI^%d hours")), /* third */ \ + ZCTX(_("CI_MUL^%d hours"))) /* multi */ + + +#define count_minutes_decs(time,decs) sprintf(ZCTX(_("CI_DEC^%s minutes")), ftos_decimals(time, decs)) +#define count_minutes(time) count_fill(time, \ + ZCTX(_("CI_ZER^%d minutes")), /* zeroth */ \ + ZCTX(_("CI_FIR^%d minute")), /* first */ \ + ZCTX(_("CI_SEC^%d minutes")), /* minute */ \ + ZCTX(_("CI_THI^%d minutes")), /* third */ \ + ZCTX(_("CI_MUL^%d minutes"))) /* multi */ + +#define count_seconds_decs(time,decs) sprintf(ZCTX(_("CI_DEC^%s seconds")), ftos_decimals(time, decs)) +#define count_seconds(time) count_fill(time, \ + ZCTX(_("CI_ZER^%d seconds")), /* zeroth */ \ + ZCTX(_("CI_FIR^%d second")), /* first */ \ + ZCTX(_("CI_SEC^%d seconds")), /* second */ \ + ZCTX(_("CI_THI^%d seconds")), /* third */ \ + ZCTX(_("CI_MUL^%d seconds"))) /* multi */ + +string count_ordinal(int interval) +{ + // This function is designed primarily for the English language, it's impossible + // to accomodate all languages unless we do a specific function for each one... + // and since that's not technically feasible/practical, this is all we've got folks. + + // Basically, it just allows you to represent a number or count in different ways + // depending on the number... like, with count_ordinal you can provide integers + // and retrieve 1st, 2nd, 3rd, nth ordinal numbers in a clean and simple way. + if(floor((interval % 100)/10) * 10 != 10) // examples: 12th, 111th, 213th will not execute this block + { + // otherwise, check normally for 1st,2nd,3rd insertions + switch(interval % 10) + { + case 1: return sprintf(_("%dst"), interval); + case 2: return sprintf(_("%dnd"), interval); + case 3: return sprintf(_("%drd"), interval); + default: return sprintf(_("%dth"), interval); + } + } + else { return sprintf(_("%dth"), interval); } + + return ""; +} + +string count_fill(float interval, string zeroth, string first, string second, string third, string multi) +{ + // This function is designed primarily for the English language, it's impossible + // to accomodate all languages unless we do a specific function for each one... + // and since that's not technically feasible/practical, this is all we've got folks. + + // Here you can insert specific strings based on the interval number, so you could do + // i.e. count_seconds which outputs like this: + // 0 seconds + // 1 second + // 2 seconds + // 3 seconds + // etc... minutes, hours, days, etc. + + switch(floor(interval)) + { + case 0: return sprintf(zeroth, interval); + case 1: + { + if(interval == 1) // EXACTLY value of 1 + return sprintf(first, interval); + else + return sprintf(multi, interval); + } + case 2: return sprintf(second, interval); + case 3: return sprintf(third, interval); + default: return sprintf(multi, interval); + } + return ""; +} + +string process_time(float outputtype, float seconds) +{ + float tmp_hours = 0, tmp_minutes = 0, tmp_seconds = 0; + float tmp_years = 0, tmp_weeks = 0, tmp_days = 0; + + tmp_seconds = floor(seconds); + + if(tmp_seconds) + { + tmp_minutes = floor(tmp_seconds / 60); + + if(tmp_minutes) + { + tmp_seconds -= (tmp_minutes * 60); + tmp_hours = floor(tmp_minutes / 60); + + if(tmp_hours) + { + tmp_minutes -= (tmp_hours * 60); + tmp_days = floor(tmp_hours / 24); + + if(tmp_days) + { + tmp_hours -= (tmp_days * 24); + tmp_weeks = floor(tmp_days / 7); + + if(tmp_weeks) + { + tmp_days -= (tmp_weeks * 7); + tmp_years = floor(tmp_weeks / 52); + } + } + } + } + } + + switch(outputtype) + { + case 1: return sprintf("%02d:%02d:%02d", tmp_hours, tmp_minutes, tmp_seconds); + case 2: + { + string output = ""; + + output = count_seconds(tmp_seconds); + + if(tmp_minutes) + { + output = sprintf( + "%s%s", + count_minutes(tmp_minutes), + ((output != "") ? sprintf(", %s", output) : "")); + } + + if(tmp_hours) + { + output = sprintf( + "%s%s", + count_hours(tmp_hours), + ((output != "") ? sprintf(", %s", output) : "")); + } + + if(tmp_days) + { + output = sprintf( + "%s%s", + count_days(tmp_days), + ((output != "") ? sprintf(", %s", output) : "")); + } + + if(tmp_weeks) + { + output = sprintf( + "%s%s", + count_weeks(tmp_weeks), + ((output != "") ? sprintf(", %s", output) : "")); + } + + if(tmp_years) + { + output = sprintf( + "%s%s", + count_years(tmp_years), + ((output != "") ? sprintf(", %s", output) : "")); + } + + return output; + } + case 3: + { + string output = ""; + + output = count_hours(tmp_hours); + + if(tmp_weeks) { tmp_days += (tmp_weeks * 7); } + if(tmp_years) { tmp_days += (tmp_years * 365); } + if(tmp_days) + { + output = sprintf( + "%s%s", + count_days(tmp_days), + ((output != "") ? sprintf(", %s", output) : "")); + } + + return output; + } + } + return ""; +} +#endif diff --git a/qcsrc/lib/I18N.qh b/qcsrc/lib/I18N.qh new file mode 100644 index 000000000..ab9aa7d20 --- /dev/null +++ b/qcsrc/lib/I18N.qh @@ -0,0 +1,32 @@ +#ifndef I18N_H +#define I18N_H + +// translation helpers +string prvm_language; + +string language_filename(string s) +{ + string fn = prvm_language; + if (fn == "" || fn == "dump") + return s; + fn = strcat(s, ".", fn); + int fh = fopen(fn, FILE_READ); + if (fh >= 0) + { + fclose(fh); + return fn; + } + return s; +} + +string CTX(string s) +{ + int p = strstrofs(s, "^", 0); + if (p < 0) + return s; + return substring(s, p + 1, -1); +} + +#define ZCTX(s) strzone(CTX(s)) + +#endif diff --git a/qcsrc/lib/_all.inc b/qcsrc/lib/_all.inc index 931bc50b4..410eac721 100644 --- a/qcsrc/lib/_all.inc +++ b/qcsrc/lib/_all.inc @@ -1,5 +1,7 @@ #include "Accumulate.qh" +#include "Counting.qh" #include "Cvar.qh" +#include "I18N.qh" #include "Lazy.qh" #include "Nil.qh" #include "OO.qh" diff --git a/qcsrc/menu/xonotic/statslist.qc b/qcsrc/menu/xonotic/statslist.qc index db42177fb..3c4b09e14 100644 --- a/qcsrc/menu/xonotic/statslist.qc +++ b/qcsrc/menu/xonotic/statslist.qc @@ -1,4 +1,3 @@ -#include "../../common/counting.qh" #include "../../common/playerstats.qh" #ifndef STATSLIST_H diff --git a/qcsrc/server/command/common.qc b/qcsrc/server/command/common.qc index 0bdc6672f..b303f4b33 100644 --- a/qcsrc/server/command/common.qc +++ b/qcsrc/server/command/common.qc @@ -5,7 +5,6 @@ #include "../scores.qh" #include "../../common/notifications.qh" -#include "../../common/counting.qh" // ==================================================== diff --git a/qcsrc/server/command/getreplies.qc b/qcsrc/server/command/getreplies.qc index 543f1db15..1371e8010 100644 --- a/qcsrc/server/command/getreplies.qc +++ b/qcsrc/server/command/getreplies.qc @@ -5,7 +5,6 @@ #include "../race.qh" #include "../../common/constants.qh" -#include "../../common/counting.qh" #include "../../common/mapinfo.qh" #include "../../common/util.qh" diff --git a/qcsrc/server/mutators/mutators_include.qc b/qcsrc/server/mutators/mutators_include.qc index 3129af92f..1286317eb 100644 --- a/qcsrc/server/mutators/mutators_include.qc +++ b/qcsrc/server/mutators/mutators_include.qc @@ -15,7 +15,6 @@ #include "../../common/nades.qh" #include "../../common/buffs.qh" #include "../../common/test.qh" - #include "../../common/counting.qh" #include "../../common/urllib.qh" #include "../../common/command/markup.qh" #include "../../common/command/rpn.qh"