gettext {base} | R Documentation |
Translate Text Messages
Description
Translation of text messages typically from calls to
stop()
, warning()
, or message()
happens when Native Language Support (NLS) was enabled in this build of
R as it is almost always, see also the bindtextdomain()
example.
The functions documented here are the low level building blocks used explicitly or implicitly in almost all such message producing calls and they attempt to translate character vectors or set where the translations are to be found.
Usage
gettext(..., domain = NULL, trim = TRUE)
ngettext(n, msg1, msg2, domain = NULL)
bindtextdomain(domain, dirname = NULL)
Sys.setLanguage(lang, unset = "en", C.vs.en = c("msg", "warn", "silent"),
force = FALSE)
Arguments
... |
one or more character vectors. |
trim |
logical indicating if the white space trimming in
|
domain |
the ‘domain’ for the translation, a |
n |
a non-negative integer. |
msg1 |
the message to be used in English for |
msg2 |
the message to be used in English for |
dirname |
the directory in which to find translated message catalogs for the domain. |
lang |
a |
unset |
a string, specifying the default language assumed to be
current in the case |
C.vs.en |
a string specifying how a current (sometimes “hard”)
setting of language |
force |
logical indicating if in case of a “hard” set
|
Details
If domain
is NULL
(the default) in gettext
or ngettext
, the domain is inferred. If gettext
or ngettext
is called from a function in the namespace of
package pkg including called via stop()
,
warning()
, or message()
from the function,
or, say, evaluated as if called from that namespace, see the
evalq()
example,
the domain is set to "R-pkg"
. Otherwise there is no default
domain and messages are not translated.
Setting domain = NA
in gettext
or ngettext
suppresses any translation.
""
does not match any domain. In gettext
or ngettext
,
domain = ""
is effectively the same as domain = NA
.
If the domain is found, each character string is offered for translation, and replaced by its translation into the current language if one is found.
The language to be used for message translation is determined by
your OS default and/or the locale setting at R's startup, see
Sys.getlocale()
, and notably the LANGUAGE environment
variable, and also Sys.setLanguage()
here.
Conventionally the domain for R warning/error messages in package
pkg is "R-pkg"
, and that for C-level messages is "pkg"
.
For gettext
, when trim
is true as by default,
leading and trailing whitespace is ignored (“trimmed”) when
looking for the translation.
ngettext
is used where the message needs to vary by a single
integer. Translating such messages is subject to very specific rules
for different languages: see the GNU Gettext Manual. The string
will often contain a single instance of %d
to be used in
sprintf
. If English is used, msg1
is returned if
n == 1
and msg2
in all other cases.
bindtextdomain
is typically wrapper for the C function of the same
name: your system may have a man
page for it. With a
non-NULL
dirname
it specifies where to look for message
catalogues: with dirname = NULL
it returns the current location.
If NLS is not enabled, bindtextdomain(*,*)
returns NULL
.
The special case bindtextdomain(NULL)
calls C level
textdomain(textdomain(NULL))
for the purpose of flushing (i.e.,
emptying) the cache of already translated strings; it returns TRUE
when NLS is enabled.
The utility Sys.setLanguage(lang)
combines setting the
LANGUAGE environment variable with flushing the translation cache
by bindtextdomain(NULL)
.
Value
For gettext
, a character vector, one element per string in
...
. If translation is not enabled or no domain is found or
no translation is found in that domain, the original strings are
returned.
For ngettext
, a character string.
For bindtextdomain
, a character string giving the current base
directory, or NULL
if setting it failed.
For Sys.setLanguage()
, the previous LANGUAGE setting with
attribute attr(*, "ok")
, a logical
indicating success.
Note that currently, using a non-existing language lang
is still
set and no translation will happen, without any message
.
See Also
stop
and warning
make use of gettext
to
translate messages.
xgettext
(package tools) for extracting translatable
strings from R source files.
Examples
bindtextdomain("R") # non-null if and only if NLS is enabled
for(n in 0:3)
print(sprintf(ngettext(n, "%d variable has missing values",
"%d variables have missing values"),
n))
## Not run: ## for translation, those strings should appear in R-pkg.pot as
msgid "%d variable has missing values"
msgid_plural "%d variables have missing values"
msgstr[0] ""
msgstr[1] ""
## End(Not run)
miss <- "One only" # this line, or the next for the ngettext() below
miss <- c("one", "or", "another")
cat(ngettext(length(miss), "variable", "variables"),
paste(sQuote(miss), collapse = ", "),
ngettext(length(miss), "contains", "contain"), "missing values\n")
## better for translators would be to use
cat(sprintf(ngettext(length(miss),
"variable %s contains missing values\n",
"variables %s contain missing values\n"),
paste(sQuote(miss), collapse = ", ")))
thisLang <- Sys.getenv("LANGUAGE", unset = NA) # so we can reset it
if(is.na(thisLang) || !nzchar(thisLang)) thisLang <- "en" # "factory" default
enT <- "empty model supplied"
Sys.setenv(LANGUAGE = "de") # may not always 'work'
gettext(enT, domain="R-stats")# "leeres Modell angegeben" (if translation works)
tget <- function() gettext(enT)
tget() # not translated as fn tget() is not from "stats" pkg/namespace
evalq(function() gettext(enT), asNamespace("stats"))() # *is* translated
## Sys.setLanguage() -- typical usage --
Sys.setLanguage("en") -> oldSet # does set LANGUAGE env.var
errMsg <- function(expr) tryCatch(expr, error=conditionMessage)
(errMsg(1 + "2") -> err)
Sys.setLanguage("fr")
errMsg(1 + "2")
Sys.setLanguage("de")
errMsg(1 + "2")
## Usually, you would reset the language to "previous" via
Sys.setLanguage(oldSet)
## A show off of translations -- platform (font etc) dependent:
## The translation languages available for "base" R in this version of R:
if(capabilities("NLS")) withAutoprint({
langs <- list.files(bindtextdomain("R"),
pattern = "^[a-z]{2}(_[A-Z]{2}|@quot)?$")
langs
txts <- sapply(setNames(,langs),
function(lang) { Sys.setLanguage(lang)
gettext("incompatible dimensions", domain="R-stats") })
cbind(txts)
(nTrans <- length(unique(txts)))
(not_translated <- names(txts[txts == txts[["en"]]]))
})
## Here, we reset to the *original* setting before the full example started:
if(nzchar(thisLang)) { ## reset to previous and check
Sys.setLanguage(thisLang)
stopifnot(identical(errMsg(1 + "2"), err))
} # else staying at 'de' ..