【问题标题】:Using gettext in bash在 bash 中使用 gettext
【发布时间】:2010-02-08 12:38:36
【问题描述】:

如何在 bash 脚本中使用 gettext?

我只找到了这个页面,但我不明白。

Localization

我的脚本是这样写的:

 #!/bin/bash
 . lang_file.sh
 echo $LANG_HELLO_WORLD

而 lang_file.sh 看起来像这样:

 #!/bin/bash
 LANG_HELLO_WORLD="Hello World"

我想将 lang_file.sh 更改为使用 gettext 的内容,如下所示:

 #!/bin/bash
 LANG_HELLO_WORLD=`some gettext command to get string in user language`

我想使用 Launchpad 中的代码,以便其他用户可以翻译它(.po、.pot 文件)

抱歉英语不好,有什么建议吗?

【问题讨论】:

    标签: bash localization gettext


    【解决方案1】:

    您需要执行以下步骤:

    1. 确定您的项目名称是什么,gettext 将其称为 textdomain,您将需要它来检索项目的翻译。我们称之为“PRJ”。
    2. 标记要翻译的字符串。以下 sn -p 举例:

      我们就叫它PRJ.sh

      #!/bin/sh
      alias GETTEXT='gettext "PRJ"'
      
      ## Use GETTEXT to mark the string you want to translate
      HELLO_WORLD=$(GETTEXT "Hello world") 
      
      echo "$HELLO_WORLD"
      
    3. 生成 .pot 文件,以便翻译人员对其进行处理。

      运行以下命令,它只查找 GETTEXT,即您真正要翻译的那些。

      xgettext -o PRJ.pot  -L Shell --keyword --keyword=GETTEXT  PRJ.sh
      
    4. 可选:生成 .po 文件。

      对于您想要覆盖的每个语言环境。

      msginit -i PRJ.pot -l fr.UTF-8
      

      请注意建议使用“UTF-8”,否则msginit 可能会错误地为您选择一些过时的编码。

    5. 检索完成的.po文件,并将其转换为.mo文件(机器可以读取的文件)

      msgfmt -v  fr.po -o fr.mo
      
    6. 安装 .mo 文件。运行:

      sudo install fr.mo /usr/share/locale/fr/LC_MESSAGES/PRJ.mo 
      

      现在你可以试试结果了:

      LANGUAGE=fr  ./PRJ.sh
      

      你应该会看到 Hello world 的法语翻译。

    【讨论】:

      【解决方案2】:

      在 bash 中有一个失传已久、从未记录过且几乎被弃用的内置解决方案。

      LANG=foo_BAR.utf8
      TEXTDOMAIN="test" 
      TEXTDOMAINDIR="/usr/share/locale"
      echo $"fooMsgid"
      # bash --dump-po-strings <scriptfile>
      

      【讨论】:

      • 不错的发现。最接近文档的似乎是man -P cat bash | grep -EC3 'translat|gettext'
      【解决方案3】:

      gettext 翻译使用可编辑格式 *.po 来存储翻译,并使用编译格式 *.mo 来加载。

      有关文件格式的信息,请参考:https://www.gnu.org/software/gettext/manual/html_node/index.htmlhttps://www.gnu.org/software/gettext/manual/html_node/index.html的“3 PO 文件格式”和“10 生成二进制 MO 文件”部分

      这里我重点介绍一下如何尝试使用gettext 命令来获得简短的翻译。

      在您准备好一个文件夹 /path/to/your/locale 后,如 &lt;lang&gt;/LC_MESSAGES/&lt;textdomain&gt;.mo(其中&lt;lang&gt; 是例如ko_KR 韩语),在您的lang_file.sh 中使用以下代码:

      #!/bin/bash
      export LC_ALL=ko_KR.UTF-8   # if LC_ALL not work, you could try also "LANG" and "LANGUAGE"
      export TEXTDOMAINDIR=/path/to/your/locale
      # export TEXTDOMAIN="<textdomain>"   # <- optional, set this to save the "<textdomain>" argument for `gettext` below
      LANG_HELLO_WORLD="$( gettext "<textdomain>" "Your message to translate" )"
      

      【讨论】:

        【解决方案4】:

        您想要做的是我认为用适当的语言询问用户?您可能希望用户首先选择语言。您要问的另一部分只是将 $(get_some_str_func) 之类的命令嵌入到变量中。

        我没有编写此代码,但它可能与您尝试执行的操作一致?我不确定,我不完全理解你在问什么。

            function _configure_locale() { # [profile]
                local profile=${1:-EN}
                case ${profile} in
                  DE|DE_DE|de_DE)
                      LC_ALL="de_DE.UTF-8"
                      LANG="de_DE.UTF-8"
                      LANGUAGE="de_DE:de:en_US:en"
                      ;;
                  EN|EN_US|en|en_US)
                      LC_ALL="en_US.UTF-8"
                      LANG="en_US.UTF-8"
                      LANGUAGE="en_US:en"
                      ;;
                  *)
                      echo "ALERT" "${FUNCNAME}: unknown profile '${profile}'"
                      ;;
                  esac
                  LC_PAPER="de_DE.UTF-8"; # independent from locale
                  LESSCHARSET="utf-8";    # independent from locale
                  MM_CHARSET="utf-8"      # independent from locale
                  echo "locale settings" "${LANG}";
                  export LC_ALL LANG LANGUAGE LC_PAPER LESSCHARSET MM_CHARSET
            }
        

        【讨论】:

        • 只用了 4 年,该死的
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多