質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

Q&A

解決済

1回答

789閲覧

ClickOnceアプリケーションをOSを識別して自動でサテライトアセンブリを切り替える方法

---stax---

総合スコア148

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

1グッド

0クリップ

投稿2018/02/15 10:05

使用環境 visualstudio2010

表題の件で質問させてください
多言語対応アプリケーションを日本語OS、英語OSで対応できるように日本語、英語両方のリソースファイルを作成し、使用するPCのOSで判断してサテライトアセンブリを切り替えたいと考えています
visualstudio2010を用いて日本語OSのPCではコード内に

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US");

と表記し言語の切り替えを確認できましたが、
実際英語OSのPCで発行したアプリケーションを立ち上げると日本語のまま表記されています
発行したアプリケーションのDLLには英語リソースファイルは抜けなく入っておりました

参考リンク
上記リンクを参考にいたしました

使用するOSで自動的にリソースを切り替えるということは可能でしょうか?
大変わかりにくく説明不足な点ばかりだと思いますがよろしければアドバイス宜しくお願い致します。

bochan2👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/02/16 01:53

> 実際英語OSのPCで発行したアプリケーションを立ち上げると日本語のまま表記されています ← その時の CurrentUICulture はどうなっているのでしょう? 期待通り en-us となっていて、xxx.resx, xxx.en-us.resx, xxx.ja-jp.resx がちゃんと存在しているのにもかかわらず、期待に反して xxx.ja-jp.resx から取得すると言ってます?
---stax---

2018/02/19 00:01

返答遅くなり申し訳ございません。今回自分が作成したプログラムではないのですが、コードの中を検索してもCurrentUICultureの表記がなくSystem.Globalization.CultureInfo.CurrentCultureの情報を受け取っている変数やコードがありませんでした。自分でも調べたのですがカルチャーを明示的に書かなくても.NetFremeworkで判断して自動でリソースを切り替えてくれるようなのですがリソースファイル以外にも何か他に設定等しておく必要があるのでしょうか?
退会済みユーザー

退会済みユーザー

2018/02/19 01:09

ここには書ききれないので、回答というにはちょっとアレかもしれませんが、回答欄に書きます。
guest

回答1

0

ベストアンサー

以下の記事は ASP.NET Web Forms アプリのカスタムコントロールの多言語化の例です・・・(基本的には同じはず)

多言語対応カスタムコンロトール
http://surferonwww.info/BlogEngine/post/2010/12/06/Multi-Languages-Web-Custom-Control.aspx

記事のようにリソースファイルを作りコンパイルすると、記事の一番下の画像のように、カスタムコントロール本体のアセンブリと en-US, fr-FR, ja-JP フォルダ(中身はローカライズされたリソースのサテライトアセンブリ)が生成されます。

多分このあたりまでは質問者さんがご自分の開発環境で行ったのとほぼ同じだと想像しています。

ローカライズされる仕組みは、リソースマネージャが実行時に、現在のアプリを処理しているスレッドのカルチャ情報 (CurrentUICulture) を参照してローカライズされたリソースを検索し、UI に表示されるテキストを取得するということだそうです。

なので、質問者さんがご自分の開発環境で、

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US");

としたときは、リソースマネージャが実行時に、現在のアプリを処理しているスレッドの CurrentUICulture は en-us と判断し、当該リソースからテキストを取得して、

言語の切り替えを確認できましたが

ということになったと想像しています。

ここまで想像は合っているでしょうか?

とすると、

実際英語OSのPCで発行したアプリケーションを立ち上げると日本語のまま表記されています

ということの原因として考えられるのは:

(1) そもそも多言語化できてない or

(2) アプリを処理しているスレッドのカルチャが en-us になってない or

(3) en-us のサテライトアセンブリがない

ぐらいですが、(1) はなさそう、(3) は、

発行したアプリケーションのDLLには英語リソースファイルは抜けなく入っておりました

とのことですのでこれもなさそうということで、先の私のコメントで (2) を確認してはいかがでしょうと提案しました。

今回自分が作成したプログラムではないのですが

とのことですがソースコードに手を加えることができるなら以下のようなコードを追加して ci がどうなるか調べてみてはいかがでしょう。

CultureInfo ci = System.Threading.Thread.CurrentThread.CurrentUICulture;

投稿2018/02/19 01:44

編集2018/02/19 10:00
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

---stax---

2018/02/20 00:57 編集

