Re: [Bison-Announce] Bison 3.5.90 released [beta]
Akim Demaille <[email protected]>
| Newsgroups | gmane.comp.parsers.bison.bugs |
|---|---|
| Message-ID | <[email protected]> |
Hi Frank, > Le 19 avr. 2020 à 17:25, Frank Heckenbach <[email protected]> a écrit : > >>> it seems I have to define both >>> YYENABLE_NLS and ENABLE_NLS. The former is mentioned in the manual >>> (but only in conjunction with autoblah), the latter not at all. >>> >>> So if I got it correctly now, this seems to be the minimum required >>> for i18n, apart from the bindtextdomain call. Is that correct? >>> >>> %define parse.error detailed >>> %{ >>> #define YYENABLE_NLS 1 >>> #define ENABLE_NLS 1 >>> #define N_ >>> static auto _ (const char *s) { return dgettext ("mydomain", s); } >>> %} >> >> I don't think this is the right approach. I think you are trying >> to exploit the fact that the skeleton is actually already having >> support to translate its own messages ("syntax error, expected..."). >> >> Rather I had something like the attachement in mind. I am very >> afraid about really installing this in the source tree, because I >> expect tons of portability issues here: the examples are meant to >> be self-contained, independent of bison's build, so I cannot use >> the same tricks to be portable. >> >> But I agree it would be better to actually demonstrate the whole >> process in bistromathic. I'll see what I can do. > > I'm not sure I follow you here. I think what I do is rather close to > what you suggest here. Maybe there was some confusion because I > hadn't mentioned the steps that were unproblematic (or well-known) > to me already. So for completeness, I had this already (with my own > domain, of course): > >> # include <libintl.h> >> setlocale (LC_ALL, ""); >> bindtextdomain ("bistromathic", LOCALEDIR); > > But don't you also need: > > bindtextdomain ("bison-runtime", BISON_LOCALEDIR); > > Or is it there already? I can't seem to find it. You are right, I missed the (obvious) fact that anyway you *should* be using this. > Anyway, I had put > that in my code, and FWIW I didn't need autoblah and m4 to get > BISON_LOCALEDIR, I just use the following my Makefile: > > -DBISON_LOCALEDIR='"$(shell $(BISON) $(BISON_FLAGS) --print-localedir)"' Yes, that's exactly the right way to do it! Thanks for reminding me this... I'll have to emphasize this in the I18n section in the doc. > So the only thing missing before it worked for me was: > > #define YYENABLE_NLS 1 > #define ENABLE_NLS 1 Yes, you are right, you need both. > I suppose they're normally set by autoblah, so I need to do this > manually. But maybe I should rather set them on the command-line > than in the source!? I would probably keep them close to BISON_LOCALEDIR, so out of the file, but... > Anyway, not a big deal, yes, both are ok. > though I think it should at least be briefly > mentioned, unless you argue using gettext without autoblah is a > non-supported mode of operation (which I've been doing in other > projects for a long time and it seems to be working well, and > doesn't require defining ENABLE_NLS). Well, you may well use another system that gettext for i18n, it is not mandatory. The point of this stack of macros is to provide magic _if_ the user wants to use what's already inside the generated code. But you may well define YY_ yourself, and not use all the ENABLE_NLS stuff (provided you take care of all the #includes yourself). That's why what you need to do looks so weird. So you are in a way "in between": not using the Autotools magic, but willing to use the machinery inside. I'm saying it's wrong. It's only that I had not thought about it. So, yes, what you do is right. Not only is it right, it's also what I should be doing in bistromathic. I'll have to complete the doc. Thanks! > BTW: > >> textdomain ("bistromathic"); >> # define _(Msgid) gettext (Msgid) > > This works for an example (or a "main" program), but I think the > more general approach (as required e.g. in a library containing a > parser, where the main program might use its own domain) would be > no "textdomain" call and rather: > > #define _(Msgid) dgettext ("bistromathic", Msgid) Yes, that is correct. But I don't want this example to be a showcase for gettext, only for Bison :) Most users need to see the simple case (i18n of programs), for more complex scenarios, they have to read gettext's manual. > PS: > >> examples: bistromathic: demontrate internationalization > > "demonstrate" ;) Yeah, I already caught that one too :) Thanks!