有没有办法强制程序以英文输出错误?

有没有办法强制程序以英文输出错误?

当我遇到错误时,有时会出现区域设置设置的语言错误。除了切换区域设置之外,还有其他方法可以强制使用英语错误消息以便谷歌搜索解决方案吗?

答案1

要使用修改后的区域设置运行实用程序(程序):

$ env LC_ALL=C somecommand

env实用程序会修改其执行的实用程序的环境,并将环境变量设置LC_ALLC(或POSIX) 将确保您获得 POSIX 语言环境中的本地化错误消息。它还可能影响排序、日期和时间格式以及数字格式。

实用程序外部的环境(外壳或整个系统)不会受到此临时区域设置切换的影响。

阅读locale(1)您系统的手册 ( man 1 locale)。

答案2

区域设置是大多数程序决定使用哪种语言的方式。虽然一些程序有不同的设置,但选择消息语言的最常见方法是通过区域设置。没有其他方法可以跨多个应用程序(或一系列相关应用程序)工作。

但是,您不需要设置任何系统设置。只需使用不同的设置运行一次该程序即可。消息的区域设置是LC_MESSAGES(请参阅我应该将区域设置设置为什么?这样做会产生什么影响?),所以可以通过设置环境变量来设置LC_MESSAGESC所有系统都支持特殊值,表示默认的未翻译消息(通常为英语)。

在 shell 中,以下命令myprogram在环境变量LC_MESSAGES设置为 的情况下运行C,即myprogram以英语消息运行且其他区域设置保持不变(因此程序仍使用您喜欢的字符集、排序顺序、日期格式等)。

LC_MESSAGES=C myprogram

程序运行后,从同一 shell 执行的其他程序将使用您常用的区域设置,更改不会保留。如果您希望更改保留在终端内,请运行

export LC_MESSAGES=C

这不会影响从其他终端启动的程序。

答案3

在运行程序之前执行此操作:

export LANGUAGE=en_US.UTF-8
export LANG=en_US.UTF-8

如果程序由 /etc/init.d 中的脚本运行,则需要将其放入脚本中。

答案4

“除了切换语言环境”——简短的回答:不。

长答案:

如果应用程序的开发人员决定以英语打印所有错误消息,无论区域设置如何,他们肯定可以轻松做到这一点。他们所需要做的就是不要通过 gettext 的翻译函数发送这些字符串。

如果应用程序的开发人员决定引入另一个环境变量(或其他方式)来为错误消息指定不同的区域设置,他们也可以相对轻松地实现这一点。和newlocale()函数*_l()可能会派上用场。不过,我从未见过这样的应用程序,而且我认为开发人员没有理由为此烦恼。

应用程序通常只是根据环境变量初始化区域设置,然后在需要时根据所使用的区域设置翻译字符串。

假设有一个常规的国际化应用程序翻译其错误消息(我相信这是您所关心的),则无法欺骗它使用一种语言环境来处理将转到标准输出的字符串,而使用另一种语言环境来处理将要输出的字符串。将出现在标准错误上。这不能被 LD_PRELOAD 库等技巧“破解”。原因很简单:在构造翻译后的字符串时,尚不知道该字符串将出现在哪里(stdout、stderr、日志文件、图形界面、通过线路发送等......,甚至可能更多)同时)。然而,为了能够进行处理,必须以其翻译形式创建字符串。


为了通过谷歌搜索解决方案,如果您希望在非英语语言环境中使用该应用程序,这是我的建议:

尝试找到错误消息中可能来自固定字符串的大子字符串,即没有替换的数字或单词。在 /usr/share/locale/(yourlocale)/LC_MESSAGES 下对此字符串执行 grep 以找到它来自哪个文件。如果没有匹配项,请使用仅包含 7 位 ASCII(英语)字符的子字符串重复,因为 *.mo / *.gmo 文件可能采用任何编码(尽管对于现代软件,它们通常采用 UTF-8)。找到错误消息的来源文件后,运行msgunfmt该文件以查找原始英文字符串。


更新:我刚刚意识到您在评论中提到您遇到了 AUR 和 makepkg 的问题。

正如其他人回答的那样,使用英语语言环境运行特定程序很容易。对于构建包,强烈建议这样做。

所以我可能误解了你的问题。我上面的回答回答了这个问题:“是否有可能让一个应用程序在我喜欢的非英语语言环境中运行,但[同样的过程]用英语打印错误消息?”

相关内容