Hello!
I am trying to write the code for internationalization. The functions I use
are the ones from C's parser flow (dgettext, setlocale, etc).
I never worked with gettext (as a bash command) before, and I have some
trouble understanding how I automatically generate the .mo files and put
them into /usr/local/share/locale (where the code from the
examples/c/bisthromatic hints they should be found). My understanding is
that from the .po files I have to generate .mo files, and these are used by
the programs generated with Bison.
If I try to run "sudo make install" in the po directory I get this error:
[...]
/usr/bin/install: cannot stat './bg.gmo': No such file or directory
installing ./bg.gmo as /usr/local/share/locale/bg/LC_MESSAGES/bison.mo
[...]
and so on for each language file. After the command, no files exist in the
LC_MESSAGES directories.
If I run make update-po or update-gmo, I also get errors for missing files.
If I create a .mo file by hand, using msgfmt, and then move it
into /usr/local/share/locale/<language>/LC_MESSAGES/, the output gets
translated as expected.
The second problem is that I expected dgettext to receive the argument
"bison-runtime", like in C, not "bison", as it happens now in D. If I use
"bison-runtime" the messages remain in English.
Here [1] (and also as attachments) is a work in progress for this task,
with the mention that examples/d/c/calc/calc.y is modified just for testing
reasons, it will not be changed in the official commit.
Example of output with LANG=ro_RO.UTF-8:
~/bison/examples/d/calc$ ./calc
5 +
5 5
1.4-2.0: eroare de sintaxă, end of line neaşteptat, aştept + sau - sau (
sau number
2.3: eroare de sintaxă, number neaşteptat
Adela
[1] https://github.com/adelavais/bison/tree/internationalisation-gettext
From 15d821087a1117409064fff3252d25d959848cb8 Mon Sep 17 00:00:00 2001
From: Adela Vais <[email protected]>
Date: Sat, 28 Nov 2020 21:09:39 +0200
Subject: [PATCH for Dlang support 1/2] added dgettext
---
data/skeletons/lalr1.d | 49 ++++++++++++++++++++++++++++++++++--------
1 file changed, 40 insertions(+), 9 deletions(-)
diff --git a/data/skeletons/lalr1.d b/data/skeletons/lalr1.d
index d126d499..854cc463 100644
--- a/data/skeletons/lalr1.d
+++ b/data/skeletons/lalr1.d
@@ -41,6 +41,8 @@ version(D_Version2) {
]b4_percent_code_get([[imports]])[
import std.format;
+extern(C) char* dgettext(const char*, const char*);
+
/**
* A Bison parser, automatically generated from <tt>]m4_bpatsubst(b4_file_name, [^"\(.*\)"$], [\1])[</tt>.
*
@@ -704,20 +706,49 @@ m4_popdef([b4_at_dollar])])dnl
immutable int argmax = 5;
SymbolKind[] yyarg = new SymbolKind[argmax];
int yycount = yysyntaxErrorArguments(yyctx, yyarg, argmax);
- string res = "syntax error, unexpected ";
- res ~= format!"%s"(yyarg[0]);
- if (yycount < argmax + 1)
+ string[] yystr = new string[yycount];
+ for (int yyi = 0; yyi < yycount; yyi++)
+ yystr[yyi] = format!"%s"(yyarg[yyi]);
+ string res, yyformat;
+ char *text;
+ import std.string;
+ import std.conv;
+ switch (yycount)
{
- for (int yyi = 1; yyi < yycount; yyi++)
- {
- res ~= yyi == 1 ? ", expecting " : " or ";
- res ~= format!"%s"(SymbolKind(yyarg[yyi]));
- }
+ case 1:
+ text = dgettext("bison-runtime", "syntax error, unexpected %s");
+ yyformat = to!string(text);
+ res = format(yyformat, yystr[0]);
+ break;
+ case 2:
+ text = dgettext("bison-runtime", "syntax error, unexpected %s, expecting %s");
+ yyformat = to!string(text);
+ res = format(yyformat, yystr[0], yystr[1]);
+ break;
+ case 3:
+ text = dgettext("bison-runtime", "syntax error, unexpected %s, expecting %s or %s");
+ yyformat = to!string(text);
+ res = format(yyformat, yystr[0], yystr[1], yystr[2]);
+ break;
+ case 4:
+ text = dgettext("bison-runtime", "syntax error, unexpected %s, expecting %s or %s or %s");
+ yyformat = to!string(text);
+ res = format(yyformat, yystr[0], yystr[1], yystr[2], yystr[3]);
+ break;
+ case 5:
+ text = dgettext("bison-runtime", "syntax error, unexpected %s, expecting %s or %s or %s or %s");
+ yyformat = to!string(text);
+ res = format(yyformat, yystr[0], yystr[1], yystr[2], yystr[3], yystr[4]);
+ break;
+ default:
+ text = dgettext("bison-runtime", "syntax error");
+ res = to!string(text);
+ break;
}
yyerror(]b4_locations_if([yyctx.getLocation(), ])[res);
}]],
[[simple]], [[
- yyerror(]b4_locations_if([yyctx.getLocation(), ])["syntax error");]])[
+ yyerror(]b4_locations_if([yyctx.getLocation(), ])[dgettext("bison-runtime", "syntax error"));]])[
}
]b4_parse_error_bmatch(
--
2.17.1
From 79b46bd91b0fa1cdd29c08e96cd8f407a3c5c5d3 Mon Sep 17 00:00:00 2001
From: Adela Vais <[email protected]>
Date: Mon, 30 Nov 2020 13:52:45 +0200
Subject: [PATCH for Dlang support 2/2] added a temporary test in
examples/d/calc/calc.y
---
data/skeletons/lalr1.d | 14 +++++++-------
examples/d/calc/calc.y | 18 ++++++++++++++++++
2 files changed, 25 insertions(+), 7 deletions(-)
diff --git a/data/skeletons/lalr1.d b/data/skeletons/lalr1.d
index 854cc463..fd9adad1 100644
--- a/data/skeletons/lalr1.d
+++ b/data/skeletons/lalr1.d
@@ -716,39 +716,39 @@ m4_popdef([b4_at_dollar])])dnl
switch (yycount)
{
case 1:
- text = dgettext("bison-runtime", "syntax error, unexpected %s");
+ text = dgettext("bison", "syntax error, unexpected %s");
yyformat = to!string(text);
res = format(yyformat, yystr[0]);
break;
case 2:
- text = dgettext("bison-runtime", "syntax error, unexpected %s, expecting %s");
+ text = dgettext("bison", "syntax error, unexpected %s, expecting %s");
yyformat = to!string(text);
res = format(yyformat, yystr[0], yystr[1]);
break;
case 3:
- text = dgettext("bison-runtime", "syntax error, unexpected %s, expecting %s or %s");
+ text = dgettext("bison", "syntax error, unexpected %s, expecting %s or %s");
yyformat = to!string(text);
res = format(yyformat, yystr[0], yystr[1], yystr[2]);
break;
case 4:
- text = dgettext("bison-runtime", "syntax error, unexpected %s, expecting %s or %s or %s");
+ text = dgettext("bison", "syntax error, unexpected %s, expecting %s or %s or %s");
yyformat = to!string(text);
res = format(yyformat, yystr[0], yystr[1], yystr[2], yystr[3]);
break;
case 5:
- text = dgettext("bison-runtime", "syntax error, unexpected %s, expecting %s or %s or %s or %s");
+ text = dgettext("bison", "syntax error, unexpected %s, expecting %s or %s or %s or %s");
yyformat = to!string(text);
res = format(yyformat, yystr[0], yystr[1], yystr[2], yystr[3], yystr[4]);
break;
default:
- text = dgettext("bison-runtime", "syntax error");
+ text = dgettext("bison", "syntax error");
res = to!string(text);
break;
}
yyerror(]b4_locations_if([yyctx.getLocation(), ])[res);
}]],
[[simple]], [[
- yyerror(]b4_locations_if([yyctx.getLocation(), ])[dgettext("bison-runtime", "syntax error"));]])[
+ yyerror(]b4_locations_if([yyctx.getLocation(), ])[dgettext("bison", "syntax error"));]])[
}
]b4_parse_error_bmatch(
diff --git a/examples/d/calc/calc.y b/examples/d/calc/calc.y
index 24ec85d4..86b9de66 100644
--- a/examples/d/calc/calc.y
+++ b/examples/d/calc/calc.y
@@ -180,10 +180,28 @@ if (isInputRange!R && is(ElementType!R : dchar))
}
}
+extern(C) char * bindtextdomain (const char * domainname, const char * dirname);
+extern(C) char * textdomain (const char * domainname);
+
int main()
{
+ import core.stdc.locale;
+
+ // Set up internationalization.
+ setlocale (LC_ALL, "");
+
+ // Use Bison's standard translation catalogue for error messages
+ // (the generated messages).
+ bindtextdomain ("bison-runtime", "/usr/local/share/locale");
+ bindtextdomain ("bison", "/usr/local/share/locale");
+
+ textdomain ("bison");
+ //printf("%s\n", dgettext("bison", "syntax error"));
+
auto l = calcLexer(stdin);
auto p = new Calc(l);
p.parse();
return l.exit_status;
+
+ //return 0;
}
--
2.17.1