多国語対応してみた
2015年3月18日
多国語といっても英語と日本語だけだが。
GitHubで公開したので、英語にしといたほうがいいかなと思い。
またしてもグーグル先生頼りなんだけど。。
出先でここ見るときのためにメモ。(今外でてないが・・・)
リソースファイル(*.resx)を追加する。
もともとある「Resources.resx」は英語用として使うとして、日本語用に「Resources.ja-JP.resx」を追加して、
英語の方は、アクセス識別子を「Public」に、日本語方は「コード生成なし」にする。
App.xamlでリソースを指定。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<Application x:Class="PCTime.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:properties="clr-namespace:PCTime.Properties" StartupUri="/View/EventLogViewWindow.xaml"> <Application.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="View/Style/StyleColors.xaml"/> <ResourceDictionary Source="View/Style/StyleButton.xaml" /> <ResourceDictionary Source="View/Style/StyleWindow.xaml" /> <ResourceDictionary Source="View/Style/StyleToggleButton.xaml" /> <ResourceDictionary Source="View/Style/StyleCalendar.xaml" /> <ResourceDictionary Source="View/Style/StyleDatePicker.xaml" /> <ResourceDictionary Source="View/Style/StyleProgressBar.xaml" /> <ResourceDictionary Source="View/Style/StyleToolTip.xaml" /> </ResourceDictionary.MergedDictionaries> <properties:Resources x:Key="resources" /> </ResourceDictionary> </Application.Resources> </Application> |
xamlでContentとかにリソースを指定する。
1 |
<Button Name="btnView" Content="{Binding ViewButtonTitle, Mode=OneWay, Source={StaticResource resources}}" |
xamlのプロパティからも「データバインドの作成」でGUIで指定できる。
コードからリソースを参照する場合は、
1 2 3 4 5 6 |
bool bRes = ProgressBar( () => { results = EventLogDataModel.GetEventLog(startDate, endDate); } , Properties.Resources.ProgresEventlogLabel); |
「 Properties.Resources.リソース名」でアクセスできる。
このまま日本語OSだと確認できないので、デバッグ時はコードでリソースを指定する。
1 2 3 4 5 6 7 8 |
public EventLogViewWindow() { // Debug for "en-US" Properties.Resources.Culture = System.Globalization.CultureInfo.GetCultureInfo("en-US"); System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US"); InitializeComponent(); } |
できた、(∩´∀`)∩ワーイ
日付形式は、xamlで自動にできなかったので、コンバーターでやった。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
/// <summary> /// カルチャの日付を返す /// </summary> class DateTimeConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { if(value == null) return Brushes.LightGray; DateTime dt1; if(value.GetType().Equals(typeof(DateTime))) { dt1 = (DateTime)value; } else if(value.GetType().Equals(typeof(string))) { dt1 = DateTime.Parse((string)value); } else { return string.Empty; } return dt1.ToShortDateString(); } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { throw new NotSupportedException(); } } |