Michael Chirico
2021-Jul-12 21:21 UTC
[Rd] translation domain is not inferred correctly from a package's print methods -- intended behavior?
Here is a reprex: # initialize reprex package cd /tmp mkdir myPkg && cd myPkg echo "Package: myPkg" > DESCRIPTION echo "Version: 0.0.1" >> DESCRIPTION mkdir R echo "print.my_class = function(x, ...) { cat(gettext(\"'%s' is deprecated.\"), '\n', gettext(\"'%s' is deprecated.\", domain='R-myPkg'), '\n') }" > R/foo.R echo "S3method(print, my_class)" > NAMESPACE # extract string for translation Rscript -e "tools::update_pkg_po('.')" # add dummy translation msginit -i po/R-myPkg.pot -o po/R-ja.po -l ja --no-translator head -n -1 po/R-ja.po > tmp && mv tmp po/R-ja.po echo 'msgstr "%s successfully translated"' >> po/R-ja.po # install .mo translations Rscript -e "tools::update_pkg_po('.')" # install package & test R CMD INSTALL . LANGUAGE=ja Rscript -e "library(myPkg); print(structure(1, class = 'my_class'))" # '%s' ??????? # %s successfully translated Note that the first gettext() call, which doesn't supply domain=, returns the corresponding translation from base R (i.e., the output is the same as gettext("'%s' is deprecated.", domain="R-base")). The second gettext() call, where domain= is supplied, returns our dummy translation, which is what I would have expected from the first execution. Here is what's in ?gettext:> If domain is NULL or "", and gettext or ngettext is called from a function in the namespace of package pkg the domain is set to "R-pkg". Otherwise there is no default domain.Does that mean the S3 print method is not "in the namespace of myPkg"? Or is there a bug here? If the former, is the edge case of concern here just S3 methods where the "top level" S3 method is defined in another package? Can we refine the manual text wording here to be more clear about when we should expect we need to supply domain= vs have it set automatically?
Martin Maechler
2021-Oct-01 10:48 UTC
[Rd] translation domain is not inferred correctly from a package's print methods -- intended behavior?
>>>>> Michael Chirico >>>>> on Mon, 12 Jul 2021 14:21:14 -0700 writes:> Here is a reprex: > # initialize reprex package > cd /tmp > mkdir myPkg && cd myPkg > echo "Package: myPkg" > DESCRIPTION > echo "Version: 0.0.1" >> DESCRIPTION > mkdir R > echo "print.my_class = function(x, ...) { cat(gettext(\"'%s' is > deprecated.\"), '\n', gettext(\"'%s' is deprecated.\", > domain='R-myPkg'), '\n') }" > R/foo.R > echo "S3method(print, my_class)" > NAMESPACE > # extract string for translation > Rscript -e "tools::update_pkg_po('.')" > # add dummy translation > msginit -i po/R-myPkg.pot -o po/R-ja.po -l ja --no-translator > head -n -1 po/R-ja.po > tmp && mv tmp po/R-ja.po > echo 'msgstr "%s successfully translated"' >> po/R-ja.po > # install .mo translations > Rscript -e "tools::update_pkg_po('.')" > # install package & test > R CMD INSTALL . > LANGUAGE=ja Rscript -e "library(myPkg); print(structure(1, class = 'my_class'))" > # '%s' ??????? > # %s successfully translated Trying to see if the current "R-devel trunk" would still suffer from this, and prompted by Suharto Anggono's suggestion on R's bugzilla, https://bugs.r-project.org/show_bug.cgi?id=17998#c24 I've finally started looking at this .. (Not having a Japanese locale installed though). > Note that the first gettext() call, which doesn't supply domain=, > returns the corresponding translation from base R (i.e., the output is > the same as gettext("'%s' is deprecated.", domain="R-base")). I don't see this (not having a Japanase locale? should I try with a locale I have installed?) > The second gettext() call, where domain= is supplied, returns our > dummy translation, which is what I would have expected from the first > execution. I can get the following which seems to say that everything is fine and fixed now, right? MM at lynne:myPkg$ LANGUAGE=ja R-devel -s --vanilla -e 'library(myPkg,lib.loc="~/R/library/64-linux-MM-only");structure(1,class="my_class");R.version.string' %s successfully translated %s successfully translated [1] "R Under development (unstable) (2021-09-30 r80997)" MM at lynne:myPkg$ LANGUAGE=ja `R-devel RHOME`/bin/Rscript --vanilla -e 'library(myPkg,lib.loc="~/R/library/64-linux-MM-only");structure(1,class="my_class");R.version.string' %s successfully translated %s successfully translated [1] "R Under development (unstable) (2021-09-30 r80997)" Note: During my experiments, I also do observe things confusing to me, when using Rscript and R from the command line... in some cases getting errors (in Japanese) ... but that may be just in those cases I have left any space in the string ((in the case of 'R' which in my case suffers from quoting hell because I use wrapper sh-scripts to call my versions of R ... )) > Here is what's in ?gettext: >> If domain is NULL or "", and gettext or ngettext is called from a function in the namespace of package pkg the domain is set to "R-pkg". Otherwise there is no default domain. > Does that mean the S3 print method is not "in the namespace of myPkg"? no. > Or is there a bug here? Yes, rather; or there *was* one. Thanks a lot, Michael! Best, Martin