总而言之,为了提供一种即时机制来调试不同语言的应用程序,我使用所需的资源字符串(外语)在用户需要时在运行时显示等效的英语。这是使用
public static string GetMessage(string messageKey)
{
CultureInfo culture = Thread.CurrentThread.CurrentCulture;
if (!culture.DisplayName.Contains("English"))
{
string fileName = "MessageStrings.resx";
string appDir = Path.GetDirectoryName(Application.ExecutablePath);
fileName = Path.Combine(appDir, fileName);
if (File.Exists(fileName))
{
// Get the English error message.
using (ResXResourceReader resxReader = new ResXResourceReader(fileName))
{
foreach (DictionaryEntry e in resxReader)
if (e.Key.ToString().CompareNoCase(messageKey) == 0)
return e.Value.ToString();
}
}
}
return null;
}
其中GetName
定义为
public static string GetName<T>(Expression<Func<T>> expression)
{
return ((MemberExpression)expression.Body).Member.Name;
}
我通常在我的应用程序中显示本地化消息,例如
Utils.ErrMsg(MessageStrings.SomeMessage);
或者
Utils.ErrMsg(String.Format(MessageStrings.SomeMessage, param1, param2));
现在我可以使用在不同文化中运行的应用程序显示相关的英文消息
Utils.ErrMsg(Utils.GetMessage(
Utils.GetName(() => MessageStrings.ErrCellAllocStatZeroTotal)) ??
MessageStrings.ErrCellAllocStatZeroTotal);
我想避免在调用GetName
和使用中使用 lambda 表达式null
fromGetMessage
和 using ??
,我怎样才能实现这一点[如果可能的话]?
谢谢你的时间。