internationalization - OCaml 中的 Gettext 支持

标签 internationalization ocaml gettext

我想让 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/

    相关文章:

    python - Python 的 "with"语句的 OCaml 对应项是什么(自动释放资源)

    php - gettext 如何处理动态内容?

    css - 如何测试CSS方向: auto as an english speaker

    c++ - 在 OCaml 中,抽象的代价有多大(即多态函数)

    php - 规范化多字节 php 字符串中的整数值

    installation - OCaml 中的 GUI 交叉开发,具有自然的外观和感觉

    php - Gettext 和 POedit - 验证文件时出错 '%'

    json - 如何将 po (gettext) 转换为 json?

    mysql - sql查询的国际化

    ruby-on-rails - 在 Rails 中查找未翻译的语言环境