當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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