我想让 i18n 在我的 OCaml 代码中工作(将文本消息翻译成用户的首选语言)。大多数可翻译的字符串是一小组函数中的一个的第一个未标记的参数。例如
print "Feed '%s':" new_feed
raise_safe "Local feed file '%s' does not exist" path
log_warning ~ex "Error checking signature for %s" feed
在 GUI 代码中,
~label
中的字符串参数也应该被提取。有什么方法可以自动提取这些字符串?为了让事情变得更有趣,我也使用了一些语法扩展(例如 Lwt)。
我看到有一个 ocaml-gettext 包,但是:
f_
、 s_
等)。 $NAME
),然后也卸载失败,这也表明它没有被大量使用。 人们实际使用/推荐什么?
最佳答案
这是我想在我的 Gasoline 中解决的问题。项目,一个应用工具包。
来自 future 的答案
在示例中,有一个过度设计的 wordcount程序,用作库的用例。函数Component.Message.cannot_open
使用其格式字符串作为国际化消息数据库中的键:
let cannot_open name reason =
send sink Error "${FILENAME:s}: cannot open (${REASON:s})"
[ "FILENAME", make String name;
"REASON", make String reason;
]
sink
是它所属的软件组件的全局状态,它绑定(bind)到一个国际化消息数据库,在该数据库中查找翻译并用于准备实际消息。由示例建议,此工具支持格式化指示,很像
printf
是的,我们可以写${FILENAME:+20s}
例如。目前更正
目前,没有实现实际的数据库查找。
send
函数在仿函数 Generic_message.Sink.Make
中定义由 Database
参数化模块。 wordcount
的当前实现使用以下数据库实现:module Database =
struct
type t = unit
type connection_token = unit
let opendb () = ()
let find () id = id
let close () = ()
end
然而,可以用实际的数据库查找来替换这个定义——这在 backlog 中。
消息的组织
在我看来,消息国际化应该由软件组件(整个应用程序之下最大的组织统一体)来完成,而库或类似设施应该使用标准的常量和类型来报告错误。
关于internationalization - OCaml 中的 Gettext 支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26192129/