Internationalization OCaml中的Gettext支持
我想让i18n在我的OCaml代码中工作(将文本消息翻译成用户的首选语言)。大多数可翻译字符串是一小组函数中的第一个未标记参数。e、 gInternationalization 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包,但是:
- 文本输出:
打印“提要“%s”:“新提要”
- 错误:
raise\u safe“本地源文件“%s”不存在”路径
- 日志记录:
log\u警告~ex“错误检查%s的签名”提要
~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
函数在functorGeneric_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中),但我会记住其他项目。