在bash中使用gettext

lau*_*iys 5 bash localization gettext

如何在bash脚本中使用gettext?

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

本土化

我的脚本是这样编写的:

 #!/bin/bash
 . lang_file.sh
 echo $LANG_HELLO_WORLD
Run Code Online (Sandbox Code Playgroud)

而lang_file.sh看起来像那样:

 #!/bin/bash
 LANG_HELLO_WORLD="Hello World"
Run Code Online (Sandbox Code Playgroud)

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

 #!/bin/bash
 LANG_HELLO_WORLD=`some gettext command to get string in user language`
Run Code Online (Sandbox Code Playgroud)

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

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

Din*_*hen 5

您需要执行以下步骤:

  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"
Run Code Online (Sandbox Code Playgroud)
  1. 生成.pot文件,以便翻译人员可以对其进行处理。

运行以下命令,它将仅查找实际要翻译的GETTEXT。

xgettext -o PRJ.pot  -L Shell --keyword --keyword=GETTEXT  PRJ.sh
Run Code Online (Sandbox Code Playgroud)
  1. (可选)生成.po文件。

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

msginit -i PRJ.pot -l fr.UTF-8
Run Code Online (Sandbox Code Playgroud)

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

  1. 检索完成的.po文件,并将它们转换为.mo文件

(机器可以读取的文件)

msgfmt -v  fr.po -o fr.mo
Run Code Online (Sandbox Code Playgroud)
  1. 安装.mo文件

跑:

sudo install fr.mo /usr/share/locale/fr/LC_MESSAGES/PRJ.mo 
Run Code Online (Sandbox Code Playgroud)

现在您可以尝试结果:

LANGUAGE=fr  ./PRJ.sh
Run Code Online (Sandbox Code Playgroud)

并且您应该会看到Hello world的法语翻译。


小智 5

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

LANG=foo_BAR.utf8
TEXTDOMAIN="test" 
TEXTDOMAINDIR="/usr/share/locale"
echo $"fooMsgid"
# bash --dump-po-strings <scriptfile>
Run Code Online (Sandbox Code Playgroud)


Mik*_*e Q 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
    }
Run Code Online (Sandbox Code Playgroud)

  • 只用了4年时间,妈的 (6认同)