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

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

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

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

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

4回答

3554閲覧

C# MVC でクライアント側処理を多言語化したい。

t.kusu

総合スコア21

C#

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

MVC

MVC(Model View Controller)は、オブジェクト指向プログラミングにおけるモデル・ビュー・コントローラーの総称であり、ソフトフェア開発で使われている構築パターンとしても呼ばれます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2018/11/18 05:37

編集2018/11/21 13:46

前提・実現したいこと

C# MVC でクライアント側処理を多言語化したい。

発生している問題・エラーメッセージ

C# MVC で Web API プログラムを作成しています。
クライアント側は JavaScript (以下JSと書きます)で作成します。
このプログラムを多言語対応で作成したいと考えています。

サーバー側(C#)で多言語化するのは Resource ファイルにラベルやメッセージを登録してそれを使用するようにすれば出来るのですが、クライアント側(JS)で多言語化対応する方法に悩んでいます。

試したこと

リクエストがあったので追記します。

簡単に思いつく方法として、サーバー側で作成する cshtml ファイル内で JS タグ内に JS の変数として Resource に定義したメッセージなりを渡してあげることを考えました。
この方法はメッセージの数が少なければよいのですが、増えてくると面倒であり、ミスの元にもなります。

他に、Rails などでもよく使用する? I18n っぽく、XML 形式の Resource ファイル内のメッセージ等をビルド時に一括して JS ファイルに var 変数名 = 'メッセージ'; の形式に書き出して、言語に対応した JS ファイルを cshtml ファイルなどにインクルードする手などもありそうです。

ここまで考えて思ったのですが、これは似たような需要が他にもありそうです。
あるのならすでに誰かが解決していそうな気もします。
しかしネットで調べた範囲ではそれらしい記事が見つかりませんでした。

この問題の一般的な対策手法などがあれば教えてください。
一般的と言える手法がないようなら 2) の方法で解決してしまおうと思っています。

具体例

リクエストがあったので追記します。

クラサバなので、クライアント側でも処理を行い、ケースによってはメッセージを表示することがあります。
このとき表示するメッセージも多言語対応を行います。最も単純な手段では以下のようになります。

--- client.js ---
swicth( locale ){
case 'en-EN':
alert( 'Japanese!' );
break;
default:
alert( '日本語!' );
break;
}


ただしメッセージを表示する箇所は多数あるので、この方法では効率がとても悪くなります。そこで以下のようにします。

--- client.js (改1)---
var message = '日本語!';
swicth( locale ){
case 'en-EN':
message = 'Japanese!';
break;
default:
message = '日本語!';
break;
}
alert( message ); // メッセージの定義と表示の処理とを分離する


これでもよいのですが、メッセージはサーバーの Resource で持たせて共用した方が効率が良さそうです。
この方法を探しています。

なお、「試したこと」では以下のようなコトしています。
※「試したこと」の 1) にあたります。

--- client.cshtml (改2)---

<script type="text/javascript" src="client.js"> <script> var message = '@Resource.Japanese'; </script>

--- client.js (改2)---
alert( message );


これで調子が良さそうなのですが、メッセージが増えてくると cshtml 内に書いていくのがめんd・・・大変になります。
なのでクライアントの js プログラムにサーバー側の C# から Resource のメッセージデータを効率よく渡す方法を探しています。

「試したこと」の 2) は具体的には以下のようなことです。

--- resource.resx (改3)---
<data name="Japanese"><value>日本語!</value!></data>


--- resource.en-EN.resx (改3)---
<data name="Japanese"><value>Japanese!</value!></data>


上の様なリソースファイルから以下のような js ファイルを作成します。

--- locale.js (改3)---
var message = '日本語!';


--- locale.en-EN.js (改3)---
var message = 'Japanese!';


そして以下のように利用します。

--- client.cshtml (改3)---

<script type="text/javascript" src="locale@(locale).js"> <script type="text/javascript" src="client.js"> ----- --- client.js (改3)--- alert( message ); ----- Resource ファイルから locale.js ファイルを自動で作れれば作業の誤りをなくせて作業自体も楽になります。 ただ、ここまで考えて、この自動化を自作しなくても他にすでにフレームワークがあるのではないかと思いました。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/11/18 11:31

何をしたいのか理解できません。具体的な例を書いていただけませんか?
t.kusu

2018/11/21 13:46

例を追記しましたが、これでご理解いただけるでしょうか。
guest

回答4

0

ベストアンサー

