「マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
目次 †
関連 †
本コンテンツに関連するコンテンツ
概要 †
国際化対応とは †
アプリケーションの国際化対応とは
を行い実行環境、ユーザによってアプリケーションの動作を切り替えることである。
以下サイトでは
と表現されている。
国際化対応の要件 †
要件の例を以下に示す。
- パッケージ・ソフトを多言語対応しておき、
適用先次第でアプリケーション全体の言語を切り替える。
対象 †
- 言語
- クライアント側
- ユーザがUI表示やログ出力されるメッセージなどの言語を選択できる。
- 動作環境(OSの言語、ブラウザ設定など)次第で表示言語が自動的に切り替わる。
- サーバ側
- 管理者がUI表示やログ出力されるメッセージなどの言語を選択できる。
- 動作環境(OSの言語、ブラウザ設定など)次第で表示言語が自動的に切り替わる。
- UI要素
- 文字幅等が変わるので、コントロールのサイズ・配置が変更される。
- アラビア語環境では文字方向を右から左になるため変更量が大きい。
切り替え方式 †
- クライアント側
- クライアント側ユーザの設定で切り替わる。
- 動作環境(OSの言語、ブラウザ設定など)次第で表示言語が自動的に切り替わる。
- サーバ側
- サーバ側のユーザの設定で切り替わる(サーバ側のログ出力等)。
- クライアント側のユーザの設定で切り替わる(クライアント側に出力される文字列等)。
- 動作環境(OSの言語、ブラウザ設定など)次第で表示言語が自動的に切り替わる。
国際化対象 †
本項では国際化対象となる項目を示す。
それぞれのアプリケーションの要件に
合わせて対応する項目を取捨選択する。
項目の選択は以下を参考とした。
文言 †
文言を外部リソースファイル等に定義し文言の
メンテナンス、言語の増減を行いやすくする。
以下に文言の国際化対象項目を整理した。
UI要素 †
UI要素には以下の様な項目がある(クライアント側)。
- 画面タイトル
- ラベル、ボタン、ラジオ・ボタン、チェック・ボックスなどのテキスト
- テキスト・ボックス中の説明文、紹介文などの文章
- ドロップダウン、リスト・ボックスの選択候補
- グリッド(表)のヘッダ、値
※ 初期値として静的に用意する文言、動的に置き換える文言がある。
メッセージ †
メッセージには以下の様な項目がある。
- 画面表示
- 確認メッセージ
- エラー・メッセージ
- ツール・チップ
- ログ出力等
- 情報メッセージ
- ワーニング・メッセージ
- エラー・メッセージ
クライアント、サーバでの切り替え方式については別途検討する必要がある。
- 可変文字列の組込
また、可変文字列の組み込みには、順番の逆転を考慮して、
予めString.Formatを使用しておくと良い()。
string msg = "アセンブリ名:[{0}]に、クラス名:[{1}]が存在しません。";
↓
string msg = "Class name: [{1}] does not exist in assembly name: [{0}].";
throw new ArgumentException(
String.Format(msg, assemblyName, className));
書式 †
言語、地域により数値、日時の表現を切り替える。
数値書式 †
国により数値の小数点の文字、桁区切りの文字・区切る桁数が異なる。
表示する際に数値データの書式(フォーマット指定)を切り替える。
- 日本の場合
- 小数点文字:ピリオド
- 区切り文字:カンマ
- 区切り桁:3桁または4桁
- イギリス、アメリカの場合
- 小数点文字:ピリオドまたはミドルドット
- 区切り文字:カンマ
- 区切り桁:3桁
- フランス、南アフリカの場合
- 小数点文字:カンマ
- 区切り文字:半角スペース
- 区切り桁:3桁
- ドイツの場合
- 小数点文字:カンマ
- 区切り文字:ピリオド
- 区切り桁:3桁
なお、小数点以下の桁区切りの有・無は、国毎ではなく業務毎の仕様である模様。
日時 †
(1)UTCと時差
最近の言語ではDatetime型を使用し、内部的にはUTC(協定世界時)でデータを保持、
タイムゾーン(日付と時刻)に合わせて、時差、サマータイムを算出して表示を行う。
- サマータイム開始・終了日の動作には注意が必要
サマータイムによって重複する時間、無くなる時間
- 条件(タイムゾーンの設定):
- [タイムゾーン]コンボ・ボックス → (GMT-06:00)中部標準時(米国およびカナダ)
- [自動的に夏時間の調整をする]チェック・ボックス → チェック
- DateTime?.Nowの時間、システム時計の動作
- サマータイムの開始日
2013/3/10 01:59:59
IsDaylightSavingTime?=False
- 1秒進むと
2013/3/10 03:00:00
IsDaylightSavingTime?=True
※ 1時間進む。
- サマータイムの終了日
2013/11/3 01:59:59
IsDaylightSavingTime?=True
- 1秒進むと
2013/11/3 01:00:00
IsDaylightSavingTime?=False)
※ 1時間戻って2回目の1時が始まる。
- DateTime?.UtcNow?の時間
- サマータイムの開始日
2013/3/10 07:59:59
IsDaylightSavingTime?=False
- 1秒進むと
2013/3/10 08:00:00
IsDaylightSavingTime?=True
※ サマータイムは影響しない
- サマータイムの終了日
2013/11/3 06:59:59
IsDaylightSavingTime?=True
- 1秒進むと
2013/11/3 07:00:00
IsDaylightSavingTime?=False
※ サマータイムは影響しない
(2)西暦の表記の仕方
世界標準規格として、ISO 8601の"YYYY-MM-DD"方式が確立している。
- 日本では通常、年月日の順番に算用数字で表記するが、
- 順番の異なる国があるため表記を切り替える必要がある。
- 月日年(米国)
- 日月年(ロシア、オーストラリアなど多数)
の様に数字以外での表記方法もある。
(日が01-12の範囲内の場合、月・日の区別が付き難いため)
- Datetime.ToString?()の既定の書式は「カルチャ」(CultureInfo?)の影響を受ける。
DateTime dateTime = new DateTime(2000, 1, 23, 4, 5, 6);
// デフォルトのカルチャ(ja-JP)で日時を文字列化
Console.WriteLine("{0}: {1}", CultureInfo.CurrentCulture, dateTime.ToString());
// en-US(英語/アメリカ合衆国)のカルチャで日時を文字列化
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
Console.WriteLine("{0}: {1}", CultureInfo.CurrentCulture, dateTime.ToString());
// de-DE(ドイツ語/ドイツ)のカルチャで日時を文字列化
Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");
Console.WriteLine("{0}: {1}", CultureInfo.CurrentCulture, dateTime.ToString());
↓ 出力
ja-JP: 2000/01/23 4:05:06
en-US: 1/23/2000 4:05:06 AM
de-DE: 23.01.2000 04:05:06
(3)各国独自の暦
- 仏暦
- 中華民国暦
- 台湾暦
- 韓国暦
- ヘブライ暦
- 回教暦
- .etc
- 西暦から別の暦に変換するには各種暦(カレンダー)を使用する。
これについては、Calendar クラスの派生クラスで確認できる。
- System.Globalization.EastAsianLunisolarCalendar?
時間が月、日、年、および時代 (年号) に分割され、
その日付が太陽と月の周期に基づいている暦を表します。
- System.Globalization.GregorianCalendar?
グレゴリオ暦を表します。
- System.Globalization.HebrewCalendar?
ヘブライ暦を表します。
- System.Globalization.HijriCalendar?
回教暦を表します。
- System.Globalization.JapaneseCalendar?
和暦を表します。
- System.Globalization.JulianCalendar?
ユリウス暦を表します。
- System.Globalization.KoreanCalendar?
韓国暦を表します。
- System.Globalization.PersianCalendar?
ペルシャ暦を表します。
- System.Globalization.TaiwanCalendar?
台湾暦を表します。
- System.Globalization.ThaiBuddhistCalendar?
タイ仏暦を表します。
- System.Globalization.UmAlQuraCalendar?
サウジ回教暦 (Umm-Al Qurah) を表します。
- 変換処理
- 西暦→和暦
CultureInfo culture = new CultureInfo("ja-JP", true);
culture.DateTimeFormat.Calendar = new JapaneseCalendar();
DateTime target = new DateTime(2003, 7, 1);
string result = target.ToString("ggyy年M月d日", culture);
Console.WriteLine(result);
// 出力:平成15年7月1日
- 和暦→西暦
CultureInfo culture = new CultureInfo("ja-JP", true);
culture.DateTimeFormat.Calendar = new JapaneseCalendar();
string target = "平成15年7月1日";
DateTime result = DateTime.ParseExact(target, "ggyy年M月d日", culture);
Console.WriteLine(result.ToLongDateString());
// 出力:2003年7月1日
単位 †
国、地域により単位の表現を切り替える。
(1)通貨
- 現地の通貨、またはいずれかの通貨に統一し表現する。
- 通貨の書式指定子(C または c)は「カルチャ」(CultureInfo?)の影響を受ける。
decimal moneyvalue = 1921.39m;
// デフォルトのカルチャ(ja-JP)で文字列化
Console.WriteLine(String.Format("Order Total: {0:C}", moneyvalue));
// en-US(英語/アメリカ合衆国)のカルチャで文字列化
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
Console.WriteLine(String.Format("Order Total: {0:C}", moneyvalue));
// de-DE(ドイツ語/ドイツ)のカルチャで文字列化
Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");
Console.WriteLine(String.Format("Order Total: {0:C}", moneyvalue));
↓ 出力
Order Total: \1,921
Order Total: $1,921.39
Order Total: 1.921,39 ?
- Windowsストアアプリでは、
GeographicRegion?.CurrenciesInUse?プロパティを使って、
ユーザの地理的な地域の通貨を取得することもできる。
(2)計測単位
- 現地の計測単位、またはいずれかの計測単位に統一し表現する。
- 最も使われているのはメートル法とヤード ポンド法。
- Windowsストアアプリでは、
Globalization 名前空間を使って正しいシステム計測を取得できる。
¥記号問題 †
(1)日本の円、中国の人民元はどちらも¥記号を使う
区別する場合は以下の様にする。
(2)¥はバックスラッシュやウォンに置き換わる
各国語用のフォントのうちU+005Cの文字は、それぞれカスタマイズされている。
そのため使用するフォント次第で別の記号に置き換わる。
UI要素 †
Windows Formsであれば、
「リソースファイル」を用いることで、
下記、UI要素の
を切り替えることができる。
サイズ †
表示する文言の長さにより、画面項目のサイズを調整する。
配置順 †
言語、地域により文字の方向性を切り替える。
#アラビア語では文字方向が右から左
- 左から右へ、右から左へ、左に向かって上から下
- コントロールの配置順、表の列順
ロケール(地域と言語)の変更方法 †
本項では、Windows ロケール(地域と言語)の変更方法について説明する。
Windows ロケール(地域と言語)に対応するカルチャの変更方法については、
「カルチャ」を参照。
地域と言語との関係 †
「コントロールパネル」の[時計、言語、および地域]
→[地域と言語]「地域と言語」画面から変更する。
[形式]タブ †
ユーザ・ロケール
- 設定
- [形式]コンボ・ボックス
- 日付と時刻の表示形式を設定可能。
- [追加の設定]で、数値と通貨の表示形式を設定可能。
- 説明
- ユーザ・ロケール、日付と時刻、数値や通貨の表示形式を設定する。
- Win32:
- GetDateFormat?
- GetCalendarInfo?
- GetTimeFormat?
- GetCurrencyFormat?
- GetNumberFormat?
- GetLocaleInfo?
- GetUserDefaultLangID
- GetUserDefaultLCID
- GetUserDefaultUILanguage
- .NET:CultureInfo?
- CultureInfo?.Calendar
- CultureInfo?.DateTimeFormat?
- System.DateTime?(…, CultureInfo?(LCID).Calendar).ToString?
- CultureInfo?.NumberFormat?
[場所]タブ †
既定の場所
- 説明
- GPSセンサーなどを使用できない場合、
パソコンを使用する既定の場所を指定する。
- この情報をプログラムから使用できる。
- API
- Win32:GetUserGeoID
- .NET:RegionInfo?
- COM:IDefaultLocation? インターフェイス
[キーボードと言語]タブ †
ダイアログや、メッセージのUI表示言語
- 設定
- [表示言語]グループの[表示言語を選んで下さい]コンボ・ボックス
- 説明
- MUI(Multi User Inteface)版のOSが必要になる。
- 環境設定に対応した、ダイアログや、メッセージを表示する。
[キーボードと言語]タブ †
入力ロケール
- 設定
- [キーボードの変更]ボタン → [テキスト サービスと入力言語]画面
- 説明
- ユーザが入力する際に使用するロケール
- キーボードのレイアウトと、IMEの言語判断に使用
- API
- .NET:CultureInfo?.KeyboardLayoutId?
[管理]タブ †
システム・ロケール(LCID)
- 設定
- [システム ロケールの変更]ボタン → [現在のシステムロケール]コンボ・ボックス
- 説明
- OSのロケール
- メニューや画面の言語を変更する。
- Unicode対応されていない古いソフトで使用する。
- Win32:
- GetSystemDefaultLangID
- GetSystemDefaultLCID
- GetSystemDefaultUILanguage
- .NET:CultureInfo?.InstalledUICulture
参考 †
切り替え方式 †
大きく分けて、以下の切り替え方式がある。
- アプリケーションの設定で動作変更される方式
- カルチャを変更する方式
- カルチャ以外のパラメタを採用する方式
システムのアーキテクチャ毎の
カルチャを使い分けるポイントについて説明する。
スタンドアロン †
- システム設定をそのまま使用。
- アプリケーション設定(1つのOSで多言語対応する必要がある場合)
- カルチャを変更する方式
- カルチャ以外のパラメタを採用する方式
クライアント・サーバ †
- クライアント
- システム設定をそのまま使用。
- アプリケーション設定(1つのOSで多言語対応する必要がある場合)
- カルチャを変更する方式
- カルチャ以外のパラメタを採用する方式
- アプリケーション設定(configなど)
- カルチャを変更する方式
- カルチャ以外のパラメタを採用する方式
- クライアント側設定(HTTPヘッダ、独自cookie)
- カルチャを変更する方式
- カルチャ以外のパラメタを採用する方式
ベターユース †
クライアント・サーバでは、考慮点が多く国際化が難しい。
ベターユースは以下の様に考える。
- 各国から使用される国際化されたサーバ・アプリケーション
- ロケール
- クライアント・ロケールは可変
- サーバ・ロケールは固定
- ログ・メッセージ等のリソースファイル(CurrentUICulture)
- サーバ・ロケールに固定。
- 例外メッセージ等もCurrentUICultureを使用する。
- 書式などのフォーマット処理(CurrentCulture?)
以下の方式のうちから選択する。
- クライアント・ロケールで選択可能にする。
- アプリケーションで使用する単位は統一する(通貨、計測単位など)。
その他 †
I/O、エンコーディング †
I/Oが発生する場合は、エンコーディングを意識する必要がある。
- 日本語、英語以外の各国文字を扱う場合、
文字セットは各国文字が利用可能なUTF-8, UTF-16を使う。
- 但し、最新のJIS規格にはUnicode似しか含まれない漢字も多く、
日本語だけであってもUnicode移行が必要になってきている。
詳細はこちらを参照のこと。
出力ファイル †
出力ファイルには以下の様な項目がある。
- テキストファイル(CSV、XML等)
- ドキュメント(Word等)
- 帳票(PDF/Excel等)
通常、クライアント側ユーザの言語に合わせて文言を作成する。
ドキュメント †
ドキュメントには以下の様な項目がある。
各言語向けのものを静的に用意することで多言語対応を行う。
元号・時差の管理 †
元号・時差の管理について。
- 元号・時差の情報のストアはレジストリとなっており、
Windows Updateにより適用されるようになっている。
- このため、レジストリ修正でもカスタマイズ可能であるが、
管理上問題となるような場合は、独自部品を用意する必要がある。
ただし、自前で管理する必要があるため、管理は煩雑になる。
レジストリ †
- 元号
Windows Update/Microsoft Update、毎月第二週の月例パッチ等で配布される予定であるが、
.NET4以降では、レジストリに情報が格納されているためレジストリ修正で新規元号に対応できる。
Windows Update †
- 元号
Windows Update/Microsoft Update、毎月第二週の月例パッチ等で配布される予定であるが、
平成以降、Windows Update/Microsoft Updateで、元号が配信された実績はまだない。
- サマータイム
毎年、Windows Update/Microsoft Updateで配付されている。
- 参考
以下、.NETの和暦カレンダについて。
VBAマクロ、SQL Server、その他の製品については、情報なし。
元号改正 †
業務システムにおける国際化の要件 †
- 基本ソフト
- Officeソフト
- ビジネス・ソフト
- ユーティリティ・ツール
などの場合は .NET Framework の国際化対応機能で十分であるが、
業務アプリケーションの場合は不十分である場合が多い。
事前に以下の業務システムにおける国際化の要件を確認しておくと良い。
- 言語によって表示するラベル等のサイズの変更が必要か?不要か?
英語とマルチバイトは表示される文字列のサイズの差が大きい。
- 不要の(英語表示が間延びしたように表示させてもかまわない)場合は、
.NETの国際化対応機能で十分である。
- 必要の(英語表示が間延びしたように表示させない)場合は、
- サイズ・位置などの情報をリソースファイルで管理する。
(Windows Formのみ、この機能を実装している)
- 表示される文字列を変更する場合、
バイナリ変更+再配布が可能か?不可能か?
- 可能な場合、.NETのリソースファイルを使用できる。
リソースファイルは、バイナリ(dll)に変換されるため、
文字列を変更した時、スマートクライアント端末に再配布が必要になる。
- 不可能な場合、独自機能で対応する必要がある。
- 例えば、データベースに文字列情報を格納している場合、
バイナリが変更されないため、スマートクライアント端末に再配布が不要になる。
- 表示される文字列を誰が何時、どのような方法で変更するか?
- Visual Studio(リソースファイル)を
使用し変更しても良い場合、.NET の国際化対応機能で十分である。
- 管理画面にて変更する場合、独自機能で対応する必要がある。
- 例:管理画面でデータベースで管理されている文字列を変更する。
- 画面のタイトルやラベル、ボタンに表示される文字列を
同一ロケールの中で動的に変更することがあるか?
- 固定値の場合、.NET の国際化対応機能で十分である。
- 例えば、業務アプリケーションでは
画面のタイトルやラベルはプログラム上で変更することがある。
- 画面中に複数の言語(ex. 日本語と中国語)が混在することがあるか?
- 一つの言語しか表示されない場合、.NET の国際化対応機能で十分である。
- 複数の言語が同時に表示される場合、独自機能で対応する必要がある。
- 日時や日付が OS の言語に依存して良いか?
- 日時や日付の表記が変更されてもかまわない場合、.NET の国際化対応機能で十分である。
- 日時や日付の表記を一定に保つ場合、独自機能で対応する必要がある。
Tags: :その他、開発の色々, :.NET開発, :国際化対応