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 |
逻辑指示 |
domain |
用于翻译的 ‘domain’、 |
n |
非负整数。 |
msg1 |
|
msg2 |
|
dirname |
在其中查找域的已翻译消息目录的目录。 |
lang |
|
unset |
一个字符串,指定在 |
细节
如果 domain
是 gettext
或 ngettext
中的 NULL
(默认值),则推断域。如果 gettext
或 ngettext
是从包 pkg
的命名空间中的函数调用的,包括通过函数中的 stop()
、 warning()
或 message()
调用,或者说,就像从该函数调用一样进行评估命名空间,请参见 evalq()
示例,域设置为 "R-pkg"
。否则,就没有默认域,消息也不会被翻译。
在gettext
或ngettext
中设置domain = NA
会抑制任何转换。
""
不匹配任何域。在 gettext
或 ngettext
中, 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' ..
也可以看看
stop
和warning
利用gettext
来翻译消息。
xgettext
(包tools
) 用于从中提取可翻译的字符串R源文件。
相关用法
- R getwd 获取或设置工作目录
- R getDLLRegisteredRoutines DLL 中 C/Fortran 例程的反射信息
- R get 返回命名对象的值
- R getLoadedDLLs 获取当前会话中加载的 DLL
- R getNativeSymbolInfo 获取一个或多个本机 (C/Fortran) 符号的说明
- R grep 模式匹配和替换
- R gzcon 通过连接(解)压缩 I/O
- R groupGeneric S3组通用函数
- R gc 垃圾收集
- R gl 生成因子水平
- R grouping 分组排列
- R gc.time 报告垃圾收集所花费的时间
- R grepRaw 原始向量的模式匹配
- R gctorture 酷刑垃圾收集者
- R file.path 构造文件路径
- R vector 向量 - 创建、强制等
- R lapply 对列表或向量应用函数
- R dump R 对象的文本表示
- R Sys.getenv 获取环境变量
- R rank 样本排名
- R pushBack 将文本推回连接
- R strsplit 分割字符向量的元素
- R seq.Date 生成规则的日期序列
- R invisible 将打印模式更改为不可见
- R noquote “无引号”字符串打印类
注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Translate Text Messages。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。