C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[8]: フォームデザイン時の多言語化に対応


(過去ログ 110 を表示中)

[トピック内 11 記事 (1 - 11 表示)]  << 0 >>

■65382 / inTopicNo.1)  フォームデザイン時の多言語化に対応
  
□投稿者/ researcher (3回)-(2013/02/21(Thu) 12:54:50)

分類:[C#] 

researcherです。

多言語化に対応しようと思い、プロジェクトリソースにそれぞれの言語の文字列を登録して
切り替えようとしているのですが、その場合ソース内で以下のような記述で動的に切り替えなければいけないので
デザイナで多言語に対応したいと考えております。

例)Text1.text = Properties.Resources.Hello → デザイナプロパティ Text項目: Properties.Resources.Hello

自分でネットで調べた結果、フォーム側でリソースを作成する方法も見つけたのですが、
他のフォームと共通の単語を使う場合はそれぞれのフォームで設定しなければならないので
できればプロパティリソースを使いたいと考えております。

ソースを使わずにデザイナで解決することができるのでしょうか。
何かいい案がございましたら教えてくだされば幸いです。

開発環境 C#2008
引用返信 編集キー/
■65386 / inTopicNo.2)  Re[1]: フォームデザイン時の多言語化に対応
□投稿者/ howling (203回)-(2013/02/21(Thu) 14:53:52)
2013/02/21(Thu) 14:55:31 編集(投稿者)

No65382 (researcher さん) に返信
こんにちわ。

すみません、おっしゃる事の理解が及んでいないため、わからないながらにお答えします。

わからない用語(こういう言い方ありましたっけ?)
・プロジェクトリソース→プロジェクトに追加したリソースデータのこと。
・デザイナプロパティ→フォームなどのソースをデザイナーで表示した場合のプロパティウィンドウで変更可能な値のこと。
・プロパティリソース→プロジェクトに追加したリソースデータのプロパティを選択した場合の、プロパティウィンドウで変更可能な値のこと。

--------------------------------------------------------------------------------------------------------------------------------

デザイナーで何がし、というのは、あくまで最初にInitializeComponentメソッドを呼んだ場合に設定される値であって、
そこから先、動的に何かをしたいという場合はコーディングが必須となります。

もし、何か(今回だと言語なのかな?)を変更したい場合は、
「変更したい」という要請が来るタイミングがどこなのかをまず考えてみることです。
この「タイミング」がハッキリわかれば、それに近しいイベント内で処理(今回だと言語を変更する?)すれば良いです。

重ねて書きますが、私の知る限りでは、デザイナー上で動的に何か変更を加えるということは不可能です。
もしそれでもデザイナーで、というのなら、
日本語版.exe
英語版.exe
…というように、複数exeを作るしか無理じゃないかと思います。

イベントではなく、配る相手先によって変えるなら、どの言語を読み込むのかが書かれているファイルをexeから読み込めるように設定し、
この外部ファイルを編集すれば、exeを作り直さなくても言語が変更されることでしょう。
この場合も、コーディングは必須(読み込み&書き込み)になりますので、仕様次第になりますが…。
引用返信 編集キー/
■65389 / inTopicNo.3)  Re[2]: フォームデザイン時の多言語化に対応
□投稿者/ researcher (4回)-(2013/02/21(Thu) 15:11:32)
わかりづらくて失礼しました。
プロジェクトリソース → その通りです。
デザイナプロパティ → その通りです。
プロパティリソース → プロジェクトのリソースの間違いです。すみません。

うむ、やはりそうなりますよね。
http://www.atmarkit.co.jp/fdotnet/dotnettips/314winmultilang/winmultilang.html
※最初の質問で書いていたフォーム側でリソースを作成する方法です
上の方法だと言語ごとにテキストを含む、フォーム情報をそれぞれ設定できるようなのですが、
やはり、そのようなやり方は特殊で本来動的な処理はソースで設定しなければいけないのでしょうね。

このまま有効な情報がなければ明日に質問を閉めようと思います。
howlingさんありがとうございました。
引用返信 編集キー/
■65392 / inTopicNo.4)  Re[3]: フォームデザイン時の多言語化に対応
□投稿者/ howling (205回)-(2013/02/21(Thu) 16:31:06)
No65389 (researcher さん) に返信
> http://www.atmarkit.co.jp/fdotnet/dotnettips/314winmultilang/winmultilang.html

