我们正在使用 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/