tl;dr
プラットフォームに依存LANGUAGE
せずに環境設定 (またはLC_MESSAGES
ロケールのコンポーネント)を変更することは可能ですか? そうでない場合 (おそらくそうです)、要求された値が実際に合法的/有効であったかどうかを検出できますか?
環境
私の関数の 1 つはgrep()
、エラー メッセージのテキストを ing することによって、特定のエラーの発生を検出しようとしました。LANGUAGE
以前に R メーリング リストで指摘されたように (現在は参照先が見つかりません)、このアプローチは脆弱です。メッセージのテキストは、環境変数の設定に基づいて変更される可能性があります。
そこで、それを行わないようにコードを変更していますが、問題が発生するかどうかをテストするリグレッション テストをパッケージに追加したいと考えています。そして、プラットフォーム間で動作する (または少なくとも失敗しない) ことを望んでいます。
たとえば、この質問Sys.setenv(LANGUAGE=...)
で説明されているように、またはSys.setlocale("LC_MESSAGES",.)
メッセージ言語を変更することができます。しかし、これは正しいLANGUAGE
/LC_MESSAGES
値を推測した場合にのみ機能し、現在のシステムで利用可能です。(それLANGUAGE
は言語コードでありLC_MESSAGES
、ロケールであり、言語を切り替えたいだけの場合、ロケールをインストールする必要はないようです?)
Sys.getenv("LANGUAGE") ## [1] "en_CA:en"
test_msg <- function(msg,silent=FALSE) {
grepl(msg,try(x ,silent=silent))
}
test_msg("not found") ## TRUE ("object 'x' not found")
Sys.setenv(LANGUAGE="fr")
test_msg("introuvable")
## Erreur : objet 'x' introuvable
ここまでは順調ですね。しかし、変数をリセットしてLANGUAGE
もうまくいかないようです...
Sys.setenv(LANGUAGE="en")
Sys.getenv("LANGUAGE")=="en" ## TRUE
test_msg("not found") ## FALSE ('introuvable')
Sys.setenv(LANGUAGE="en_CA:en")
test_msg("not found") ## FALSE ('introuvable')
Cに設定LC_MESSAGES
するとより信頼できるようです...
Sys.setlocale("LC_MESSAGES", "C")
test_msg("not found")
FWIW この一連のコマンドは実際には信頼できないように見えることがわかりました。つまり、環境変数を設定する同じ試みが、以前に何をしたかによってはうまくいくようです...戻って開始し続ける必要があります再現可能な結果を得るためにクリーンなセッションで...
いずれにせよ、フランス語のロケールが利用できないコンピューター、またはロケール/言語名が異なるコンピューターでこれを試しても、うまくいかないことはわかっています。言語設定が機能しているかどうかを把握できるようにしたいと思います。ブルートフォースとして使用できますtest_msg("introuvable")
が、もっとエレガントなオプションがあることを願っています...
の関連ビットsessionInfo()
:
R Under development (unstable) (2018-11-26 r75681)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 16.04.5 LTS
locale:
[1] LC_CTYPE=en_CA.UTF8 LC_NUMERIC=C
[3] LC_TIME=en_CA.UTF8 LC_COLLATE=en_CA.UTF8
[5] LC_MONETARY=en_CA.UTF8 LC_MESSAGES=en_CA.UTF8