java: make the syntax error format string translatable

The error format should be translated, but contrary to the case of
C/C++, we cannot just depend on macros to adapt on the
presence/absence of '_'.  Let's consider that the message format is to
be translated iff there are some internationalized tokens.

* src/output.c (prepare_symbol_names): Define b4_has_translations.
* data/skeletons/java.m4 (b4_trans): New.
* data/skeletons/lalr1.java: Use it to emit translatable or not the
format string.
This commit is contained in:
Akim Demaille
2020-02-07 08:40:35 +01:00
parent 088356cb2f
commit 18a7cfc7cf
3 changed files with 24 additions and 9 deletions

View File

@@ -226,6 +226,13 @@ m4_define([b4_symbol_translate],
[[_($1)]]) [[_($1)]])
# b4_trans(STRING)
# ----------------
# Translate a symbol. Avoid collision with b4_translate.
m4_define([b4_trans],
[m4_if(b4_has_translations, 0, [$1], [_($1)])])
# b4_symbol_value(VAL, [SYMBOL-NUM], [TYPE-TAG]) # b4_symbol_value(VAL, [SYMBOL-NUM], [TYPE-TAG])
# ---------------------------------------------- # ----------------------------------------------

View File

@@ -945,18 +945,18 @@ b4_dollar_popdef[]dnl
String[] yystr = new String[yycount]; String[] yystr = new String[yycount];
for (int yyi = 0; yyi < yycount; ++yyi) for (int yyi = 0; yyi < yycount; ++yyi)
yystr[yyi] = yysymbolName (yyarg[yyi]); yystr[yyi] = yysymbolName (yyarg[yyi]);
MessageFormat yyformat; String yyformat;
switch (yycount) switch (yycount)
{ {
default: default:
case 0: yyformat = new MessageFormat ("syntax error"); break; case 0: yyformat = ]b4_trans(["syntax error"])[; break;
case 1: yyformat = new MessageFormat ("syntax error, unexpected {0}"); break; case 1: yyformat = ]b4_trans(["syntax error, unexpected {0}"])[; break;
case 2: yyformat = new MessageFormat ("syntax error, unexpected {0}, expecting {1}"); break; case 2: yyformat = ]b4_trans(["syntax error, unexpected {0}, expecting {1}"])[; break;
case 3: yyformat = new MessageFormat ("syntax error, unexpected {0}, expecting {1} or {2}"); break; case 3: yyformat = ]b4_trans(["syntax error, unexpected {0}, expecting {1} or {2}"])[; break;
case 4: yyformat = new MessageFormat ("syntax error, unexpected {0}, expecting {1} or {2} or {3}"); break; case 4: yyformat = ]b4_trans(["syntax error, unexpected {0}, expecting {1} or {2} or {3}"])[; break;
case 5: yyformat = new MessageFormat ("syntax error, unexpected {0}, expecting {1} or {2} or {3} or {4}"); break; case 5: yyformat = ]b4_trans(["syntax error, unexpected {0}, expecting {1} or {2} or {3} or {4}"])[; break;
} }
return yyformat.format (yystr); return new MessageFormat (yyformat).format (yystr);
} }
]])[ ]])[
return "syntax error"; return "syntax error";

View File

@@ -194,6 +194,7 @@ prepare_symbol_names (char const *muscle_name)
{ {
/* We assume that the table will be output starting at column 2. */ /* We assume that the table will be output starting at column 2. */
const bool quote = STREQ (muscle_name, "tname"); const bool quote = STREQ (muscle_name, "tname");
bool has_translations = false;
int j = 2; int j = 2;
struct quoting_options *qo = clone_quoting_options (0); struct quoting_options *qo = clone_quoting_options (0);
set_quoting_style (qo, c_quoting_style); set_quoting_style (qo, c_quoting_style);
@@ -219,7 +220,10 @@ prepare_symbol_names (char const *muscle_name)
if (i) if (i)
obstack_1grow (&format_obstack, ' '); obstack_1grow (&format_obstack, ' ');
if (!quote && symbols[i]->translatable) if (!quote && symbols[i]->translatable)
obstack_sgrow (&format_obstack, "]b4_symbol_translate(["); {
has_translations = true;
obstack_sgrow (&format_obstack, "]b4_symbol_translate([");
}
obstack_escape (&format_obstack, cp); obstack_escape (&format_obstack, cp);
if (!quote && symbols[i]->translatable) if (!quote && symbols[i]->translatable)
obstack_sgrow (&format_obstack, "])["); obstack_sgrow (&format_obstack, "])[");
@@ -232,6 +236,10 @@ prepare_symbol_names (char const *muscle_name)
/* Finish table and store. */ /* Finish table and store. */
muscle_insert (muscle_name, obstack_finish0 (&format_obstack)); muscle_insert (muscle_name, obstack_finish0 (&format_obstack));
/* Announce whether translation support is needed. */
if (!quote)
MUSCLE_INSERT_BOOL ("has_translations", has_translations);
} }