こちら、拝見しました。
ふーむ、これを見る限り、デザイナ上でどうにかなりそうですねぇ。
ただし、おそらくデザイナ上で書き記した言葉のみ、適応されるのではないでしょうか。

ですから、例えばこのデザイナ上で特定のコンボボックスに対して

 こんにちわ(日本語)
 Hello(英語)

というのを指定することはできそうです。

ただし、デザイナ上ではなく、後からこのコンボボックスに対して「こんにちわ」と追加する場合は、
自分でif文か何かで分ける必要があるんでしょうね。

実行時に、そのPCが基準としている言語に合わせて、どのリソースファイルを読み込むのか決めている感じなんですね、多分。
これは初めて知りました。今後の勉強になります。

…でも、このURLを見て、やりたいことが達成できないということで質問されてるんですよね?

先の回答にも書きましたが、何をしたいのかもしっかり理解できていないので、曖昧ですが

1.exeを起動して設定ウィンドウを表示
2.設定ウィンドウで「英語」を選択して「実行」する
3.2で選んだ言語に合ったリソースファイルを読み込んで、アプリケーションが起動する

…というようなことをやりたい場合は難しい気がしますね。
上記のURLにある順番で、勝手にカルチャが選択されている部分を、
設定ウィンドウの「実行」時に変更してやる必要が出てきますので…。
引用返信 編集キー/
■65394 / inTopicNo.5)  Re[4]: フォームデザイン時の多言語化に対応
□投稿者/ researcher (5回)-(2013/02/21(Thu) 16:56:49)

> …でも、このURLを見て、やりたいことが達成できないということで質問されてるんですよね?
えぇ、そうです。
繰り返しになってしまいますが、この方法だと「フォーム内限定の文字列リソースということになってしまう」ので、
できるかぎりなら「他のフォームでも同じ言葉を共有するために」プロジェクトのリソースで
設定したものをデザイン時に反映したいということですが、なかなか厳しそうですね。

引用返信 編集キー/
■65395 / inTopicNo.6)  Re[5]: フォームデザイン時の多言語化に対応
□投稿者/ howling (206回)-(2013/02/21(Thu) 17:39:17)
No65394 (researcher さん) に返信
あぁ、ようやく意味がわかった。すみません時間がかかってしまって…。

複数フォームで同じリソースを共有するようなことはできないか?ということですかね。
勝手に設定されてしまう以上は、これ自体は難しそうですね。

代替案として、先にリソースを読み取るフォーム(言語設定フォーム)を表示します。
次に、この言語設定フォームが別のフォーム(アプリフォーム)を呼び出す際に、今使っている文字列一覧を送ってやり、
アプリフォームは常に読み取った内容を表示してやる、という物はいかがでしょう?

ただ、結局このやり方だと言語設定フォームで使用されていない文字列は、アプリフォームでも使えない、ということになってしまいますよね…。
同じく、「どの言語が設定されたのか」をアプリフォームに伝えてやり、アプリフォーム側でそれに合わせた文字列を表示してやることはできますが、
それなら最初から、アプリフォームも多言語仕様にしてやった方が手っ取り早いかと…。

また、先に「勝手にカルチャーが設定されてしまう」と書きましたが、
このカルチャーによって読み込む言語ファイル?をアプリフォームに伝えて、
アプリフォーム側でそれを読み取って自分もそのカルチャーに設定する、ということができれば何ら問題ないのですが、
URLを見ている限り、勝手に設定されることは免れなさそうですねぇ…。
引用返信 編集キー/
■65403 / inTopicNo.7)  Re[5]: フォームデザイン時の多言語化に対応
□投稿者/ Azulean (103回)-(2013/02/21(Thu) 22:13:26)
2013/02/21(Thu) 22:14:39 編集(投稿者)

プロジェクトのプロパティのリソースタブに文字列を設定していて、それを多言語対応させたいという風に読み取りましたが、合っていますか?

