OCaml中的Gettext支持

Tho*_*ard 9 ocaml gettext internationalization

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

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

Mic*_*ald 2

这是我想在我的汽油项目(一个应用程序工具包)中解决的一个问题。

\n\n

来自未来的答案

\n\n

在示例中,有一个过度设计的字数统计程序,它用作该库的用例。该函数Component.Message.cannot_open使用其格式字符串作为国际化消息数据库中的键:

\n\n
let cannot_open name reason =\n  send sink Error "${FILENAME:s}: cannot open (${REASON:s})"\n  [ "FILENAME", make String name;\n    "REASON", make String reason;\n  ]\n
Run Code Online (Sandbox Code Playgroud)\n\n

sink是它所属的软件组件的全局状态,它绑定到国际化消息的数据库,在该数据库中查找翻译并用于准备实际消息。

\n\n

由示例建议,该工具支持格式化指示,就像printf我们可以编写的那样${FILENAME:+20s}

\n\n

目前的更正

\n\n

目前,还没有实现实际的数据库查找。该函数在由模块参数化的send函子中定义。当前的实现使用以下数据库实现:Generic_message.Sink.MakeDatabasewordcount

\n\n
module Database =\nstruct\n  type t = unit\n  type connection_token = unit\n  let opendb () = ()\n  let find () id = id\n  let close () = ()\nend\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是,可以用积压中的实际数据库查找 \xe2\x80\x94 替换此定义。

\n\n

消息的组织

\n\n

在我看来,消息国际化应该由软件组件\xe2\x80\x94(整个应用程序\xe2\x80\x94下面最大的组织统一体)来完成,并且库或类似设施应该使用标准常量和类型来报告错误。

\n