2017-03-29 12 views
1

これはローカリゼーションの最初の試みであり、私はもっと混乱していくにつれてそれについて読むことが多くなります。正直言って、私はちょうどこの時点で答えを探しています。だから私が得ているエラーは次のとおりです。resxファイルを使用したローカリゼーションでMissingManifestResourceExceptionが生成される

未処理の例外:System.Resources.MissingManifestResourceException:指定されたカルチャまたは中立文化に適したリソースが見つかりませんでした。コンパイル時に "MeetnGreetSf.Resources.AppResources.resources"が正しく埋め込まれているか、またはアセンブリ "MeetnGreetSf"にリンクされていること、または必要なすべてのサテライトアセンブリがロード可能で完全に署名されていることを確認してください。

を発生し、ここでのクラスです:私は、私はそれがファイルの代わりの.resxへの.resourcesを追加され、いくつかの理由のために近いと思う

public class TranslateHelper 
{ 
    readonly CultureInfo ci; 
    private string ResourceId = "MeetnGreetSf.Resources.AppResources"; 
    private ResourceManager resmgr; 
    private CultureInfo cui = new CultureInfo("es-ES"); 
    public TranslateHelper() 
    { 
     //ResourceId += "." + cui.Name; 
     resmgr = new ResourceManager(ResourceId, typeof(AppResource).GetTypeInfo().Assembly); 


    } 

    public string Translate(string Name) 
    { 
     var translation = resmgr.GetString(Name, ci); 
     return translation; 
    } 

} 

ご協力いただきありがとうございます。

翻訳クラスの使用方法は含まれません。

public Colors() 
    { 
     colorInfo = new ObservableCollection<ColorType>(); 
     t = new TranslateHelper(); 
     this.GenerateColors(); 




    } 

    private void GenerateColors() 
    { 
     colorInfo.Add(new ColorType(t.Translate("Aqua"), Color.Aqua)); 
     colorInfo.Add(new ColorType(t.Translate("Black"), Color.Black)); 
     colorInfo.Add(new ColorType(t.Translate("Blue"), Color.Blue)); 
     colorInfo.Add(new ColorType(t.Translate("Gray"), Color.Gray)); 
     colorInfo.Add(new ColorType(t.Translate("Green"), Color.Green)); 
     colorInfo.Add(new ColorType(t.Translate("Lime"), Color.Lime)); 
     colorInfo.Add(new ColorType(t.Translate("Maroon"), Color.Maroon)); 
     colorInfo.Add(new ColorType(t.Translate("Navy"), Color.Navy)); 
     colorInfo.Add(new ColorType(t.Translate("Olive"), Color.Olive)); 
     colorInfo.Add(new ColorType(t.Translate("Purple"), Color.Purple)); 
     colorInfo.Add(new ColorType(t.Translate("Red"), Color.Red)); 
     colorInfo.Add(new ColorType(t.Translate("Silver"), Color.Silver)); 
     colorInfo.Add(new ColorType(t.Translate("Teal"), Color.Teal)); 
     colorInfo.Add(new ColorType(t.Translate("White"), Color.White)); 
     colorInfo.Add(new ColorType(t.Translate("Yellow"), Color.Yellow)); 
    } 
} 

答えて

1

