scala - 有没有办法让 GNU gettext (或类似的东西)与 scala 文件一起工作?

标签 scala gradle gettext po xgettext

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

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

5.1.3 Choice of input file language

‘-L name’

‘--language=name’ Specifies the language of the input files.

The supported languages are C, C++, ObjectiveC, PO, Shell, Python, Lisp, EmacsLisp, librep, Scheme, Smalltalk, Java, JavaProperties, C#, awk, YCP, Tcl, Perl, PHP, GCC-source, NXStringTable, RST, RSJ, Glade, Lua, JavaScript, Vala, GSettings, Desktop.



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

最佳答案

我使用了一个非常简单的解决方案,我将 Vala 指定为 xgettext 的语言。在转义文字和函数调用语法方面,它与 Scala 非常接近。这不是一个严格的解决方案,但在我的实践中,它对我来说已经足够好了。

我有一个 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对于 Context(表示 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 处理复数的方式)。我建议使用更通用的 ICU 消息扩展库或类似的东西。
  • 关于scala - 有没有办法让 GNU gettext (或类似的东西)与 scala 文件一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59769632/

    相关文章:

    python - AttributeError : 'NoneType' object has no attribute 'get_text' , 我已经尝试了平台上的其他一些答案,但没有用

    json - 在scala中使用spray编写一个简单的json REST服务器

    java - 使用 Scala-2.13 将 Java 映射转换为 Java 代码中的 Scala 不可变映射

    performance - 迭代器连接性能

    java - Android Studio 无法解析 jUnit 4.12 依赖

    php gettext 翻译在 Debian 上不起作用

    javascript - 如何从html标签中只获取文本

    scala - 将文件夹添加到 Scala 属性文件的类路径

    spring-boot - 如何使用Spring Boot从另一个文件夹加载静态资源

    Android Studio 和大量的模块