在bash中使用gettext

时间:2010-02-08 12:38:37

标签: bash localization gettext

如何在bash脚本中使用gettext?

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

Localization

我的脚本是这样写的:

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

lang_file.sh看起来像那样:

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

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

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

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

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

4 个答案:

答案 0 :(得分:4)

您需要执行以下步骤:

  1. 确定您的项目名称是什么,gettext将其称为textdomain,您将需要它来检索项目的翻译。我们称之为“PRJ”。
  2. 标记要翻译的字符串。以下代码段示例:
  3. (我们称之为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"
    
    1. 制作.pot文件,以便翻译人员可以使用。
    2. 运行以下命令,它只查找GETTEXT,你真正要翻译的那个。

      xgettext -o PRJ.pot  -L Shell --keyword --keyword=GETTEXT  PRJ.sh
      
      1. (可选)生成.po文件。
      2. 对于您想要涵盖的每个区域设置。

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

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

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

          msgfmt -v  fr.po -o fr.mo
          
          1. 安装.mo文件
          2. 执行命令

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

            现在您可以尝试结果:

            LANGUAGE=fr  ./PRJ.sh
            

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

答案 1 :(得分:2)

bash中存在一个长期丢失,从未记录且几乎已弃用的内置解决方案。

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

答案 2 :(得分:1)

您要做的是我想用适当的语言询问用户?您可能希望用户首先选择语言。你要问的另一部分就是在你的变量中嵌入像$(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
    }

答案 3 :(得分:0)

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

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

在这里,我重点介绍如何尝试使用gettext命令来简要翻译。

在准备好具有内部层次结构的文件夹/ p​​ath / to / your / locale后,例如<lang>/LC_MESSAGES/<textdomain>.mo(其中<lang>例如韩语的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" )"