Compare commits

...

7 Commits

Author SHA1 Message Date
Dianne Skoll
bc7c57e53b Add another translation-propagation test.
All checks were successful
Remind unit tests / tests (push) Successful in 27s
2024-12-11 20:10:11 -05:00
Dianne Skoll
88aacb3905 Get two-way propagation working properly. 2024-12-11 20:08:09 -05:00
Dianne Skoll
a894076bfc Verify two-way correspondence between translation table and system variables. 2024-12-11 19:48:19 -05:00
Dianne Skoll
82e068fcca Refactor SetSysVar. 2024-12-11 19:22:30 -05:00
Dianne Skoll
a119d97539 Make mapping between translatable system variables and TRANSLATE table table-driven. 2024-12-11 19:15:44 -05:00
Dianne Skoll
01afb63a3d Sent translations with only the first month, in a multi-month (-pN) output. 2024-12-11 18:07:48 -05:00
Dianne Skoll
54fccabdfe Escape the result of translation, in case a bad translation file includes HTML special characters. 2024-12-11 17:15:01 -05:00
11 changed files with 438 additions and 67 deletions

View File

@@ -343,6 +343,11 @@ The line following \fB# translations\fR is a JSON object (on a single
line) containing all of the entries of the translation table. Back-ends that
are not interested in the translation table can simply read and discard
the next line.
.RS
If \fBRemind\fR sends data for multiple months, then only the first month
will include the translation table.
.RE
.TP
.B # rem2ps begin
This line signifies the start of calendar data. Back-ends can search
@@ -447,6 +452,10 @@ This line signifies that the next line will be the translation table.
The line following \fB# translations\fR is a JSON object (on a single
line) containing all of the entries of the translation table. Back-ends that
are not interested in the translation table can simply read and discard
.RS
If \fBRemind\fR sends data for multiple months, then only the first month
will include the translation table.
.RE
.TP
.B # rem2ps2 begin
This line signifies the start of calendar data. Back-ends can search
@@ -678,7 +687,8 @@ The year of the following month. (The same as \fByear\fR unless the
current month is December.)
.TP
.B translations \fR{\fIobject\fR}
A complete dump of the Remind translation table.
A complete dump of the Remind translation table. In output for multiple
months, the translation table is included only with the first month.
.TP
.B entries \fR[\fIarray\fR]
The \fBentries\fR key consists of an array of calendar entries; each

View File

@@ -5727,8 +5727,10 @@ then \fBRemind\fR \fIalso\fR makes a corresponding translation
table entry automatically. This is done for all of the translation-related
system variables \fIexcept for\fR \fB$Hplu\fR and \fB$Mplu\fR.
.PP
The converse does not apply; creating a translation table entry for
"December" does not automatically set \fB$December\fR.
The converse applies too; creating a translation table for
"December" automatically sets \fB$December\fR. And if you invoke
\fBTRANSLATE CLEAR\fR, then all translation-related system variables
are set to their default values as well.
.PP
The translation table always contains a special entry \fBLANGID\fR whose
default value is \fBen\fR. Translators are encouraged to add a \fBLANGID\fR

View File

