2009-02-20 25 views
15

私はローカライズされたプログラミングにはかなり新しく、(アプリケーション内から)新しく起動されたアンマネージドC++アプリケーションの適切な初期ロケールを設定する方法を理解しようとしています。WindowsでC++プログラムの適切な初期ロケールを設定するにはどうすればよいですか?

私の知る限り、新しいアプリケーションは適切な地域ロケール(英語、ドイツ語など)ではなく、Cロケールから始まります。だから私がする必要があるのはsetlocale(LC_ALL, "???")ですが、2番目の引数に正しい値を取得する方法がわかりません。 「英語」や「ドイツ語:ドイツ」のようになります。基本的には、地域および言語オプションのコントロールパネルでユーザーが設定したロケールです。私はではありません。は、ロケール文字列をどのようにフォーマットするかを探しています。アプリが動作しているコンピュータの正しいロケール文字列を探しています。

私には、これ、またはおそらく適切な値を含むレジストリキーを与えるWin32 APIがあると思います。誰が私が何をすべきか知っていますか?

答えて

25

setlocale()はCであり、C++ではありません。私はVC6で両者の干渉を見て漠然と覚えていますが、それはバグでした。通常、setlocale()はC関数の動作にのみ影響します。

C++では、ローカライゼーションはstd :: localeクラスによって制御されます。デフォルトでは、ロケール依存の操作では、グローバルロケールが使用されます。グローバルロケールは、デフォルトで取得され、ロケールオブジェクトを構築し、std :: locale :: global(const std :: locale &)で設定できます。

空の文字列(std :: locale( ""))を使用してロケールオブジェクトを作成すると、プログラムの環境に対応するロケールが作成されます。

プログラム起動時に、グローバルロケールは "C"または "Classic"ロケールになります。 (私はあなたが求めているものだと思います)、プログラムの環境ロケールにグローバルロケールを設定し、あなたはこのように書くために:

std::locale::global(std::locale("")); 

例えば、私の地域の設定は、現在、フランス語(カナダ)に設定されています。この実行:

int main(void) 
{ 
    std::cout << std::locale().name() << std::endl; 
    std::locale::global(std::locale("")); 
    std::cout << std::locale().name() << std::endl; 
    std::locale::global(std::locale("C")); 
    std::cout << std::locale().name() << std::endl; 
    return 0; 
} 

プリント:

C 
French_Canada.1252 
C 
+0

グレートを、これは私がまさに必要です。与えられたC++ロケールのname()をsetlocale()に渡して、Cロケールを設定することもできるようです。 – Charlie

関連する問題