Internationalization OCaml中的Gettext支持

Internationalization OCaml中的Gettext支持,internationalization,ocaml,gettext,Internationalization,Ocaml,Gettext,我想让i18n在我的OCaml代码中工作(将文本消息翻译成用户的首选语言)。大多数可翻译字符串是一小组函数中的第一个未标记参数。e、 g 文本输出:打印“提要“%s”:“新提要” 错误:raise\u safe“本地源文件“%s”不存在”路径 日志记录:log\u警告~ex“错误检查%s的签名”提要 在GUI代码中,还应提取~label参数中的字符串 有什么方法可以自动提取这些字符串吗?为了使事情更有趣,我还使用了一些语法扩展(例如Lwt) 我看到有一个ocaml gettext包,但是:

我想让i18n在我的OCaml代码中工作(将文本消息翻译成用户的首选语言)。大多数可翻译字符串是一小组函数中的第一个未标记参数。e、 g

  • 文本输出:
    打印“提要“%s”:“新提要”
  • 错误:
    raise\u safe“本地源文件“%s”不存在”路径
  • 日志记录:
    log\u警告~ex“错误检查%s的签名”提要
在GUI代码中,还应提取
~label
参数中的字符串

有什么方法可以自动提取这些字符串吗?为了使事情更有趣,我还使用了一些语法扩展(例如Lwt)

我看到有一个ocaml gettext包,但是:

  • 它似乎只支持一组固定的函数(
    f_
    s_
    ,等等)
  • 它安装失败(必须先取消设置
    $NAME
    ),然后也无法卸载,这也表明它没有被大量使用

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

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

未来的答案 在示例中,有一个过度设计的程序,作为库的用例。函数
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;
  ]
module Database =
struct
  type t = unit
  type connection_token = unit
  let opendb () = ()
  let find () id = id
  let close () = ()
end
sink
是它所属软件组件的全局状态,它绑定到一个国际化消息数据库,在该数据库中查找翻译并用于准备实际消息

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

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

let cannot_open name reason =
  send sink Error "${FILENAME:s}: cannot open (${REASON:s})"
  [ "FILENAME", make String name;
    "REASON", make String reason;
  ]
module Database =
struct
  type t = unit
  type connection_token = unit
  let opendb () = ()
  let find () id = id
  let close () = ()
end
但是,可以用实际的数据库查找来替换此定义,这在backlog中

信息的组织
在我看来,消息国际化应该通过软件组件来完成,软件组件是整个应用程序之下最大的组织统一体,而库或类似设施应该使用标准的常量和类型来报告错误。

我在回答中提到的汽油已经成熟。它的诊断设备是和。谢谢。这个特殊的程序将在各种Linux发行版中使用,因此它不能依赖于没有广泛打包的库(即使它们是在OPAM中),但我会记住其他项目。