7

如何在 bash 脚本中使用 gettext?

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

本土化

我的脚本是这样写的:

 #!/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 文件)

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

4

4 回答 4

6

您需要执行以下步骤:

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

    让我们称之为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 的法语翻译。

于 2014-10-09T07:49:54.450 回答
5

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

LANG=foo_BAR.utf8
TEXTDOMAIN="test" 
TEXTDOMAINDIR="/usr/share/locale"
echo $"fooMsgid"
# bash --dump-po-strings <scriptfile>
于 2015-03-31T00:25:20.450 回答
2

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

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

在这里,我将重点介绍如何尝试gettext命令以简短地获得翻译。

在你准备了一个文件夹 /path/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" )"
于 2018-08-14T10:33:26.880 回答
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
    }
于 2014-06-06T14:42:34.667 回答