我想让i18n使用我的OCaml代码(将短信翻译成用户的首选语言)。大多数可翻译字符串是一小组函数之一的第一个非标记参数。 e.g。
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
),然后也无法卸载,这也表明它没有被大量使用。人们实际使用/推荐什么?
答案 0 :(得分:2)
这是我想在我的Gasoline项目(一个应用工具包)中解决的问题。
在示例中,有一个过度设计的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
是它所属软件组件的全局状态,它绑定到国际化消息数据库,其中查找翻译并用于准备实际消息。
示例提示,此工具支持格式化指示,就像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
然而,可以用实际的数据库查找替换这个定义 - 这是在积压中。
在我看来,消息国际化应该由软件组件完成 - 整个应用程序下面最大的组织统一 - 图书馆或类似的设施应该使用标准的常量和类型来报告错误。