古い記事なので質問者さんのケースに直接適用できないと思いますが、MSDN マガジンの記事「Around the World with ASP.NET AJAX Applications」に書いてあったことを紹介します。

2 つの方法が紹介されています。簡単に書くと、

(1) アセンブリベース

アセンブリに .js ファイルを埋め込みリソースとして埋め込む。.resx とリソースマネージャーを利用して、要求を処理するスレッドのカルチャを見てローカライズする。(web.config で Culture 属性と UICulture 属性を auto にするとブラウザの要求ヘッダを見てスレッドのカルチャを設定するようになります)

(2) ファイルベース

カルチャごとに独立したスクリプトファイル(.js, .jp.js, .fr.js 等)を用意し、要求を処理するスレッドのカルチャを見て選択する。

・・・ということです。いずれも、記事では Web Forms 用の ScriptManager を利用するのが前提となっていますので。そのままでは MVC アプリには適用できませんが、考え方は参考になるかもしれません。

上記 MSDN マガジンの記事は .chm ファイル形式で保存されており、MSDN Magazine Issues and Downloads からダウンロードして読むことができますので、興味があればどうぞ。記事は 2008 年 1 月のものです。

MSDN Magazine Issues and Downloads
https://msdn.microsoft.com/magazine/mt668395

イメージ説明

投稿2018/11/22 07:31

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

t.kusu

2018/11/25 09:34

まとめまでいただき、(英文を簡単に読めない身として)本当に助かります。 (2)のファイルベースが自分の考えていた方法に近いと思います。やはりこういうことを考える方もいらっしゃるのですね。 ご紹介いただいた記事も時間はかかると思いますが何とか読んでみます。ありがとうございました。
t.kusu

2018/11/25 11:10

あ、ほんとだ。 重ねてありがとうございます。 ※記事は読めますが目次は化けているようです
guest

0

クライアント側で書き換えたいという要望だったので、DOMの操作を紹介しましたが、サーバサイドで編集してよいのなら、差し替えたい言語ごとの文字列群を配列として用意しておいて、言語が決定した段階で表示する配列なり変数なりに当てはめてから出力すればよいのです。もっとシンプルに表示するWebページを別々に作っておいて選んで出力することができます。
また、表示のなめらかな変更はAjaxの技術を使うことが多いでしょう。サーバサイドでC#とASP.NETのコードで操作するとしたら、
C#, ASP.NET MVC5で、部分ビューを非同期で更新、バックグラウンドの処理も非同期で実行するの記事のように、表示後のWebページ上の狙った部分をスマートに入れ替えることができます。原理を理解して、多言語ページ切り替えに応用してみて下さい。

投稿2018/11/21 16:05

編集2018/11/21 16:06
seastar3

総合スコア2285

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

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

t.kusu

2018/11/25 09:30

ありがとうございます。 今回はクライアントサイドで何とかできないかな~と思っていたのですが、 今後参考にさせていただきます。
guest

0

ここまでの調査結果。(2018/11/21)

「試したこと」の 2) を簡単に実装してみました。
WSH で Resource -> js の変換を行うスクリプトを組んで、ビルド時に実行するように仕込みました。
一応成功しているようです。コメント空行を含んで 200行程度でした。

まだよりよい方法を模索していますので、お心当たりがございましたら教えてください。

.
その後の調査結果。 (2018/11/25)

上のスクリプトを改造して、指定階層以下のフォルダ名をメッセージの変数のパスに含む形に修正してみました。
連想配列を利用しています。こんな形です。

--- locale.js ---
var locale = { message: 'メッセージ', folder01: { message: 'メッセージ' }, ... };

これでも途中のパスを含む形、つまり locale.folder01.message などの形でメッセージを参照できるのでアリかもしれません。スクリプトのコード量はあまり変わりませんでした。

投稿2018/11/21 13:53

編集2018/11/25 09:47
t.kusu

総合スコア21

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

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

0

JavaScriptで決定した言語の識別語句を変数に入れて、switch文でその言語ごとにDOM操作をして表示を切り替えることで実現できるでしょう。

Javascriptでhtmlを動的に書き換える方法!

のようにGetElementByIdメソッドを有効に活用しましょう。

投稿2018/11/18 13:36

seastar3

総合スコア2285

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

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

t.kusu

2018/11/21 13:49

なるほど。こういう方法もあるのですね。 もしお心当たりがあるようでしたら、DOM に C# の情報(Resourceのメッセージ)を引き渡す方法のヒントでもいただけたら幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問