当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R gettext 翻译短信


R语言 gettext 位于 base 包(package)。

说明

通常翻译来自电话的短信stop(),warning(), 或者message()在此版本中启用本机语言支持 (NLS) 时会发生R几乎总是如此,另请参阅bindtextdomain()例子。

这里记录的函数是几乎所有此类消息生成调用中显式或隐式使用的低级构建块,它们尝试翻译字符向量或设置要在哪里找到翻译。

用法

gettext(..., domain = NULL, trim = TRUE)

ngettext(n, msg1, msg2, domain = NULL)

bindtextdomain(domain, dirname = NULL)

Sys.setLanguage(lang, unset = "en")

参数

...

一个或多个字符向量。

trim

逻辑指示 gettext() 中是否应该进行空白修剪。编译代码 (C /C++) 消息可能需要 trim = FALSE ,这些消息通常以 \n 结尾。

domain

用于翻译的 ‘domain’、character 字符串或 NULL ;查看具体信息'。

n

非负整数。

msg1

n = 1 的英文消息。

msg2

n = 0, 2, 3, ... 的英文消息。

dirname

在其中查找域的已翻译消息目录的目录。

lang

character 字符串,指定应寻求翻译的语言。

unset

一个字符串,指定在 Sys.getenv("LANGUAGE") 未设置或为空的情况下假定为当前的默认语言。

细节

如果 domaingettextngettext 中的 NULL (默认值),则推断域。如果 gettextngettext 是从包 pkg 的命名空间中的函数调用的,包括通过函数中的 stop()warning()message() 调用,或者说,就像从该函数调用一样进行评估命名空间,请参见 evalq() 示例,域设置为 "R-pkg" 。否则,就没有默认域,消息也不会被翻译。

gettextngettext 中设置domain = NA 会抑制任何转换。

"" 不匹配任何域。在 gettextngettext 中, domain = "" 实际上与 domain = NA 相同。

如果找到该域,则提供每个字符串进行翻译,如果找到,则将其替换为当前语言的翻译。

语言用于消息翻译由您的操作系统默认值和/或以下位置的区域设置决定R的启动,参见Sys.getlocale(),尤其是LANGUAGE环境变量,还有Sys.setLanguage()这里。

按照惯例,域为R包中的警告/错误消息pkg"R-pkg",对于 C-level 消息来说是"pkg".

对于 gettext ,当 trim 默认为 true 时,在查找翻译时将忽略前导和尾随空格 (“trimmed”)。

ngettext 用于消息需要改变单个整数的情况。翻译此类消息需要遵守针对不同语言的非常具体的规则:请参阅 GNU Gettext 手册。该字符串通常包含要在 sprintf 中使用的单个 %d 实例。如果使用英语,则在 n == 1 时返回 msg1,在所有其他情况下返回 msg2

bindtextdomain 通常是同名 C 函数的包装器:您的系统可能有一个 man 页面。对于非NULL dirname,它指定在哪里查找消息目录:对于dirname = NULL,它返回当前位置。如果未启用 NLS,bindtextdomain(*,*) 将返回 NULL 。特殊情况 bindtextdomain(NULL) 调用 C 级别 textdomain(textdomain(NULL)) 来刷新(即清空)已翻译字符串的缓存;当 NLS 启用时,它返回TRUE

实用性Sys.setlanguage(lang)结合设置LANGUAGE环境变量,并通过以下方式刷新翻译缓存bindtextdomain(NULL).

对于 gettext ,一个字符向量,... 中每个字符串一个元素。如果未启用翻译或未找到域或在该域中未找到翻译,则返回原始字符串。

对于 ngettext ,是一个字符串。

对于 bindtextdomain ,给出当前基目录的字符串,如果设置失败则为 NULL

为了Sys.setLanguage(), 以前的LANGUAGE用属性设置attr(*, "ok"), Alogical表明成功。请注意,目前使用不存在的语言lang仍然设置,不会发生翻译,没有任何message.

例子

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:
## IGNORE_RDIFF_BEGIN
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"]]]))
})
## IGNORE_RDIFF_END
## 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' ..

也可以看看

stopwarning 利用gettext 来翻译消息。

xgettext(包tools) 用于从中提取可翻译的字符串R源文件。

相关用法


注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Translate Text Messages。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。