そうであれば、プロジェクトに対して新しい項目の追加、アセンブリリソースファイルを選び、Resources.ja-JP.resx のようにカルチャ(ja-JP, en-US など)を含む名前をつけて追加してください。
そして追加された resx ファイルをソリューションエクスプローラー上で Properties ノードにドラッグして移動し、既存の Resources.resx と同じフォルダーにしてください。

追加した resx に対して元の Resources.resx と同じ定義名で別の文言を当てれば、そのカルチャに対する文言として扱われますので、これで多言語対応ができるはずです。

-----
ポイントとしては 同じ名前.カルチャ名.resx でアセンブリリソースファイルを追加すること、同じ名前(識別子)で文言を設定することです。
引用返信 編集キー/
■65414 / inTopicNo.8)  Re[6]: フォームデザイン時の多言語化に対応
□投稿者/ researcher (6回)-(2013/02/22(Fri) 11:21:17)
現在はAzuleanのおっしゃる通りの方法でやっております。
その方法でプログラムを実行せずにデザイナ上で確認を取りたいのですが
そのままコントロールのプロパティにProperties.Resources.Helloと記入するとそのままの文字列が出てきてしまいます。
デザイナ上で確認ができて、なおかつプロパティのリソースで設定した文字列を共有できる方法を探しております。



引用返信 編集キー/
■65415 / inTopicNo.9)  Re[7]: フォームデザイン時の多言語化に対応
□投稿者/ howling (208回)-(2013/02/22(Fri) 11:58:18)
No65414 (researcher さん) に返信
ふむふむ…勉強にもなるので試してみました。

1.アプリケーションを作成します。(FormsAppli1とする。勝手に作られるフォームをForm1とする)
2.Form1にデザイナ上でラベルを貼り付けます(label1とする)。テキストはそのまま「label1」のままで良いです。
3.デザイナ上でForm1を選択し、プロパティウィンドウを開きます。
4.localizableをtrueに設定し、languageを英語に設定します。
5.そのままデザイナ上でlabel1を選択し、文字列を「Hello」に書き換えます。
6.デザイナ上でForm1を選択し、languageを(既定値)に設定します。(ここでForm1.en.resxができるようです)
7.今度はそのままlanguageを日本語(日本)に設定します。
8.そのままデザイナ上でlabel1を選択し、文字列を「こんにちわ」に書き換えます。
9.デザイナ上でForm1を選択し、languageを(既定値)に設定します。

この流れでやることで、デザイナ上で文字列が変化していることが確認できるようになります。
確認方法は、デザイナ上でlanguageを「リソースを追加した言語」に設定する、それだけです。

いかがでしょうか?

引用返信 編集キー/
■65418 / inTopicNo.10)  Re[7]: フォームデザイン時の多言語化に対応
□投稿者/ Azulean (104回)-(2013/02/22(Fri) 12:45:12)
2013/02/22(Fri) 12:54:33 編集(投稿者)

No65414 (researcher さん) に返信
> 現在はAzuleanのおっしゃる通りの方法でやっております。
> その方法でプログラムを実行せずにデザイナ上で確認を取りたいのですが
> そのままコントロールのプロパティにProperties.Resources.Helloと記入するとそのままの文字列が出てきてしまいます。
> デザイナ上で確認ができて、なおかつプロパティのリソースで設定した文字列を共有できる方法を探しております。

ようやく見えました。
だとするとデータバインドについて調べてもらうとよいかもしれません。
リソースのような static クラスは直接バインドできなさそうなので中継するクラスを作らないといけなませんが、準備を終えればあとはデザイナからどのプロパティを割り当てるか設定できます。

追記
すもません。この方法ではデザイナでの確認まではできません。
恐らく、デザイナ上で確認ができるレベルの共通化方法はコードで書くとか、ユーザーコントロールにするぐらいしかないかもしれません。。。
引用返信 編集キー/
■65423 / inTopicNo.11)  Re[8]: フォームデザイン時の多言語化に対応
□投稿者/ researcher (7回)-(2013/02/22(Fri) 15:26:26)
皆様ありがとうございます。
複数のコントロールでリソースを参照することになると思うので
今後の拡張を考えてコードで書くことにしました。
たくさんのご意見ありがとうございます。
※この質問は閉じるつもりなので解決済みチェックをつけさせていただきます。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -