VS2005 MFCにて開発をしております。
VC4.0からの古いソースを移植しています。
今回、多言語化という項目が新機能として追加され、iniファイルから言語設定を読み込
むようにしています。
ダイアログ等の言語変更は問題なくわかるのですが、その他が分かりません。
メニュー項目の変更は
CMainFrame UPDATE_COMMAND_UI
にて変更可能な事は確認したのですが
1.メニュー大項目(IDが見つからない)
2.ツールバーのアイコンにカーソルがある時にでるポップアップ文字列
3.ステータスバーの文字列の変更方法
の3点が今分かっている限りの不明点です。
色々調べて見たのですが分かりませんでした。
ご存知の方がいらっしゃいましたらお知恵を拝借させて下さい。
よろしくお願い致します。
> メニュー項目の変更は
> CMainFrame UPDATE_COMMAND_UI
> にて変更可能な事は確認したのですが
とはプログラムのコードでメニュー文字列を書き換えているということでしょうか?
多言語化対応を行う場合、言語毎にリソースを入れ替えてしまう方法が一般的です。
http://msdn.microsoft.com/ja-jp/library/fe5w38bb(VS.80).aspx
リソースを入れ替えてしまえば、コードを変更するのはリソースが格納されている
DLLをロードする場所だけです。
本々のプログラムが、文字列をコードの中に埋め込んでいるのであればそれも難し
いでしょうが...
コードで行うのだとしたら、
> 1.メニュー大項目(IDが見つからない)
CWnd::GetMenu() + CMenu::ModifyMenu()かな。
他はわかりません。
maru様
ご回答ありがとうございます。
ソース上で書き換えております。
といいますのも、外部ファイル(iniファイルの予定)から文字列を読み込んでそれを表
示する仕様になっているからです。
ユーザーがそのファイルの中身を書き換えるだけで、ソフトウェアの文字列が替えられる
ようにしたいが為です。
リリース後にソースの改変がなく対応しなければなりません。
そこで外部ファイルから読み込む仕様にしました。
教えて頂いた方法では、ソースコードを触らずにユーザーが変える事は難しいですよね?
いまいち教えて頂いた方法が理解する事ができておりません。
リンク先からサンプルまでダウンロードしたのですが、なぜかビルドできませんでした
(スキップになってしまう)。
フリーソフトなどで、LanguageフォルダにJapanese.***というファイルを入れるだけで
言語が日本語を選ぶことができ、それを選択すると表示名称が全て日本語になるようなソ
フトがありますよね。
そういうイメージで作ろうと思っているのですが、そういったソフトはソース上で行って
いるのではないのでしょうか?
何か良い方法があればご教示下さい。
よろしくお願いいたします。
語尾変化が異なる言語とか語順が違う言語まで対応するとなると簡単ではない
もっというと性別/単複で冠詞が異なる場合まであるわけで。
[jp] [無冠詞] 白い 猫 {冠詞なし性別なし複数形なし}
[en] the white cat / the white cats {冠詞は同じでも複数形は違う}
[fr] le chat blanc / la chate blanc / les chats blancs {冠詞も形容詞も皆違う}
日本語ベースで作ってあるとこの辺の対応に苦慮することになるんだけど大丈夫?
FormatMessage の %1 %2 だけでは対処しきれないので簡単ぢゃ無いよ
tetrapod 様
アドバイスありがとうございます。
おっしゃっている内容が分かりませんでした。
iniファイルにて記載されている文字列をそのままCStringに取得し、それを画面に表示す
るだけです。
もちろん外国語の方が長くなるので、その分のサイズはある程度を予めダイアログ等に確
保しておくつもりです。
今までも方法は少し違いますが(CSV)、日本語・英語を元々ファイルに記載しておき、
日本語・英語を切り替え化のソフトウェアを作っております。
今回は何語になるか分かりませんので、iniファイルにて1種類のみの言語を記載する方
式で動的に変わるようにする必要があります。
そして、以前のソフトウェアはダイアログベースでメニュー・ツールバー・ステータス
バーがありませんでしたので、今回のような疑問はありませんでした。
メニューについてだけですが
リソースに頼らず、ソース上でつくればいいのでは
絶対に固定文字列しか表示しないのであればお好きにどうぞ
でも現実問題として、まずそんなことはありえない。
printf(%s ファイルを削除しました, filename);
のようにユーザの指定したファイル名をメッセージの中に含むとか
printf(%d 個の結果があります, result.counts);
のように個数を含むとか
そういうのって無い?無いなら以下読む必要は無い。
printf(%d result(s) found, result.counts);
と英語にすると、複数形の取り扱いがどうにも不細工だと思わないか?
英語だけでも複数形の変化は複雑なのに英語以外も考えるとなると手がつけられない。
上記例はメッセージに可変部が1個しかないが、
可変部が複数個ある場合、その順序は日本語のそれと入れ替わる場合がある。
そういうのはちゃんと考察済みか?ということ。
日付の表記も YYYY-MM-DD の形式もあれば DD/MM/YY の形式もあるし
もっといろいろ別な記述方式があって一辺倒ではない。
金額の表記も前株式の \1000 と、後株式の 39.95Euro とある。
多国語対応をあまり安直に考えているとあとで痛い目にあうよ。
> 金額の表記も前株式の \1000 と、後株式の 39.95Euro とある。
細かいことですが、ヨーロッパでは小数点が','、位どりが'.'なので
39,95Euro
で表記します。多国語対応をまじめにやろうとすると文化の違いまで
考慮する必要がありますね。まあ、この辺(数値、日付)はロケール
である程度対処できますけどね。
rin様
そうですね、ソース上で作ることも考えましたが
ソース上で作るのだったらソース上で変更した方が簡単だろうと思いました。
メニューの変更についてはmaru様の助言により解決致しました。
tetrapod 様
今のところそのような心配はございません。
ファイルに設定された文字を出力するのみで良いという仕様になっております。
アドバイスありがとうございます。
maru様
おかげさまで大項目の変更は何とかなりそうです。
ありがとうございました。
メニュー・ツールバーについては何とか解決しそうなのですが、メニュー等を選択時のス
テータスバーの表示の変更だけが未だに分からずにいます。
ステータスバーを表示してそこに特定の内容を表示させっぱなしという様なケースは調べ
たのですが
メニュー選択時やツールバー選択時に対応した文字列を表示する方法が分かりません。
何かご存知の方がいらっしゃいましたらよろしくお願いいたします。
>メニュー選択時やツールバー選択時に対応した文字列を表示する方法が分かりません。
これは、多言語対応とは無関係でいいのかな?
1:リソースエディタでメニューを表示
2:目的のメニュー項目のプロパティを表示
3:[Prompt]という項目に、目的の文字を入れる
(ステータスバー表示文字列)\n(ツールバーでのツールチップ列)
こんな感じ。
MFCでプロジェクトを作った際に、
「ファイルを開く」などの自動で入ってるものを参考にするといい
rin 様
ありがとうございます。
その部分も多言語対応ですので、コード上などで動的に変更したいのです。
プロンプトを書き換える様な方法があればメニューと上手くリンクして動きそうだと思っ
ているのですが。
この辺を使って頑張ればできるのでは?
ステータスバー
CFrameWnd::GetMessageString
ツールチップ
TTN_NEEDTEXT
すいません。
maruさんの方法を採用したのというのが「リソースの入れ替え」のことだと勘違いしまし
た
ソース上だけでいじるとなるとかなり面倒です
ステータスバーは、表示するタイミングでIDを飛ばし、
親フレームが毎回AfxLoadStringでリソースから文字を読み込んでいましたので
(CFrameWnd::OnSetMessageString()から呼ばれるCFrameWnd::GetMessageString()内)
メニューのような、方法はなさそうです。
親フレームでメッセージを横取りして、
飛んでくるIDにあわせて書き換えるなどすればステータスバーはできました。
ツールチップも同じようにできるかもしれませんが、労力が無駄に感じます
リソースDLLを入れ替える方法を採用し
DLLを作成するテンプレートも一緒に配布し、エンドユーザーに自由に作ってもらうあた
りが
楽かもしれません
(ユーザーにある程度知識が必要ですが)
うーん、
うまく進行しているようですが、
WINDOWSのOSはどうするのでしょうか?
日本語版XP? 英語版XP?
大きなところだけ多言語化しても、コモンダイアログや、
システム関連「ファイル名が違います。」等 などが日本語のまま
になってしまいます。
今のところはいいとしていてもあとからNGになりかねません。
僕も最初日本語OSベースでOKでしたがあとかNGになり、全面的に英語版にインストール
し直したことがあります。
コンテックのツールはインストールしているOSによって「日本語」⇔「英語」の
切り替えが出来るようになっていますね。
>rinさん
>リソースDLLを入れ替える方法を採用し
>DLLを作成するテンプレートも一緒に配布し、エンドユーザーに自由に作ってもらうあた
>りが楽かもしれません
この案でいくならiniファイルの情報を元に
UpdateResourceでDLLのリソースを更新するような
ソフトを別に用意しておけばいいかもしれないですね。
あと言語設定はUNICODEで保存してフォントも変えられるようにした方がいいかも。
#iniファイルでもUNICODEでの保存に対応しているようです。