OCaml中的Gettext支持

时间:2014-10-04 10:58:40

标签: internationalization ocaml gettext

我想让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_等)。
  • OPAM says nothing uses it
  • 无法安装(必须首先取消设置$NAME),然后也无法卸载,这也表明它没有被大量使用。

人们实际使用/推荐什么?

1 个答案:

答案 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

然而,可以用实际的数据库查找替换这个定义 - 这是在积压中。

消息组织

在我看来,消息国际化应该由软件组件完成 - 整个应用程序下面最大的组织统一 - 图书馆或类似的设施应该使用标准的常量和类型来报告错误。