代码之家  ›  专栏  ›  技术社区  ›  Florian Baierl

有没有办法让GNU xgettext(或类似的东西)处理scala文件?

  •  0
  • Florian Baierl  · 技术社区  · 6 年前

    我们正在使用 GNU gettext utilities 用于直接从我们的代码库创建PO文件。然而,问题是,我们的一些代码库是用Scala编写的(大部分是Java)。我们正在使用gradle进行构建和部署。

    据我所见,根据xgettext文档,Scala不是一种受支持的语言:

    5.1.3输入文件语言的选择

    -我的名字

    语言=名称 指定输入文件的语言。

    支持的语言有C、C++、ObjvEC、Pothon、Python、Lisp、Eclipse、LyBRP、Stuty、SimultTalk、java、JavaStperts、Cype、AWK、YCP、TCL、Perl、PHP、GCC源、NXStReGrT表、RST、RSJ、格莱德、Lua、JavaScript、瓦拉河、GSET、Desktop。

    有没有办法将xgettext用于Scala文件?我找到了 this sbt compiler plugin 这正是我们需要的,但不幸的是,我们使用的是gradle而不是sbt。

    0 回复  |  直到 6 年前
        1
  •  2
  •   TomáÅ¡ Dvořák    6 年前

    我有一个 Po 类保存消息目录,并允许我通过两个简单的方法执行翻译:

    def t(singular: String): String = lookupSingular(None, singular)
    def tf(singular: String, parameters: Any*): String = format(t(singular), Array(parameters: _*))
    def tc(ctx: String, singular: String): String = lookupSingular(Some(ctx), singular)
    def tcf(ctx: String, singular: String, parameters: Any*): String = format(lookupSingular(Some(ctx), singular), Array(parameters: _*))
    def tn(singular: String, plural: String, n: Long): String = lookupPlural(None, singular, plural, n)
    def tcn(ctx: String, singular: String, plural: String, n: Long): String = lookupPlural(Some(ctx), singular, plural, n)
    

    t 代表翻译, f 对于格式化(有参数), c 对于上下文(指gettext上下文,以及消息的附加信息,将其与具有相同文本的其他消息区分开来), n 表示复数形式,并指定N。你可以自己编名字。

    这些方法既可以作为执行翻译的手段,也可以作为xgettext提取文本的标记 .pot 源代码中的文件。

    我用的是这样的:

    new JMenuItem(po.t("Copy to clipboard"))
    new JButton(po.tc("errorDialog", "Copy to clipboard"))
    po.tf("Camera {0}", number),
    

    等

    通过这种设置,我可以像这样运行xgettext:

    xgettext \
        --package-name="xxx" \
        -ktc:1c,2 \
        -ktcf:1c,2 \
        -ktnc:1c,2,3 \
        -ktf \
        -kt \
        -ktn:1,2 \
        -o "output.po" \
        $(find "DIRECTORY" -name *.scala) 2>&1 | grep -v "extension 'scala' is unknown; will try C"
    

    重要的部分是 -k 参数,它将自定义xgettext关键字直接映射到我的方法的名称。通过这种方式,可以将xgettext配置为使用自定义关键字。

    不过,Scala的三重引号不受支持。xgettext在遇到“未终止文字”时会发出警告,但无论如何都会继续。

    IIRC,甚至 -c 命令行参数可以用于支持有关翻译消息的注释,这对翻译人员非常有用。

    从实践中得出的几个观察结果并不能直接回答最初的问题:

    • 如果我再次实施这个方法 T , tc , ... 不会直接返回已翻译的字符串,但 LocalizableMessage 封装原始字符串和扩展参数,这些参数可以稍后通过适当的目录进行惰性转换。
    • 我不使用这些方法 tn (处理复数的gettext方法)。我建议使用更通用的扩展库或类似的东西。
        2
  •  1
  •   Guido Flohr    6 年前

    Perl模块 Locale::XGettext 允许您为几乎所有文本格式编写自己的xgettext变体。您只需要为能够提取字符串的语言/格式提供解析器。

    Extending Xgettext With Locale::XGettext .Java的示例提取器可在 https://github.com/gflohr/Locale-XGettext/tree/master/samples/Java

    免责声明:我是上述所有软件和文档的作者!

    如果与Perl代码的接口听起来太复杂,您也可以用自己选择的语言为Scala编写一个解析器,在xgettext之前运行该解析器,并将所有可翻译字符串转储为您的版本所需的格式 xgettext 理解,例如C:

    gettext("Hello, world!");
    gettext("Another string.");
    

    然后,只需使用生成的虚拟源文件作为 xgettext

    值得注意的是 xgettext 我会永远认出 .po 和 .pot 文件作为输入,即使您使用 --language=java .也就是说 阿宝先生 或 锅 文件最适合从Scala文件中转储可翻译字符串,前提是找到生成 阿宝先生 / 锅 文件夹。

    最后,gettext工具的源代码被设计为可扩展的。如果你能用C语言为Scala语言编写字符串提取器和格式检查器,你可以添加Scala语言。但是,你不能在运行时添加对另一种语言的支持,但你必须编译自己版本的 xgettext 或者将提取器贡献给GNU gettext项目。

    推荐文章