返答遅れてすみません。丁寧にありがとうございます。 SurferOnWww様の想像して頂いたイメージで間違いありません。 Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US"); 上記のコードを書いて自分の環境で強制的に英語OSと同じ状況にしてみました。 一つ進展としては var cultur = System.Globalization.CultureInfo.CurrentCulture; System.Threading.Thread.CurrentThread.CurrentCulture = cultur; System.Threading.Thread.CurrentThread.CurrentUICulture = cultur; 上記のコードをプログラムのメインのエントリポイントに書くと英語OSで試した際には英語で表記されました。 ただ、.NetFremeworkが自動でやるはずの処理を明示的にしただけでなぜ反映されたのかは不明です。 今回複数のアプリを多言語対応するのですが、他のアプリ(WindowsForm、Clickoneceアプリ)も同様に英語OSに入れただけではリソースは反映されず、加えて明示的な処理(en-USと指定)を書いても反映され無い状況になっています。 頂いたコードを自分の環境(日本語OS)で試してみると、変数ciには最初はja-JP,カルチャーを指定するとen-USと切り替わっているのは確認できました。この内容でインストーラ等を発行し、英語OS環境下で実行させると日本語で表記されており原因がわかりません・・・。 他にどんな原因が考えられるでしょうか? 大変分かりにくい質問で申し訳ありません。
退会済みユーザー

退会済みユーザー

2018/02/20 09:02 編集

質問者さんの言われる「英語OS」というものが不明なのでハズレかもしれませんが・・・ 自分の Windows 10 Pro 日本語 OS では、コントロールパネルにおける「地域」の設定に対応するカルチャが設定されますが、自分が試した限りでは CurrentCulture のみで CurrentUICulture は変わりませんでした。 具体的には、「地域」の[形式(F):]を「日本語(日本)」から「英語(米国)」に変更すると、CurrentCulture は ja-JP から en-US に変わりますが、CurrentUICulture は ja-JP のままでした。 リソースマネージャは CurrentUICulture を参照するので(CurrentCulture ではなく)、結果、リソースは ja-jp のものとなります。 ホントの英語 OS は持ってないので、デフォルトでどうなっているか不明ですが、質問者さんが「英語OSで試した」という結果からすると上記と同様なことが起こっているような気がします。 以下のようなコードを入れて確認してはいかがでしょう? CultureInfo ci = Thread.CurrentThread.CurrentCulture; CultureInfo uci = Thread.CurrentThread.CurrentUICulture; this.label2.Text = "現在の Culture: " + ci.ToString() + ", UICulture: " + uci.ToString(); 上記のコードで、CurrentCulture が en-US、CurrentUICulture が ja-JP ということが確認出来たら、対症療法的ですが、Thread.CurrentThread.CurrentUICulture に Thread.CurrentThread.CurrentCulture を代入したら望む結果になると思われます。 (注)CurrentCulture と CurrentUICulture の違いは、先に紹介した記事の一番最後のリンク先を見てください。
---stax---

2018/02/22 00:10

返答遅くなりすいません。いろいろ試してみているのですが進展がありません・・・。AとBというアプリがあるとして、Aのアプリは var cultur = System.Globalization.CultureInfo.CurrentCulture; System.Threading.Thread.CurrentThread.CurrentCulture = cultur; System.Threading.Thread.CurrentThread.CurrentUICulture = cultur; というコードを書くだけで日本語→英語に切り替わりました。 一方のBというアプリは上記のコードだけでは切り替わらず、 System.Threading.Thread.CurrentThread.CurrentUICulture =System.Globalization.CultureInfo.GetCultureInfo("en-US"); このようなコードを追加しても英語には変わりませんでした。 アプリを発行する際に規定値→英語に変更すると一部英語になります。 自らカルチャーを指定しても切り替わらないことで手詰まりになってしまいました・・・ 実際にアプリを動作させたい英語版WindowsOSが入っているPCにはvisualstudio等の開発環境は入っておらず、自分の環境も日本語OSのため動作時のカルチャーの状態がわからない状態での確認なのですが、他に確認できる箇所はありますでしょうか?何度も分かりにくい質問で申し訳ありません
退会済みユーザー

退会済みユーザー

2018/02/22 00:28 編集

上の私の回答、コメントを読んでないもしくは理解してないように思えます。直近の質問者さんの疑問に対する答えはすべて書いてあります。もう一度よく読んで理解してください。その上でどうしても分からなければ、どこが分からないかを質問していただければと思います。
---stax---

2018/02/22 01:22

回答ありがとうございます。再度頂いた回答を読み直しました。 自分で書いたコードは現在のカルチャ情報をCurrentCulture、CurrentUICultureに当てはめるという意味で書いてみました。 var cultur = System.Globalization.CultureInfo.CurrentCulture; System.Threading.Thread.CurrentThread.CurrentCulture = cultur; System.Threading.Thread.CurrentThread.CurrentUICulture = cultur; SurferOnWww様から頂いたコードだと var cultur = System.Threading.Thread.CurrentThread.CurrentCulture; System.Threading.Thread.CurrentThread.CurrentUICulture = cultur; このような意味かと思うのですが、自分が書いたコードとは意味が違うのでしょうか? カルチャの取得の記述が違う部分は System.Globalization.CultureInfo.CurrentCulture; Thread.CurrentThread.CurrentUICulture; 上記の部分だけかと思うのですが、この2つでは意味が違うのでしょうか・・・?
退会済みユーザー