@@ -690,7 +690,7 @@ sub draw_day_cell
} else {
$img = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAGQAAABkABchkaRQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAC6SURBVDiNpdNNbsIwFATgL0HKolchHKBX6yFaBOEyoPYUabvOIVKJRaCL2JX5TRNGGvnJ8ozGz89cYoElPvET+BX2yivn/1Bggw5HHMKa1h2qcPZC/JEIhvh+brIZIY6sorhMYo9hh3KGFzzfa84NZNjDt9OG/ZcH1BlaPE1IAG0+URhxzNGESKPFaHJs9Q0Ziww7HnvGeXSrJhis0jiFfjwnj3I0WRv+TKtr4hQl3lDrZ6QN9Wt654hfWfGDmBpUwDkAAAAASUVORK5CYII=';
}
$title = t('New Moon');
$title = escape_html(t('New Moon'));
$alt = 'new';
} elsif ($phase == 1) {
if ($Options{pngs}) {
@@ -698,7 +698,7 @@ sub draw_day_cell
} else {
$img = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAGQAAABkABchkaRQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAADfSURBVDiNndM9TsNAFATgzy5yjZSAE85JBygETgENUPF3iBCitHAFQkcIhZ/Ryn9gRlrZmp2Z3ef3TBOHOMULPrDBMrhpi/4HI5xjix2+4nmJRbx/Yh7ahvkpRPVV4QDXwT3UQy46zGkAZDgK/iytefvHgCrkJsqZUH6cLnNbABSxd5Jhhf1IbkMXv8Qux7hH1Ic1xvk/jBWy6gavumvtwx7ectwZXkKh7MA95XgObeOtpI2U4zl0kGbpxgiPvwQUcXLrKFchc82f6Ur0PK49azOnmOI4TBu84zm4SV38DeIVYkrYJyNbAAAAAElFTkSuQmCC';
}
$title = t('First Quarter');
$title = escape_html(t('First Quarter'));
$alt = '1st';
} elsif ($phase == 2) {
if ($Options{pngs}) {
@@ -707,7 +707,7 @@ sub draw_day_cell
$img = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAGQAAABkABchkaRQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAADlSURBVDiNrdNBUsJAEAXQlyw4hq4hwWPqTixET6ELkZ16CcAq7oFLqXExjaYgQVNlV/Viev7/6XT/4TjGuME7PiLXUatb8N8xwB12SFjiIXIZtU/MAntEfgvQE4YtHxhiHpjXQ5H7uLhEcaLLAleBvd0Xx9Ha/BdyU+Q5OBV5OKmj7a4YBWdSyNPe4aKHAHkzqcQZNj3JgnNexqE8heyIAulffuFF3kTfIVbBVeu/xoXGGsn2TLJJ/mqkafNiINszySYZdbS90GHlvcgsWktY4TFy7ecxTdvIzahxHQLbyFXUqkPwF2ASRNYgB/PXAAAAAElFTkSuQmCC';
}
$alt = 'full';
$title = t('Full Moon');
$title = escape_html(t('Full Moon'));
} else {
if ($Options{pngs}) {
$img = smoosh($Options{imgbase}, 'lastquarter.png');
@@ -715,7 +715,7 @@ sub draw_day_cell
$img = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAGQAAABkABchkaRQAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAADmSURBVDiNndMxTsNAEIXhzy5yCyQ6FAgcE7oQheQWUAAl5BIkREoZrgB0GFNkHBl7bURGsryaee/3jHeXdpxjghU+8InXyI0S+n0MMEeBEi+4jfV3vAvMQtsyL0J0j2GtViaeRRMyj8IlsgY8BSijE2Kur/hy09wHKMJrEolhwtwHKDHOsI4OLnoAXfl1jiNsOkR9keE4P8D4q4scbzg5xIxtjie709f1E7siC+9+Gx/8fxvPKtEsklcJSBdgWhcN8ByFR5z+AWgd5QpyE+OUWOJO+zJNU+Z6jHAdgHe7K73CuD5zFT9nCmRDIssCaAAAAABJRU5ErkJggg==';
}
$alt = 'last';
$title = t('Last Quarter');
$title = escape_html(t('Last Quarter'));
}
if ($Options{nostyle}) {
print("<div style=\"float: left\"><img border=\"0\" width=\"16\" height=\"16\" alt=\"$alt\" title=\"$title\" src=\"$img\">$msg</div>");

View File

@@ -996,19 +996,25 @@ static void DoSimpleCalendarOneMonth(void)
if (PsCal) {
FromDSE(DSEToday, &y, &m, &d);
if (PsCal == PSCAL_LEVEL1) {
SendTranslationTable(PsCal);
if (!DidAMonth) {
SendTranslationTable(PsCal);
}
printf("%s\n", PSBEGIN);
} else if (PsCal == PSCAL_LEVEL2) {
SendTranslationTable(PsCal);
if (!DidAMonth) {
SendTranslationTable(PsCal);
}
printf("%s\n", PSBEGIN2);
} else {
if (DidAMonth) {
printf(",\n");
}
printf("{\n");
printf("\"translations\":");
SendTranslationTable(PsCal);
printf(",");
if (!DidAMonth) {
printf("\"translations\":");
SendTranslationTable(PsCal);
printf(",");
}
}
if (PsCal < PSCAL_LEVEL3) {
printf("%s %d %d %d %d\n",

View File

@@ -997,7 +997,7 @@ static void InitializeVar(char const *str)
}
if (*varname == '$') {
r=SetSysVar(varname+1, &val);
r=SetSysVar(varname+1, &val, 1);
DestroyValue(val);
if (r) fprintf(ErrFp, GetErr(M_I_OPTION), GetErr(r));
return;

View File

@@ -113,7 +113,7 @@ int DoBanner (ParsePtr p);
int DoRun (ParsePtr p);
int DoExpr (ParsePtr p);
int DoTranslate (ParsePtr p);
int InsertTranslation(char const *orig, char const *translated);
int InsertTranslation(char const *orig, char const *translated, int propagate_to_sysvar);
void DumpTranslationTable(FILE *fp, int json);
int DoErrMsg (ParsePtr p);
int ClearGlobalOmits (void);
@@ -182,7 +182,7 @@ int GetValidHebDate (int yin, int min, int din, int adarbehave, int *mout, int *
int GetNextHebrewDate (int dsestart, int hm, int hd, int yahr, int adarbehave, int *ans);
int ComputeJahr (int y, int m, int d, int *ans);
int GetSysVar (char const *name, Value *val);
int SetSysVar (char const *name, Value *val);
int SetSysVar (char const *name, Value *val, int propagate_translation);
void DumpSysVarByName (char const *name);
int CalcMinsFromUTC (int dse, int tim, int *mins, int *isdst);
void FillParagraph (char const *s, DynamicBuffer *output);
@@ -267,7 +267,10 @@ void InitDedupeTable(void);
void InitVars(void);
void InitUserFunctions(void);
void ClearSysvarTranslations(void);
void PropagateTranslationToSysvar(char const *orig, char const *translated);
void InitTranslationTable(void);
void RemoveSysvarTranslation(char const *orig);
char const *GetTranslatedString(char const *orig);
int GetTranslatedStringTryingVariants(char const *orig, DynamicBuffer *out);
char const *GetErr(int r);

View File

@@ -100,6 +100,7 @@ ClearTranslationTable(void)
XlateItem *item;
XlateItem *next;
ClearSysvarTranslations();
item = hash_table_next(&TranslationTable, NULL);
while(item) {
next = hash_table_next(&TranslationTable, item);
@@ -205,7 +206,7 @@ InitTranslationTable(void)
fprintf(stderr, "Unable to initialize translation hash table: Out of memory. Exiting.\n");
exit(1);
}
InsertTranslation("LANGID", "en");
InsertTranslation("LANGID", "en", 1);
}
static XlateItem *
@@ -219,7 +220,7 @@ FindTranslation(char const *orig)
}
int
InsertTranslation(char const *orig, char const *translated)
InsertTranslation(char const *orig, char const *translated, int propagate_to_sysvar)
{
XlateItem *item = FindTranslation(orig);
if (item) {
@@ -229,11 +230,22 @@ InsertTranslation(char const *orig, char const *translated)
}
RemoveTranslation(item);
}
/* TRANSLATE "foo" "foo" means to remove the translation */
if (strcmp(orig, "LANGID") && (!strcmp(orig, translated))) {
if (propagate_to_sysvar) {
RemoveSysvarTranslation(orig);
}
return OK;
}
item = AllocateXlateItem(orig, translated);
if (!item) {
return E_NO_MEM;
}
hash_table_insert(&TranslationTable, item);
if (propagate_to_sysvar) {
PropagateTranslationToSysvar(orig, translated);
}
return OK;
}
@@ -359,9 +371,10 @@ DoTranslate(ParsePtr p)
XlateItem *item = FindTranslation(DBufValue(&orig));
if (item) {
RemoveTranslation(item);
RemoveSysvarTranslation(DBufValue(&orig));
}
if (!strcmp(DBufValue(&orig), "LANGID")) {
InsertTranslation("LANGID", "en");
InsertTranslation("LANGID", "en", 1);
}
r = OK;
}
@@ -374,7 +387,7 @@ DoTranslate(ParsePtr p)
DBufFree(&translated);
return r;
}
r = InsertTranslation(DBufValue(&orig), DBufValue(&translated));
r = InsertTranslation(DBufValue(&orig), DBufValue(&translated), 1);
DBufFree(&orig);
DBufFree(&translated);
return r;

