gpt4 book ai didi

internationalization - OCaml 中的 Gettext 支持

转载 作者:行者123 更新时间:2023-12-04 04:34:53 32 4
gpt4 key购买 nike

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

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

    最佳答案

    这是我想在我的 Gasoline 中解决的问题。项目,一个应用工具包。

    来自 future 的答案

    在示例中,有一个过度设计的 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是它所属的软件组件的全局状态,它绑定(bind)到一个国际化消息数据库,在该数据库中查找翻译并用于准备实际消息。

    由示例建议,此工具支持格式化指示,很像 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

    然而,可以用实际的数据库查找来替换这个定义——这在 backlog 中。

    消息的组织

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

    关于internationalization - OCaml 中的 Gettext 支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26192129/

    32 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com