退会済みユーザー

2018/02/22 01:52

> この2つでは意味が違うのでしょうか・・・? 同じです。(アプリを処理しているスレッドの CurrentCulture と CurrentUICulture を同じにするという意味では) どうも話が噛み合ってないように思えます。 自分はその話より前に、そう言うコードを入れないデフォルト状態で CurrentCulture と CurrentUICulture がどうなっているかを以下のようなコードで調べてはいかがと提案してます。 CultureInfo ci = Thread.CurrentThread.CurrentCulture; CultureInfo uci = Thread.CurrentThread.CurrentUICulture; this.label2.Text = "現在の Culture: " + ci.ToString() + ", UICulture: " + uci.ToString(); まずそれをやっていただけますか? それを調べたうえで、必要があれば、対症療法的ですが CurrentCulture と CurrentUICulture を同じにするコードを入れるということを提案してます。
---stax---

2018/02/26 00:41

回答ありがとうございます。返答遅くなり申し訳ありません。まずは頂いたコードをアプリ上にlabelを追加して試してみました。ただアプリを実際の環境で立ち上げるとlabelの追加が反映されていませんでした。この現象は私が質問している内容(https://teratail.com/questions/114580)と同じで変更が反映されていない現象で、上記リンクで他の方の回答に書いてあった発行したアプリのバージョンについて着目しました。結論としては、私のClickOnceの理解が間違っておりました。アプリを発行するバージョンを変更せずにアプリ発行をしており、「同じバージョンがありますが上書きしますか?」というようなメッセージボックスも確認していましたが、同バージョン内でも上書き自体はされており、変更は反映されていると認識しておりました。こちらのリンクを参考にバージョンをあげると(https://msdn.microsoft.com/ja-jp/library/haeyaeba.aspx)labelは追加され、CultureとCurrentUICulture共にen-USと表記されており、アプリ自体も英語で表示されておりました。英語リソースを追加した際に英語での表示がされなかったのも、アセンブリ情報でアプリのバージョンは上げても、発行のバージョンを上げていなかったからと考えます。今回初めてClickOnceに触れましたが理解出来ていないまま使っていたことが今回のトラブルに繋がりました。改めて勉強いたします。丁寧に回答して頂き本当にありがとうございました。
退会済みユーザー

退会済みユーザー

2018/02/26 02:29 編集

結局原因は何だったのでしょう?  最初の私のレスで書いたとおり以下のいずれかと思っていますが、上のコメントで説明いただいた内容からは、どれだかはっきり分からなかったです。 (1) そもそも多言語化できてない or (2) アプリを処理しているスレッドのカルチャが en-us になってない or (3) en-us のサテライトアセンブリがない 質問者さんの言われる「英語OS」では (2) は問題なくて、ClickOnce での発行の不具合で (1) もしくは (3) の状況となっていたということでしょうか? お手数ですが、情報の提供をお願いします。
---stax---

2018/02/26 03:00

分かりにくくて申し訳ありません。 (1)(3)の状態になっていたと考えます。 以下の数値は例ですが自分の行った手順を思い出していくと 1:元々作成されていたプロジェクトに多言語対応の為、英語リソースを作成しプロジェクトに追加 自身の環境で動作確認出来ないためリソース追加したものをバージョン管理ツールにアップ アセンブリ情報 1.2.0.8000 → 1.3.0.0(更新) 発行バージョン 1.2.0 → 1.2.0(更新せず) 2:確認できる環境が準備できたのでリソース追加したアプリを発行し、動作確認実施 この時に英語OS環境で日本が表記されている状態を確認 その後質問と同じ内容を実施 アセンブリ情報 1.3.0.0(更新せず) 発行バージョン 1.2.0(更新せず) 3:設定を変更したり、確認のコードを追加したり、アドバイス頂いたコードやラベルの追加を実施 何度設定の変更してアプリを発行しても英語環境ではどれも反映されず日本語でアプリが立ち上がる アセンブリ情報 1.3.0.0(更新せず) 発行バージョン 1.2.0(更新せず) 4:ClickOnceの発行時のバージョンについて気付く アセンブリ情報 1.3.0.0(更新せず) 発行バージョン 1.3.0(更新) 5:発行バージョンを上げると英語でアプリが立ち上がる というような流れになっています。 このことから、1:で英語リソースファイルを追加した段階でリソースファイルの実態はプロジェクト内に追加されておりDLLの確認も大丈夫でしたが、同じ発行バージョンで上書きをしていたことで発行されたアプリケーションには実際はリソースファイルは追加が反映されていない状態だったと考えます。 おそらくこれが原因だと思います。
退会済みユーザー

退会済みユーザー

2018/02/26 03:07

詳しい説明をありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問