153
src/var.c
View File

@@ -36,6 +36,7 @@ static int IntMin = INT_MIN;
static int IntMax = INT_MAX;
static hash_table VHashTbl;
static int SetSysVarHelper(SysVar *v, Value *value, int propagate_translation);
static unsigned int VarHashFunc(void *x)
{
@@ -624,7 +625,7 @@ int DoSet (Parser *p)
return E_EXPECTING_EOL;
}
DBufFree(&buf2);
if (*DBufValue(&buf) == '$') r = SetSysVar(DBufValue(&buf)+1, &v);
if (*DBufValue(&buf) == '$') r = SetSysVar(DBufValue(&buf)+1, &v, 1);
else r = SetVar(DBufValue(&buf), &v);
if (buf.len > VAR_NAME_LEN) {
Wprint("Warning: Variable name `%.*s...' truncated to `%.*s'",
@@ -957,60 +958,102 @@ static SysVar SysVarArr[] = {
{"Wednesday", 1, STR_TYPE, &DynamicDayName[2], 0, 0 }
};
typedef struct translatable_var {
char **var;
char const *word;
char const *sysvar_name;
} TranslatableVar;
static TranslatableVar translatables[] = {
{ &DynamicAgo, "ago", "Ago" },
{ &DynamicAm, "am", "Am" },
{ &DynamicAnd, "and", "And" },
{ &DynamicAt, "at", "At" },
{ &DynamicFromnow, "from now", "Fromnow" },
{ &DynamicHour, "hour", "Hour" },
{ &DynamicIs, "is", "Is" },
{ &DynamicMinute, "minute", "Minute" },
{ &DynamicNow, "now", "Now" },
{ &DynamicOn, "on", "On" },
{ &DynamicPm, "pm", "Pm" },
{ &DynamicToday, "today", "Today" },
{ &DynamicTomorrow, "tomorrow", "Tomorrow" },
{ &DynamicWas, "was", "Was" },
{ &DynamicMonthName[0], "January", "January" },
{ &DynamicMonthName[1], "February", "February" },
{ &DynamicMonthName[2], "March", "March" },
{ &DynamicMonthName[3], "April", "April" },
{ &DynamicMonthName[4], "May", "May" },
{ &DynamicMonthName[5], "June", "June" },
{ &DynamicMonthName[6], "July", "July" },
{ &DynamicMonthName[7], "August", "August" },
{ &DynamicMonthName[8], "September", "September" },
{ &DynamicMonthName[9], "October", "October" },
{ &DynamicMonthName[10], "November", "November" },
{ &DynamicMonthName[11], "December", "December" },
{ &DynamicDayName[0], "Monday", "Monday" },
{ &DynamicDayName[1], "Tuesday", "Tuesday" },
{ &DynamicDayName[2], "Wednesday", "Wednesday" },
{ &DynamicDayName[3], "Thursday", "Thursday" },
{ &DynamicDayName[4], "Friday", "Friday" },
{ &DynamicDayName[5], "Saturday", "Saturday" },
{ &DynamicDayName[6], "Sunday", "Sunday" },
};
#define NUMSYSVARS ( sizeof(SysVarArr) / sizeof(SysVar) )
static void DumpSysVar (char const *name, const SysVar *v);
static void HandleTranslatableVariable(char **var)
{
if (var == (char **) &DynamicAgo) InsertTranslation("ago", *var);
else if (var == (char **) &DynamicAm) InsertTranslation("am", *var);
else if (var == (char **) &DynamicAnd) InsertTranslation("and", *var);
else if (var == (char **) &DynamicAt) InsertTranslation("at", *var);
else if (var == (char **) &DynamicFromnow) InsertTranslation("from now", *var);
else if (var == (char **) &DynamicHour) InsertTranslation("hour", *var);
else if (var == (char **) &DynamicIs) InsertTranslation("is", *var);
else if (var == (char **) &DynamicMinute) InsertTranslation("minute", *var);
else if (var == (char **) &DynamicNow) InsertTranslation("now", *var);
else if (var == (char **) &DynamicOn) InsertTranslation("on", *var);
else if (var == (char **) &DynamicPm) InsertTranslation("pm", *var);
else if (var == (char **) &DynamicToday) InsertTranslation("today", *var);
else if (var == (char **) &DynamicTomorrow) InsertTranslation("tomorrow", *var);
else if (var == (char **) &DynamicWas) InsertTranslation("was", *var);
else if (var == (char **) &DynamicMonthName[0]) InsertTranslation("January", *var);
else if (var == (char **) &DynamicMonthName[1]) InsertTranslation("February", *var);
else if (var == (char **) &DynamicMonthName[2]) InsertTranslation("March", *var);
else if (var == (char **) &DynamicMonthName[3]) InsertTranslation("April", *var);
else if (var == (char **) &DynamicMonthName[4]) InsertTranslation("May", *var);
else if (var == (char **) &DynamicMonthName[5]) InsertTranslation("June", *var);
else if (var == (char **) &DynamicMonthName[6]) InsertTranslation("July", *var);
else if (var == (char **) &DynamicMonthName[7]) InsertTranslation("August", *var);
else if (var == (char **) &DynamicMonthName[8]) InsertTranslation("September", *var);
else if (var == (char **) &DynamicMonthName[9]) InsertTranslation("October", *var);
else if (var == (char **) &DynamicMonthName[10]) InsertTranslation("November", *var);
else if (var == (char **) &DynamicMonthName[11]) InsertTranslation("December", *var);
else if (var == (char **) &DynamicDayName[0]) InsertTranslation("Monday", *var);
else if (var == (char **) &DynamicDayName[1]) InsertTranslation("Tuesday", *var);
else if (var == (char **) &DynamicDayName[2]) InsertTranslation("Wednesday", *var);
else if (var == (char **) &DynamicDayName[3]) InsertTranslation("Thursday", *var);
else if (var == (char **) &DynamicDayName[4]) InsertTranslation("Friday", *var);
else if (var == (char **) &DynamicDayName[5]) InsertTranslation("Saturday", *var);
else if (var == (char **) &DynamicDayName[6]) InsertTranslation("Sunday", *var);
size_t i;
for (i=0; i<sizeof(translatables) / sizeof(translatables[0]); i++) {
if (var == translatables[i].var) {
InsertTranslation(translatables[i].word, *(translatables[i].var), 0);
return;
}
}
}
/***************************************************************/
/* */
/* SetSysVar */
/* */
/* Set a system variable to the indicated value. */
/* */
/***************************************************************/
int SetSysVar(char const *name, Value *value)
void RemoveSysvarTranslation(char const *orig) {
PropagateTranslationToSysvar(orig, orig);
}
void PropagateTranslationToSysvar(char const *orig, char const *translated)
{
size_t i;
Value val;
for (i=0; i<sizeof(translatables) / sizeof(translatables[0]); i++) {
if (!strcmp(translatables[i].word, orig)) {
val.type = STR_TYPE;
val.v.str = StrDup(translated);
if (val.v.str) {
(void) SetSysVar(translatables[i].sysvar_name, &val, 0);
DestroyValue(val);
}
return;
}
}
}
void ClearSysvarTranslations(void)
{
Value val;
size_t i;
for (i=0; i<sizeof(translatables) / sizeof(translatables[0]); i++) {
val.type = STR_TYPE;
val.v.str = StrDup(translatables[i].word);
if (val.v.str) {
(void) SetSysVar(translatables[i].sysvar_name, &val, 0);
}
DestroyValue(val);
}
}
static int SetSysVarHelper(SysVar *v, Value *value, int propagate_translation)
{
int r;
SysVar *v = FindSysVar(name);
if (!v) return E_NOSUCH_VAR;
if (!v->modifiable) {
Eprint("%s: `$%s'", GetErr(E_CANT_MODIFY), name);
Eprint("%s: `$%s'", GetErr(E_CANT_MODIFY), v->name);
return E_CANT_MODIFY;
}
@@ -1035,7 +1078,9 @@ int SetSysVar(char const *name, Value *value)
v->been_malloced = 1;
*((char **) v->value) = value->v.str;
value->type = ERR_TYPE; /* So that it's not accidentally freed */
HandleTranslatableVariable((char **) v->value);
if (propagate_translation) {
HandleTranslatableVariable((char **) v->value);
}
} else {
if (v->max != ANY && value->v.val > v->max) return E_2HIGH;
if (v->min != ANY && value->v.val < v->min) return E_2LOW;
@@ -1044,6 +1089,20 @@ int SetSysVar(char const *name, Value *value)
return OK;
}
/***************************************************************/
/* */
/* SetSysVar */
/* */
/* Set a system variable to the indicated value. */
/* */
/***************************************************************/
int SetSysVar(char const *name, Value *value, int propagate_translation)
{
SysVar *v = FindSysVar(name);
if (!v) return E_NOSUCH_VAR;
return SetSysVarHelper(v, value, propagate_translation);
}
/***************************************************************/
/* */
/* GetSysVar */

View File

@@ -16106,10 +16106,130 @@ _("MOO") => "MOO"
_("meow") => "chirp"
_("Meow") => "Chirp"
_("MEOW") => "Chirp"
# Translation table
TRANSLATE "LANGID" "en"
TRANSLATE "June" "translated-June"
TRANSLATE "was" "translated-Was"
TRANSLATE "December" "translated-December"
TRANSLATE "October" "translated-October"
TRANSLATE "April" "translated-April"
TRANSLATE "at" "translated-At"
TRANSLATE "and" "translated-And"
TRANSLATE "Wednesday" "translated-Wednesday"
TRANSLATE "ago" "translated-Ago"
TRANSLATE "hour" "translated-Hour"
TRANSLATE "July" "translated-July"
TRANSLATE "minute" "translated-Minute"
TRANSLATE "September" "translated-September"
TRANSLATE "Saturday" "translated-Saturday"
TRANSLATE "Thursday" "translated-Thursday"
TRANSLATE "January" "translated-January"
TRANSLATE "Tuesday" "translated-Tuesday"
TRANSLATE "November" "translated-November"
TRANSLATE "tomorrow" "translated-Tomorrow"
TRANSLATE "today" "translated-Today"
TRANSLATE "is" "translated-Is"
TRANSLATE "from now" "translated-Fromnow"
TRANSLATE "Friday" "translated-Friday"
TRANSLATE "am" "translated-Am"
TRANSLATE "Sunday" "translated-Sunday"
TRANSLATE "Monday" "translated-Monday"
TRANSLATE "March" "translated-March"
TRANSLATE "pm" "translated-Pm"
TRANSLATE "August" "translated-August"
TRANSLATE "May" "translated-May"
TRANSLATE "February" "translated-February"
TRANSLATE "on" "translated-On"
TRANSLATE "now" "translated-Now"
$Ago is otherway-Ago
$Am is otherway-Am
$And is otherway-And
$At is otherway-At
$Fromnow is otherway-Fromnow
$Hour is otherway-Hour
$Is is otherway-Is
$Minute is otherway-Minute
$Now is otherway-Now
$On is otherway-On
$Pm is otherway-Pm
$Today is otherway-Today
$Tomorrow is otherway-Tomorrow
$Was is otherway-Was
$January is otherway-January
$February is otherway-February
$March is otherway-March
$April is otherway-April
$May is otherway-May
$June is otherway-June
$July is otherway-July
$August is otherway-August
$September is otherway-September
$October is otherway-October
$November is otherway-November
$December is otherway-December
$Monday is otherway-Monday
$Tuesday is otherway-Tuesday
$Wednesday is otherway-Wednesday
$Thursday is otherway-Thursday
$Friday is otherway-Friday
$Saturday is otherway-Saturday
$Sunday is otherway-Sunday
# Translation table
TRANSLATE "LANGID" "en"
$Ago is ago
$Am is am
$And is and
$At is at
$Fromnow is from now
$Hour is hour
$Is is is
$Minute is minute
$Now is now
$On is on
$Pm is pm
$Today is today
$Tomorrow is tomorrow
$Was is was
$January is January
$February is February
$March is March
$April is April
$May is May
$June is June
$July is July
$August is August
$September is September
$October is October
$November is November
$December is December
$Monday is Monday
$Tuesday is Tuesday
$Wednesday is Wednesday
$Thursday is Thursday
$Friday is Friday
$Saturday is Saturday
$Sunday is Sunday
set $Is "foo"
set $Was "bar"
TRANSLATE DUMP
# Translation table
TRANSLATE "LANGID" "en"
TRANSLATE "was" "bar"
TRANSLATE "is" "foo"
TRANSLATE "is" "is"
TRANSLATE "was"
TRANSLATE DUMP
# Translation table
TRANSLATE "LANGID" "en"
MSG $Is is [$Is]%
$Is is is
MSG $Was is [$Was]%
$Was is was
DEBUG -e
Var hash: total = 100141; maxlen = 5; avglen = 1.142
Func hash: total = 100016; maxlen = 5; avglen = 1.140
Dedup hash: total = 10000; maxlen = 7; avglen = 1.828
Trans hash: total = 4; maxlen = 1; avglen = 0.235
Trans hash: total = 1; maxlen = 1; avglen = 0.059
Expression nodes allocated: 300096
Expression nodes high-water: 300073
Expression nodes leaked: 0

View File

@@ -1274,6 +1274,163 @@ set a _("meow")
set a _("Meow")
set a _("MEOW")
# Check bidirectional connection between system variables and translation
# tables
DEBUG -x
TRANSLATE CLEAR
SET $Ago "translated-Ago"
SET $Am "translated-Am"
SET $And "translated-And"
SET $At "translated-At"
SET $Fromnow "translated-Fromnow"
SET $Hour "translated-Hour"
SET $Is "translated-Is"
SET $Minute "translated-Minute"
SET $Now "translated-Now"
SET $On "translated-On"
SET $Pm "translated-Pm"
SET $Today "translated-Today"
SET $Tomorrow "translated-Tomorrow"
SET $Was "translated-Was"
SET $January "translated-January"
SET $February "translated-February"
SET $March "translated-March"
SET $April "translated-April"
SET $May "translated-May"
SET $June "translated-June"
SET $July "translated-July"
SET $August "translated-August"
SET $September "translated-September"
SET $October "translated-October"
SET $November "translated-November"
SET $December "translated-December"
SET $Monday "translated-Monday"
SET $Tuesday "translated-Tuesday"
SET $Wednesday "translated-Wednesday"
SET $Thursday "translated-Thursday"
SET $Friday "translated-Friday"
SET $Saturday "translated-Saturday"
SET $Sunday "translated-Sunday"
TRANSLATE DUMP
TRANSLATE CLEAR
TRANSLATE "ago" "otherway-Ago"
TRANSLATE "am" "otherway-Am"
TRANSLATE "and" "otherway-And"
TRANSLATE "at" "otherway-At"
TRANSLATE "from now" "otherway-Fromnow"
TRANSLATE "hour" "otherway-Hour"
TRANSLATE "is" "otherway-Is"
TRANSLATE "minute" "otherway-Minute"
TRANSLATE "now" "otherway-Now"
TRANSLATE "on" "otherway-On"
TRANSLATE "pm" "otherway-Pm"
TRANSLATE "today" "otherway-Today"
TRANSLATE "tomorrow" "otherway-Tomorrow"
TRANSLATE "was" "otherway-Was"
TRANSLATE "January" "otherway-January"
TRANSLATE "February" "otherway-February"
TRANSLATE "March" "otherway-March"
TRANSLATE "April" "otherway-April"
TRANSLATE "May" "otherway-May"
TRANSLATE "June" "otherway-June"
TRANSLATE "July" "otherway-July"
TRANSLATE "August" "otherway-August"
TRANSLATE "September" "otherway-September"
TRANSLATE "October" "otherway-October"
TRANSLATE "November" "otherway-November"
TRANSLATE "December" "otherway-December"
TRANSLATE "Monday" "otherway-Monday"
TRANSLATE "Tuesday" "otherway-Tuesday"
TRANSLATE "Wednesday" "otherway-Wednesday"
TRANSLATE "Thursday" "otherway-Thursday"
TRANSLATE "Friday" "otherway-Friday"
TRANSLATE "Saturday" "otherway-Saturday"
TRANSLATE "Sunday" "otherway-Sunday"
MSG $Ago is [$Ago]%
MSG $Am is [$Am]%
MSG $And is [$And]%
MSG $At is [$At]%
MSG $Fromnow is [$Fromnow]%
MSG $Hour is [$Hour]%
MSG $Is is [$Is]%
MSG $Minute is [$Minute]%
MSG $Now is [$Now]%
MSG $On is [$On]%
MSG $Pm is [$Pm]%
MSG $Today is [$Today]%
MSG $Tomorrow is [$Tomorrow]%
MSG $Was is [$Was]%
MSG $January is [$January]%
MSG $February is [$February]%
MSG $March is [$March]%
MSG $April is [$April]%
MSG $May is [$May]%
MSG $June is [$June]%
MSG $July is [$July]%
MSG $August is [$August]%
MSG $September is [$September]%
MSG $October is [$October]%
MSG $November is [$November]%
MSG $December is [$December]%
MSG $Monday is [$Monday]%
MSG $Tuesday is [$Tuesday]%
MSG $Wednesday is [$Wednesday]%
MSG $Thursday is [$Thursday]%
MSG $Friday is [$Friday]%
MSG $Saturday is [$Saturday]%
MSG $Sunday is [$Sunday]%
TRANSLATE CLEAR
TRANSLATE DUMP
MSG $Ago is [$Ago]%
MSG $Am is [$Am]%
MSG $And is [$And]%
MSG $At is [$At]%
MSG $Fromnow is [$Fromnow]%
MSG $Hour is [$Hour]%
MSG $Is is [$Is]%
MSG $Minute is [$Minute]%
MSG $Now is [$Now]%
MSG $On is [$On]%
MSG $Pm is [$Pm]%
MSG $Today is [$Today]%
MSG $Tomorrow is [$Tomorrow]%
MSG $Was is [$Was]%
MSG $January is [$January]%
MSG $February is [$February]%
MSG $March is [$March]%
MSG $April is [$April]%
MSG $May is [$May]%
MSG $June is [$June]%
MSG $July is [$July]%
MSG $August is [$August]%
MSG $September is [$September]%
MSG $October is [$October]%
MSG $November is [$November]%
MSG $December is [$December]%
MSG $Monday is [$Monday]%
MSG $Tuesday is [$Tuesday]%
MSG $Wednesday is [$Wednesday]%
MSG $Thursday is [$Thursday]%
MSG $Friday is [$Friday]%
MSG $Saturday is [$Saturday]%
MSG $Sunday is [$Sunday]%
DEBUG +e
set $Is "foo"
set $Was "bar"
TRANSLATE DUMP
TRANSLATE "is" "is"
TRANSLATE "was"
TRANSLATE DUMP
MSG $Is is [$Is]%
MSG $Was is [$Was]%
DEBUG -e
# Output expression-node stats
DEBUG +s

View File

@@ -310009,3 +310009,4 @@ REM MSG Dedup-9996
REM MSG Dedup-9997
REM MSG Dedup-9998
REM MSG Dedup-9999
set $DedupeReminders 0