I write code for multilanguage using IValueConverter. Text will be change dynamically and so many texts has. So I cannot be make using Resource file. I decided to make using IValueConverter. And First time it displayed well. But change language runtime, it will not work I expected. IValueConverter will return a value by current language type. And language type is change in runtime by user.
This is my simplified code:
internal class MessageConverter : IValueConverter, INotifyPropertyChanged
{
public event PropertyChangedEventHandler? PropertyChanged;
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
string? valueOrigin = parameter == null ? ":" : parameter.ToString();
string[] values = valueOrigin == null ? new string[2] : valueOrigin.Split(':');
if (values.Length == 0)
{
values = new string[] { string.Empty, string.Empty };
}
else if (values.Length == 1 && false == values[0].StartsWith("@"))
{
values = new string[] { string.Empty, values[0] };
}
if ((bool)(DesignerProperties.IsInDesignModeProperty.GetMetadata(typeof(DependencyObject)).DefaultValue))
{
return values[1];
}
MessageHelper.GetInstance().LanguageChanged += MessageConverter_langchanged;
return MessageHelper.GetMessage(values[0]);
}
private void MessageConverter_langchanged(object? sender, EventArgs e)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("")); // ???
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
public class MessageHelper
{
private static object lockObject = new object();
private static MessageHelper? instance = null;
private Dictionary<string, string> ko = new Dictionary<string, string>();
private Dictionary<string, string> en = new Dictionary<string, string>();
private Dictionary<string, string> jp = new Dictionary<string, string>();
private MessageHelper()
{
// smaple
ko.Add("@MSG_0001", "시작");
en.Add("@MSG_0001", "Start");
}
public static MessageHelper GetInstance()
{
lock (lockObject)
{
if (instance == null)
instance = new MessageHelper();
return instance;
}
}
private string language = "KO";
public static string GetLanguage(string language)
{
return language;
}
public static void SetLanguage(string language)
{
MessageHelper.GetInstance().language = language;
GetInstance().LanguageChanged?.Invoke(GetInstance(), EventArgs.Empty);
}
public event EventHandler? LanguageChanged;
public static string GetMessage(string messageCode)
{
var dic = MessageHelper.GetInstance().language == "en" ? MessageHelper.GetInstance().en : MessageHelper.GetInstance().ko;
if (dic.ContainsKey(messageCode))
return dic[messageCode];
return messageCode;
}
}
<Button Style="{StaticResource BoldButtonFontStyle}"
Content="{Binding Converter={StaticResource MessageConverter}, ConverterParameter=@MSG_0001:시작하기, UpdateSourceTrigger=PropertyChanged}"
Command="{Binding CommonCommand}"
CommandParameter="SaleStart" />
<Button Style="{StaticResource BoldButtonFontStyle}"
Content="한국어"
Command="{Binding CommonCommand}"
CommandParameter="Language_Korean" />
<Button Style="{StaticResource BoldButtonFontStyle}"
Content="English"
Command="{Binding CommonCommand}"
CommandParameter="Language_English" />
private void CommonCommandProc(string param)
{
if (param == "Language_Korean")
{
MessageHelper.SetLanguage("ko");
}
else if (param == "Language_English")
{
MessageHelper.SetLanguage("en");
}
}
I code using inherit 'MarkupExtension'. It works fine. Thank you every one.