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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。