問題タブ [resourcemanager]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - キャッスル モノレール マジック
私が取り組んでいるプロジェクトは、多くのロケールをサポートしています。このソリューションは、キャッスル モノレール メカニズムの使用に基づいています。適切なコントローラー クラスは次のようにマークされます。
[Resource("pageResx", "...Controllers.Static")]
ここで、StaticTemplate はコントローラー名のプレフィックスであり、リソース ファイルは '..\Resources\Controllers\StaticTemplate*' に配置されます。
一方、StatiController は、次のようにマークされている BaseController クラスから継承します。
[LocalizationFilter(RequestStore.Session, "ロケール")]
そのため、ユーザーのロケールはセッションに保存されます。で、これです。最後のステップは NVelocity vm-file で、適切なリソースが次のように取得されます。
$pageResx.Buttons_Download
このようにして、locale='de' を持つユーザーの ID = 'Buttons_Download' を持つリソース文字列が、ファイル '..\Resources\Controllers\Static.de.resx' から取得されます。
ただし、ローカリゼーションが行われるプロジェクトには別の場所があります - 電子メールの作成です。そこには次のロジックが実装されています。
パラメータの値を指定すると、resourceString が正しく評価されます。しかし...
ここで魔法が来ます。ブラジルロケール用のリソースファイルがあります。接尾辞「pt-BR」が付いています。ポルトガル語のロケールもありますが、適切なリソース ファイルがありません - 'pt' ファイルがありません。ビュー ページに関しては、モノレールは pt-user の pt-BR ファイルからローカライズされたリソースを取得します。しかし、電子メールの構築を実装するロジックは、同じことを行うことができません。代わりに、「en」が使用されていた基本リソースからローカライズされた文字列を取得します。
リソースをマッピングするための .NET メカニズムについて読みました ( http://msdn.microsoft.com/en-us/library/sb6a8618.aspx )。しかし、モノレールの説明は見つかりませんでした。
問題は、モノレール (または誰でも) が「pt」を「pt-BR」にどのようにマッピングするかです。そして、同じロジックを外部に実装するにはどうすればよいでしょうか?
前もって感謝します
c# - プログラムで参照せずに衛星アセンブリのコンテンツ全体を読み取る方法は?
衛星アセンブリの場所と文化情報が表示されたら、衛星アセンブリの内容を読み取ることができる必要があります。したがって、コンパイル時にこのアセンブリへの参照を追加することはできず、このアセンブリの正確な内容がわかりません(内容全体を読み取る必要があります)。それを行う方法はありますか?反射のように。リソースマネージャーで試してみましたが、それを使って衛星アセンブリのコンテンツ全体を読むことはできないと思います。
以下のようなことは可能ですか?
編集:
私の要件は、「衛星アセンブリの場所と文化情報が提供されたときに、衛星アセンブリに新しい文字列を置き換え/追加する」のようなものです。
ありがとう、
.net - .NETWinFormsローカリゼーション-ComponentResourceManagerの置き換え
現在のプロジェクト(.NET Windowsフォームアプリケーション)では、.NET Windowsフォームをローカライズする必要がありますが、ローカリゼーション要素(画像やコントロールの位置ではなく、翻訳のみ)をデータベースから取得して、エンドユーザーは、コントロールのローカライズ可能なプロパティ(キャプション/テキストのみ)を必要に応じて変更できます。開発者にローカリゼーションの問題を負わせないようにするための最善の解決策は、VSデザイナーでフォームをローカライズ可能としてマークすることです。これにより、ローカライズ可能なすべてのプロパティ値がフォームの.resxファイルに配置されます。
今私の問題は、データベースから翻訳を提供する方法です。フォームがローカライズ可能としてマークされた瞬間、VSフォームデザイナはローカライズ可能なすべてのものをforms.resxファイルに配置します。デザイナは、標準のdesigner.cs InitializeComponentメソッドも変更して、ComponentResourceManagerをインスタンス化し、そのリソースマネージャを使用して、オブジェクト(コントロールとコンポーネント)のローカライズ可能なプロパティをロードします。
ローカライズされたプロパティをフォームとそのコントロールに適用する独自の方法を人々が構築するソリューションを見てきました。私が見たすべてのソリューションは、通常、FormとそのコントロールのControlsコレクションを再帰的に反復し、翻訳を適用することになります。残念ながら、.NETフォームのローカリゼーションはそれほど単純ではなく、特にサードパーティのコントロールがある場合、これはすべてのシナリオを網羅しているわけではありません。例えば:
私が見たすべてのソリューションは、上記のコンポーネントで必要とされるような翻訳を行うことができませんでした。
VSは、必要に応じて変換を提供するコードをすでに生成しているので、私の理想的な解決策は、ComponentResourceManagerを独自の派生クラスに置き換えることです。InitializeComponentの次の行を置き換えることができれば:
と
そうすれば、他のすべてを問題なく解決できました。
残念ながら、私はそのようなことをどのように行うことができるかを見つけられなかったので、ここで私はそれがどのように行われることができるかについて質問しています。
PS私は要件に一致する他のローカリゼーションソリューションも受け入れます:1。アプリケーションを再デプロイせずに翻訳を変更できる必要があります2.開発者はフォーム/ユーザーコントロールを作成するときに翻訳に注意を払うべきではありません
ありがとうございました。
編集:ラリーは私の問題を部分的に解決するコードを持っている本への素晴らしいリファレンスを提供しました。その助けを借りて、InitializeComponentメソッドのデフォルトのComponentResourceManagerを置き換える独自のコンポーネントを作成することができました。Localizerと呼ばれるコンポーネントのコードを次に示します。これは、ComponentResourceManagerをカスタムMyResourceManagerに置き換えて、他の誰かもその恩恵を受けることができるようにします。
.net - 実行時にサテライトアセンブリを追加する
実行時にカルチャを切り替えることができるアプリケーションを作成しました。しかし、アプリケーションが実行され続けている間に、新しいサテライトアセンブリをアプリケーションに追加したいと思います。特定のカルチャフォルダー(ファイルが含まれているフォルダーなど)をアプリケーションフォルダーにコピーしてafからLocalisation.resources.dll、次のコードを実行します。
しかし、その後は何も起こりません。古い文化を見続けますが、追加された文化は表示されません。アプリケーションを停止して開始した場合にのみ、新しいカルチャがコンボボックスに追加されます。
実行時にサテライトアセンブリを追加することは可能ですか?または、常にアプリケーションを再起動する必要がありますか?
c# - ResourceManager は、サテライト アセンブリから読み取る代わりに、既定のリソースにフォールバックします
3 つのプロジェクトのフォルダー構造は次のとおりです。
MyClassLibrary1 プロジェクトの下:
MyClassLibrary1 のプロジェクト プロパティ -> ビルド前、次のようにしました。
MyAppExe プロジェクトの下の Program.cs:
問題は、ResourceManager が何らかの理由でデフォルトのリソース ファイル (MyAppExe に埋め込まれている) にフォールバックし続けることです。ここで私が間違っていることを理解するのを手伝ってください。
何を試しても得られる出力は、「Playgroup」ではなく「Preschool」です。衛星アセンブリがまったく解決されていないようです。
asp.net - ASP.NET 読み取りリソースの値
と の 2 つの.resxファイルがen.resxありhe.resxますApp_LocalResources。Web ページには既に 2 つのボタンがあり、それぞれをクリックすると、他の言語のリソース ファイルに「切り替え」ます。
.resxいずれかのファイルにある文字列値を取得したいだけです。
Google で見つけたいくつかの例を試してみて、自分のプロジェクトで値Assemblyを要求したいだけなのに、なぜ型と名前空間を提供する必要があるのかと自問しました。string
次のようなものがないのはなぜですか: string val = Resources["en.resx"]["SomeProperty"].Value?
たぶん私のアプローチ全体が間違っているので、あなたの意見を読みたいです。
みんなありがとう
visual-studio-2010 - C# 単一アセンブリの多言語アプリ - リソースが正しく読み込まれない
シンプルな C# .NET 4.0 アプリケーションを開発しており、複数の言語にローカライズしたいと考えています。ただし、ローカリゼーション用に作成されたサテライト アセンブリ (つまり、de/MyApp.resources.dll) は、これらの dll とそのフォルダーをドラッグする必要があるため、その単純さが台無しになります。
そのため、これらの dll をメイン (および唯一の) アセンブリに含める手段を探したので、実行可能ファイルのみをエンド ユーザーに送信する必要がありました。私はこの非常に有望な質問に出くわし、試してみました。
提案されたソリューションのクラスを採用した後、ビルド前のコマンドでFARTを使用して、.Designer.cs ファイルで見つかった ResourceManager をすべて SingleAssemblyResourceManager に置き換えました。
次に、次のようなバッチ ファイルを作成しました。
ビルド後のコマンドから呼び出します。
注: この場合、TargetName と ProjectName は同じです。
正常にビルドされましたが、期待どおりに動作しません... フォームは InstalledUICulture 言語で表示されます (利用可能な場合)。これを実現するために、InitializeComponent() の前に次の行を追加しました。
プログラムの「標準」バージョンでトリックを行ったのはどれですか。もう違います。でも!また、ComboBox を介して、実行時に言語を変更するための小さなコントロールを追加しました。コードは次のとおりです。
そして、これはフォーム言語を変更します。したがって、DLLは実際にはexeに含まれています。では、InitializeComponent が適切なリソースをロードしないのはなぜでしょうか? Designer コードを確認したところ、ResourceManager が SingleAssemblyResourceManager に置き換えられていました。
また、フォームボタンのテキスト以外に、メッセージボックスなどのために、言語ごとにstrings.resxファイルがありますが、どちらの方法でも機能しないようです。しかし、それは別の問題かもしれません。
元のソリューションが NET 2.0 環境用に設計されたこと、および ResourceSet が廃止されたことは認識していますが、推奨されていなくても機能するはずであると理解しています。
私がどこを調べるべきかについての指針は素晴らしいでしょう。
c# - C# アプリケーションでローカライズされていないリソースを使用できない
前の質問で述べたように、プログラムの存続期間中に変更されない文字列リソースのセットがありますが、文字列のリストに対する高価な操作によってのみ取得できます。
パフォーマンスを改善するために、ファイルからリストを読み取り、リソース ファイルを出力する T4 で目的の文字列を生成しましたRegex.restext。
このファイルは、ビルド後にターゲット ディレクトリにコピーされてコンパイルされます。
しかし、静的コンストラクター内でこれらの値をロードしようとすると、次のようになりますPatterns。
次のエラーが表示されます。
しかし、これはカルチャーに依存しないプロジェクトです。リソースは単なる保管用です。では、なぜカルチャを指定する必要があるのでしょうか。どのように/どこでそうしますか?
また、リソースをロードするために間違ったアプローチを取っている場合、より良い方法は何でしょうか?