2009-07-31 156 views
7

を持っていない場合にのみ機能します。私は英語の文字列テーブルを追加する場合loadStringは、私は、私はプログラム的にアプリケーションの言語を変更、または少なくともコントロールパネルで指定した言語を使用することができるようにしたい英語の文字列テーブル

は、私はプログラム的にフランス語とドイツ語の文字列をロード切り替えることができ、フランス語、それのドイツのコピーを作成し、英語のものを削除します。 ドイツ語やフランス語を読み込もうとしたときに、英語のコピーを保持すると、英語の文字列がロードされます。

これはリソースローダのバグであり、Windowsの言語(Windowsエクスプローラメニューの言語など)と同じ言語の文字列テーブルが見つかった場合、リソースローダはSetThreadLocaleを無視すると考えています。

は私がコントロールパネルを変更しようとしました - >地域と言語のオプション] - > [フランス語の書式が、それは効果がありません。リソースエディタでは、言語を追加せずにフランス語の文字列テーブルが表示されますが、私のプログラムでは常に英語の文字列が読み込まれます。この変更をシステムアカウントにコピーしても効果はありません。

ここで私はこれを試みたコードである:

#include "stdafx.h" 
#include <iostream> 
#include "windows.h" // this should go to stdafx.h 
#include "resource.h" // this should not go to stdafx.h 
using namespace std; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    // 1036 = french, 1031 = german 
    SetThreadLocale(MAKELCID(1036, SORT_DEFAULT)); 
    const int maxSize = 100; 
    wchar_t c[maxSize]; 
    LoadString(GetModuleHandle(NULL), IDS_STRING101, c, maxSize); 
    std::cout << c; 
    return 0; 
} 

Hereは、(方法2の後半の)半分の間違った、不完全な説明です。私は別のポルトガル語 - ポルトガル語とポルトガル語 - ブラジルの文字列テーブルを持っているので、そこに提案された2番目の回避策は、coutry中立文字列テーブルだけを使用することは役に立たない。

そこに提案された最初の回避策は動作しません。下記のコードでエラー1814が発生します。

HRSRC r = FindResource(
    GetModuleHandle(NULL), 
    MAKEINTRESOURCE(IDS_STRING101), 
    RT_STRING); 
DWORD e = GetLastError(); 

どうすればよいですか?この奇妙な "バグ"の説明はなんですか?

LATER EDIT:コントロールパネルの セットが何であるかを返します

  1. GetThreadLocale() - >地域と 言語のオプション] - > [フォーマットは:私がいることが分かったいくつかのより多くのテストの後

  2. リソースローダのバグは、私のプログラムがあまりにも米国英語リソースを持っている場合、これらのリソースは関係なく、形式に設定されているものを、ロードされないことを本質的です。米国英語のリソースがない場合は、フォーマットで設定された言語が使用されます。
  3. 私は(ニュートラル)フランス語とドイツ語(ニュートラル)文字列テーブルを持っている、と私はフランス語(フランス)に書式を設定した場合、ドイツ語の文字列がロードされます。英語(ニュートラル)文字列テーブルを追加すると、英語の文字列が読み込まれます。したがって、フォーマットに設定されているものについて中立文化のフォールバックは機能しません。
  4. 私はニュートラル文字列テーブルを追加する場合は、その一つは、私は別の英語(ニュートラル)または英語(米国)の文字列テーブルを持っている場合でも、使用されます。

答えて

4

ここでキャッチは、スレッドのロケールは、現在選択されているユーザロケールと同じであれば、システムのリソースローダは、デフォルトでは、言語ID 0(ニュートラル)を使用することです。目的のリソースが中立言語として定義されている場合、この値が返されます。そうしないと、すべての言語リソースが(言語ID順に)列挙され、その言語に関係なく最初に一致するリソースIDが返されます。

リソースを制御する唯一の方法は、言語ごとに個別のリソースDLLを使用することです。

+0

現在選択されているユーザーロケールは何ですか?それはWindows Explorerのメニューの言語であり、変更できません。 スレッドロケールは、変更する前にチェックされていますか? リソースエディタでデフォルトのロケールを設定するにはどうすればよいですか? –

+0

コントロールパネルの[地域]設定で選択したロケールです。 –

+0

[形式]タブには関係ありません。 [詳細設定]タブです。 –

5

VistaまたはWindows 7を実行していますか?もしそうなら、SetThreadLocaleは機能しません(たとえTRUEを返しても)、SetThreadUILanguageを使用しなければなりません。

私は、7つの異なる言語に翻訳されたWTLアプリを完成させました。ユーザは、あなたが記述している問題なしに言語を切り替えることができます。私はXPでSetThreadLocale、Vista/7でSetThreadUILanguageを使用しています。

さらに詳しい情報:

http://social.msdn.microsoft.com/forums/en-US/windowscompatibility/thread/d3a44b1c-900c-4c64-bdf8-fe94e46722e2/

http://www.curlybrace.com/words/2008/06/10/setthreadlocale-and-setthreaduilanguage-for-localization-on-windows-xp-and-vista/

6

ストレートMSDNから(にfindResourceの検索順序を含む)選択されているか、ローカライズされたリソースの詳細な説明:Multiple-Language Resources

編集:しかし、私の経験(少なくともWindows XPでは)では、そのページのFindResourceの詳細な検索順序には実際の動作が記述されていません。実際の動作があるように思わ:ラングは、UI言語ラングとリソースSublangに一致する

  1. LANG_NEUTRALリソース
  2. リソースラングとSubLang一致UI言語ラングとSubLang
  3. リソースは
  4. ニュートラルリソースラングですSubLangに一致するロケール言語LangおよびSubLang
  5. Langがロケール言語Langに一致し、リソースSublangが中立であるリソース
  6. リソースが最も小さい数値LANGID

注:私はそのリストを検証するソースがありませんので、誰かが何かを更新または修正できる場合は、それをしてください。

編集:この動作を理解するには、ここで説明するように 'ロケール'と 'UIlanguage'の違いを認識することが重要です。NLS Terminology FindResource関数の言語の選択は、主に、 '地域と言語のオプション'(SetThreadLocale()の呼び出しと同じ 'ロケール'設定)の '地域オプション'設定ではないUI言語に基づいています。

ロケール設定または 'SetThreadLocale()'がFindResource()に影響を与える理由は、@Kirill V. Lyadvinskyによってここで解説されている例外ケースのためです。 Michael Kaplan's blogにあります。

コード内のFindResourceの言語を明確かつ確定的に設定することは、Vista以降の新しい関数 'SetThreadUILanguage'でのみ可能になりました。代わりにSetThreadLocaleを使用するすべての場所は、UI言語が変更されたとき(つまり:外国語ウィンドウがインストールされているとき)、動作させるか、または問題が発生するようにハックします。

+0

[多言語リソース](https://msdn.microsoft.com/en-us/library/cc194810.aspx)リンクは、1995年頃に書かれた書籍(Windows 95およびVisual C++ 2.0を指します)からのリンクです。それ以来、いくつかの機能/動作が変更されているように見えるので、リンク内の情報は塩分で取り込む必要があります。 – Val

+0

はい、MLRリンクは古いです - Vistaのバージョン以降では、答えの最後に私のメモを参照してください。その後、常にSetThreadUILanguageを使用する必要があります – Sogger

関連する問題