プログラムに英語でエラーを出力させる方法はありますか?

プログラムに英語でエラーを出力させる方法はありますか?

エラーが発生すると、ロケールが誤った言語を設定しているように見えることがあります。ロケールを切り替えるだけでなく、Google で解決策を見つけるためにエラー メッセージを英語で表示する他の方法はありますか?

答え1

変更されたロケール設定でユーティリティ(プログラム)を実行するには:

$ env LC_ALL=C somecommand

このenvユーティリティは実行するユーティリティの環境を変更し、環境変数を(または)LC_ALLに設定すると、POSIXロケールでローカライズされたエラーメッセージが表示されます。並べ替え、日付と時刻の形式、数値形式にも影響を与える可能性があります。CPOSIX

ユーティリティの外部環境(シェルまたはシステム全体)は、この一時ロケール遷移の影響を受けません。

locale(1)システムマニュアル()をお読みくださいman 1 locale

答え2

ロケール設定は、ほとんどのプログラムが使用する言語を決定する方法です。一部のプログラムでは設定が異なりますが、メッセージ言語を選択する最も一般的な方法は地域設定を使用することです。複数のアプリケーション(または一連の関連アプリケーション)で作業する他の方法はありません。

ただし、システム設定を指定する必要はありません。異なる設定でプログラムを一度だけ実行してください。メッセージのロケールは次のとおりですLC_MESSAGES(参照:ロケールを何に設定する必要がありますか?これはどのような影響を及ぼしますか?)なので、環境変数を設定して設定できますLC_MESSAGESCすべてのシステムは、翻訳されていない基本メッセージ(通常英語)を表す特別な値をサポートします。

シェルでは、次のコマンドはmyprogram環境変数が英語メッセージで実行されるように設定されたLC_MESSAGES状態で実行され、他のロケール設定は変更されていません。 )。Cmyprogram

LC_MESSAGES=C myprogram

プログラムが実行されると、同じシェルで実行される他のプログラムは一般的なロケールを使用し、変更は保持されません。端末内で変更を維持するには、次の手順を実行します。

export LC_MESSAGES=C

これは他の端末で起動されたプログラムには影響しません。

答え3

プログラムを実行する前に、次の操作を行います。

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

プログラムが/etc/init.dのスクリプトによって実行されている場合は、そのプログラムをスクリプトに入れる必要があります。

答え4

「ロケール変換以外」 - 短い答え:いいえ。

長い答え:

アプリケーション開発者がロケールに関係なく、すべてのエラーメッセージを英語で印刷することを決定した場合は、確実に簡単に行うことができます。彼らがしなければならないのは、gettextの翻訳機能を通じてこれらの文字列を送信しないことだけです。

アプリケーション開発者がエラーメッセージに異なるロケールを指定するために異なる環境変数(または他の手段)を導入することを決定した場合は、これを比較的簡単に実行できます。機能newlocale()*_l()役に立ちます。しかし、私はこのようなアプリを見たことがなく、開発者が気にする理由がないと思います。

アプリケーションは通常、環境変数に基づいてロケールを初期化し、必要に応じて使用しているロケールに基づいて文字列を変換します。

エラーメッセージを翻訳する定期的な国際化アプリケーションがあると仮定すると(私が考えるとこれがあなたが心配していると思います)、標準出力に移動する文字列に1つのロケールを使用し、文字列を処理するために別の環境を使用します。できるようにする方法はありません。出力されます。標準エラーに表示されます。これは、LD_PRELOADライブラリのようなトリックで「ハッキング」することはできません。理由は簡単です。翻訳された文字列を設定するときに、文字列が同時にどこに表示されるか(stdout、stderr、ログファイル、グラフィカルインタフェース、有線を介した転送など...多分それ以上)、まだわかっていません。 )。ただし、処理できるようにするには、文字列を翻訳された形式で生成する必要があります。


Google でソリューションを検索するときに英語以外のロケールでアプリを使用する場合は、次の提案に従ってください。

エラーメッセージで、固定文字列(たとえば、置換されていない数字や単語など)で発生する可能性がある大きな部分文字列を見つけます。 /usr/share/locale/(yourlocale)/LC_MESSAGES の下でこの文字列を実行して、その文字列がどのファイルから来たかを調べます。一致するものがない場合は、7ビットのASCII(英語)文字のみを含む部分文字列で繰り返します。 *.mo/*.gmo ファイルはすべてのエンコーディングに存在する可能性があるためです(最新のソフトウェアでは通常 UTF-8 ですが)。エラーメッセージが発生したファイルを見つけたら、ファイルを実行してmsgunfmt元の英語の文字列を見つけます。


アップデート:あなたがAURとmakepkgに問題があるとコメントで言及したことに気づきました。

他の人が答えたように、英語のロケールを使用して特定のプログラムを実行するのは簡単です。これはパッケージの構築に強くお勧めします。

だから私はあなたの質問を誤解したかもしれません。上記の答えは、「私が好む英語ではなく、ロケールでアプリケーションを実行することは可能ですが、[同じプロセス]でエラーメッセージを英語で印刷できますか?」という質問に対する答えです。

関連情報