浏览 bash 手册我发现了特定于区域设置的翻译部分Bash 参考手册 → 3.1.2.5 特定于语言环境的翻译:
3.1.2.5 特定于语言环境的翻译
前面带有美元符号 ('$') 的双引号字符串将导致根据当前区域设置翻译该字符串。如果当前语言环境是 C 或 POSIX,则忽略美元符号。如果字符串被翻译并替换,则替换内容将被双引号括起来。
某些系统使用由 LC_MESSAGES shell 变量选择的消息目录。其他人根据 TEXTDOMAIN shell 变量的值创建消息目录的名称,可能添加后缀“.mo”。如果使用 TEXTDOMAIN 变量,则可能需要将 TEXTDOMAINDIR 变量设置为消息目录文件的位置。还有一些人以这种方式使用这两个变量:TEXTDOMAINDIR/LC_MESSAGES/LC_MESSAGES/TEXTDOMAIN.mo。
所以我决定测试一下。
我的机器使用美国英语语言环境:
$ echo $LANG
en_US.UTF-8
写一个英文单词效果很好:
$ echo $"Hello"
Hello
我检查了此处可用的语言环境并发现了很多:
$ locale -a
C
C.UTF-8
en_AG
en_AG.utf8
en_AU.utf8
en_BW.utf8
...
en_ZM.utf8
en_ZW.utf8
es_ES.utf8
POSIX
所以我决定用西班牙语测试这个功能。但是,更改语言环境并没有触发翻译:
$ LANG=es_ES.UTF8 echo $"Hello"
Hello # Still in English. Should be "Hola", in Spanish
这是为什么?我在这里缺少什么?我怀疑有一组单词在某处被翻译,但我找不到在哪里。
这是我的 Bash 版本:
$ bash --version
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
答案1
您缺少进行实际翻译。 (计算机不懂英语或西班牙语,它只知道在目录中查找字符串。)参见本土化在里面高级 Bash 脚本编写指南。请参阅常问问题一个已解决的例子。有安全警告对于构造$"..."
;实际上,这意味着您必须保护翻译文件以及脚本本身。