gpt4 book ai didi

r - 如何翻译包裹内容?

转载 作者:行者123 更新时间:2023-12-04 20:01:38 25 4
gpt4 key购买 nike

我希望从我的包中获得多种语言的错误消息、警告和其他用户反馈。 (R 可以翻译 messagewarningstopgettextngettext 的内容。)

在这些文档中提供了有关如何执行此操作的建议:

  • Internationalization编写 R 扩展的部分。
  • Localization of messages R 安装和管理部分。
  • Translations ( R < 3.0.0 ) R 开发人员指南的页面。

  • mgcv Rcmdr ( po dir) 包有翻译,提供如何做事的例子。

    尽管如此,我正在努力让事情发挥作用。这是一个可重现的包示例:

    在 Windows 上,您需要下载并解压 gettext-tools ,然后将该位置添加到您的 Windows PATH环境变量。
    library(roxygen2)
    library(devtools)
    library(tools)

    # Create the directories to hold the package content
    Vectorize(dir.create)(c("test", "test/R", "test/man", "test/po"))

    # Write the package DESCRIPTION file
    cat(
    'Package: test
    Title: Test pkg
    Description: Investigate how to translate content
    Version: 0.0-1
    Date: 2015-03-17
    Author: Richard Cotton
    Maintainer: Richard Cotton <a@b.com>
    License: Unlimited',
    file = "test/DESCRIPTION"
    )

    # Create a function go to into the package, plus its documentation
    cat(
    "#' Translatable messages
    #' Some strings to be translated.
    #' @param n A natural number.
    #' @export
    translatable <- function(n)
    {
    message('faucet')
    cat(gettext('napkin'), '\n')
    cat(ngettext(n, 'one', 'many', domain = 'R-test'), '\n')
    }",
    file = "test/R/translatable.R"
    )

    # Create the master translation file (American English)
    xgettext2pot("test", "test/po/R-test.pot")

    # Alter the master file to make British English and French translations
    en <- readLines("test/po/R-test.pot")
    en_gb <- en
    en_gb[which(en_gb == 'msgid "faucet"') + 1] <- 'msgid "tap"'
    en_gb[which(en_gb == 'msgid "napkin"') + 1] <- 'msgid "serviette"'
    writeLines(en_gb, "test/po/R-en_GB.po")

    fr <- en
    fr[which(fr == 'msgid "faucet"') + 1] <- 'msgid "robinet"'
    fr[which(fr == 'msgid "napkin"') + 1] <- 'msgid "serviette"'
    fr[which(fr == 'msgid "one"') + 2] <- 'msgstr[0] "un"'
    fr[which(fr == 'msgid_plural "many"') + 2] <- 'msgstr[1] "beaucoup"'
    writeLines(fr, "test/po/R-fr.po")

    # Build and install the package
    pkg_file <- build("test")
    install.packages(pkg_file, repos = NULL, type = "source")

    将您的操作系统区域设置更改为 English (United States) (在 Windows 7 下,它位于控制面板 -> 区域和语言 -> 格式 -> 格式)并重新启动 R。

    您应该会看到默认文本:
    library(test)
    translatable(1)
    ## faucet
    ## napkin
    ## one
    translatable(2)
    ## faucet
    ## napkin
    ## many

    现在将您的语言环境更改为 English (United Kingdom)或到 French (France) ,重新启动 R,然后重新运行示例。我希望文本会改变,但事实并非如此。
    Sys.getlocale()报告我的语言环境发生了变化,所以这绝对有效。
    capabilities("NLS")返回 TRUE ,因此开启了自然语言支持。

    对于法语语言环境,此示例改编自 mgcv::bam帮助页面给了我一条法语错误消息,所以问题在于我如何生成包。
    library(mgcv)
    dat <- gamSim(1,n=25000,dist="normal",scale=20)
    bs <- "cr";k <- 12
    b <- bam(
    y ~ s(x0,bs=bs)+s(x1,bs=bs)+s(x2,bs=bs,k=k)+s(x3,bs=bs),
    data = dat,
    family = list(family = NULL)
    )
    ## Erreur dans bam(y ~ s(x0, bs = bs) + s(x1, bs = bs) + s(x2, bs = bs, k = k) + :
    ## famille non reconnue

    我究竟做错了什么?

    最佳答案

    您还没有采取步骤来编译和安装您的翻译。你的 .po 文件有问题。

    这是一个工作R-fr.po您的示例文件:

    msgid ""
    msgstr ""
    "Project-Id-Version: R 3.1.2\n"
    "Report-Msgid-Bugs-To: bugs.r-project.org\n"
    "POT-Creation-Date: 2015-03-17 09:46\n"
    "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
    "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
    "Language-Team: LANGUAGE <LL@li.org>\n"
    "Language: fr\n"
    "MIME-Version: 1.0\n"
    "Content-Type: text/plain; charset=UTF-8\n"
    "Content-Transfer-Encoding: 8bit\n"
    "Plural-Forms: nplurals=2; plural=(n > 1);\n"

    msgid "faucet"
    msgstr "robinet"

    msgid "napkin"
    msgstr "serviette"

    msgid "one"
    msgid_plural "many"
    msgstr[0] "un"
    msgstr[1] "beaucoup"

    请注意,您有 msgid你应该在哪里 msgstr .您也没有指定语言或复数形式,并且“charset”变量在编译期间引发了错误。

    获得正确的文件后,请按照 "preparing and installing a translation" 下的说明进行操作。 .具体来说,从命令行执行以下操作:
    mkdir test/inst/po/fr/LC_MESSAGES
    msgfmt -c --statistics -o test/inst/po/fr/LC_MESSAGES/R-test.mo R-test.po

    如果有问题,这将抛出一些错误和警告。如果没有,它应该给出一个确认消息。

    然后重建包并安装它,然后再试一次:
    library("test")
    translatable(1)
    ## faucet
    ## napkin
    ## one
    translatable(2)
    ## faucet
    ## napkin
    ## many
    Sys.setenv(LANG = "fr")
    translatable(1)
    ## robinet
    ## serviette
    ## un
    > translatable(2)
    ## robinet
    ## serviette
    ## beaucoup

    请注意,您无需更改操作系统语言。您可以设置 LANG环境变量以获取消息翻译。

    与此相关的是,我发现这个过程真的很烦人,所以在我的中期待办事项 list 上创建一个包( this one, specifically ),我希望能简化这个过程。

    关于r - 如何翻译包裹内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29093673/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com