私はVisual Studioの商用ローカライゼーションツールの著者です(完全開示のため)。 "System.Threading.Thread.CurrentThread.CurrentUICulture"を調査する必要があります。これは、通常、.NETのすべての翻訳が(ローカライズされたリソースを処理するために)中心になっています。しかし、どのように対処するかの仕組みは、プロジェクトのタイプによって異なる場合があります。あなたが今やっているやり方は、通常は必要ありません。通常はそれよりずっと簡単です(専用のクラスは必要ありません)。たとえば、単純なコンソールアプリケーションの基本的なプロセスです(ここでも、プロジェクトの種類によってさまざまです)。

  1. 「でTestApp」と呼ばれる新しいコンソールアプリケーション
  2. を開き、プロジェクトのプロパティを(たとえばソリューションエクスプローラで、それを右クリックして「プロパティ」を選択します)を作成し、[プロパティ]ウィンドウで、「リソース」タブをクリックします。ここで、画面の中央に表示されている「このプロジェクトにはデフォルトのリソースファイルがありません。作成するにはここをクリックしてください」というボタンをクリックします。これにより、ソリューションエクスプローラの "Properties"フォルダの下に "Resources.resx"が追加され、自動的に ".resx"エディタで開きます。
  3. ".resx"エディタで "MyString"という単一の文字列を追加します。 "これは私のデフォルトの文字列です"(または何でも)それを割り当てます。
  4. 文字列を使用するコードで、 "using TestApp.Properties"ステートメントを追加します(続き)。静的プロパティ "Resources.MyString"で文字列にアクセスできるようになりました。これは、上記の手順2でVSによって自動的に作成されたコードビハインドファイル(Solution Explorerの "Resources.resx"の子)である "Resources.Designer.cs"で宣言されています。 VSはあなたのためにこのファイルを調べます(上の3で追加した各文字列の "TestApp.Properties"名前空間に新しい静的プロパティを追加します)。これらの文字列は、「強く型付けされたリソース」と呼ばれます。
  5. プロジェクトに新しい ".resx"ファイルを追加し、 "Resources.es.resx"と呼んでください。これにはスペイン語の文字列が含まれます。作成したら、ソリューションエクスプローラで "Properties"フォルダにドラッグします( "Resources.resx"と同じフォルダにあります)。ローカライズされたすべての ".resx"ファイルは "Resources.resx"と同じフォルダにあります。
  6. 「Resources.es.resx」をダブルクリックし、「MyString」を追加します。そのテキストを「これはスペイン語の文字列です」に設定します。
  7. 文字列のスペイン語版を取得するようにコードの言語を変更する場合は、コード内の "System.Threading.Thread.CurrentThread.CurrentUICulture"プロパティを "es"に設定するだけです。今度は "Resources.MyString"を参照するたびに、その文字列のスペイン語版が代わりに(自動的に)返されます。 IOW、 "System.Threading.Thread.CurrentThread.CurrentUICulture"が現在設定されているものに従います。したがって、あなたのアプリケーションの要件に基づいて後者のプロパティを変更する(たとえば、ユーザーがGUIから目的の言語をクリックしたときなど)、強く型付けされたすべてのリソース(通常は文字列のみ)が自動的に新しい言語を採用します。
  8. これはどのように機能しますか?下の文章は、私がかつて私の顧客に送ったものからの抜粋です。それ(参照は、以下の「YourApp」は上記の例については、「でTestApp」に変更されますすることに注意してください)あなたが始めるのに十分でなければならない:

「あなたが調査する必要があり、 『強く型付けされた』資源の代わり また、衛星アセンブリを調べて、 "System.Threading.Thread.CurrentThread.CurrentUICulture"プロパティー (「CurrentCulture」プロパティーも参照してください。ただし、 はリソースに影響を与えません。 "CurrentUICulture"プロパティによって常に制御されます)。 "CurrentUICulture" プロパティがシステムの現在の状態に設定されていることに注意してください(通常 アプリが起動したとき)。 "Resources.MyString"(これは厳密に入力された リソースの例です)など、プログラム内のすべてのリソースにアクセスすると、システムは "MyString"を検索します。 "CurrentUICulture"プロパティ。そのプロパティー が現在システムのデフォルトに設定されている場合(普通は をコードで変更しない限り)、あなたのアプリのメインアセンブリから の「MyString」のバージョンが返されます。 そこに保存される)。ただし、コードの "CurrentUICulture"を "es" (スペイン語)に変更すると、 ファイル "es \ YourApp.resources.dll"(プログラムのルートフォルダ外)で "MyString"が検索されます。 スペイン語をサポートしていないと、フォルダが見つからない場合や、現実的に "MyString"にはそのスペイン語のDLLに の翻訳が含まれていない場合は、アプリケーションの メインアセンブリなので、デフォルトの言語文字列を再度取得します。 これは短編小説ですが、基本的な詳細をカバーしています。これは、MSFTの ドキュメント(別の用語が使用されることもありますが)の「ハブアンドスポーク」モデルとして従来知られていた です。前述の「フォールバック」プロセスには が依存しています。たとえば、 "System.Threading.Thread.CurrentThread.CurrentUICulture"を "es-AR" スペイン語のアルゼンチン語に設定すると、プログラムは "es-AR \ YourApp"の "MyString"に対して と表示されます.resources.dll "。見つからない場合は (たとえば「es-AR」はサポートされていないので、そのようなフォルダはありません。 または文字列がありません)、 「es」フォルダに「フォールバック」します代わりに(ニュートラルカルチャーとして知られています。この場合は、システムが想定している平易なスペイン語である が次善のものです)。 が見つかりませんでした(「es \ YourApp.resources.dll」)。さらに システムは、メインの アセンブリに埋め込まれているデフォルトの言語文字列にフォールバックします。このすべてを調べれば、あなたの 文字列を扱うことは、今やっている方法と比べて簡単です。その後、表示される「Resources.MyString」 など など任意の強く型付けされたリソースへのすべての参照 - すべて はあなたが自動的にフォールバック状況 (ちょうど 「System.Threading.Thread.CurrentThread.CurrentUICulture」プロパティを調整することによって含むために処理されます のプロパティは現在設定されています)。私はそれが助けて欲しい

+0

いくつかのことを明確にしてくれてありがとうございました。これはxamarin.formsプロジェクトに縛られていて、ローカライゼーションの例を変更してコンバーターを使用することで、このアプローチを廃止しました。 – Chris

関連する問題