繁体   English   中英

最佳实践:在 C#.net 中存储异常/错误或信息性消息以实现国际化的最佳方式是什么?

[英]Best practice: What is the best way to store exception/error or informational messages in C#.net for internationalization?

当抛出自定义异常或向最终用户发送消息时,可以使用硬编码字符串(包括字符串常量)、使用纯资源程序集或从数据库中的表中获取字符串。

我希望我的应用程序能够轻松切换到不同的语言,而无需重新编译。 虽然将字符串资源存储在程序集或数据库中可以实现此目的,但它增加了程序逻辑的复杂性,进而增加了产品的成本。

我的问题是:什么是 go 的最佳方法,同时牢记目标而不忽略每个选项带来的成本? 如果您有比列出的更好的做法,我很乐意听到。

技术: 操作系统: Windows 系列 平台: .NET 框架 2 及更高版本 语言: C# 数据库: MS Z9778840A0105CB30C98228276 及更高版本

多谢你们!

卡伦

使用资源:

这如何增加程序逻辑的复杂性?

try
{
   //do something with System.Net.Mail with invalid email..
}
catch (FormatException fex)
{
    throw new Exception(Resources.ErrorMsg.Invalid_Email, fex);
}

编辑

在 VS2008 中,当你创建一个资源时,你可以定义它是内部的还是公共的。 因此,假设我们将其设置为 public,在一个名为 ClassLibrary1 的程序集中,我们可以访问如下属性:

ClassLibrary1.Properties.Resources.InvalidError

其中 InvalidError 是错误的名称。 同样,我认为这不会给逻辑增加任何复杂性。

.NET 已经使用命名约定支持多种文化的多种资源:

 <default resource file name>.<culture>.resx

本质上,正如 Josh 指出的那样,VS2008 创建了一个很好的类型安全包装器来访问这些资源。

然而,VS UI 暴露了你能做的最少的事情。

如果您创建一个与默认名称完全相同的新资源文件,则在 resx 之前添加文化信息。 (注意:您需要在其他地方创建它,然后将其复制到魔法属性文件夹中。)

然后,如果您已将区域性应用于访问资源的线程,您的应用程序将从特定资源中提取正确的字符串。

例如:

    // Using the default culture
    string s = Resources.Error1Msg;

    Thread.CurrentThread.CurrentUICulture = new CultureInfo("es-CO");

    // Using the specific culture specified as above:
    s = Resources.Error1Msg;

如果需要参数化消息,请使用 string.Format 参数化 output。

需要注意的一点是,尝试以这样一种方式构建应用程序层,使您的异常携带丰富的有效负载(用于描述错误),而不仅仅是依赖于文本。

这样,您的表示层可以呈现可能利用有效负载的最佳 UI 体验。

高温高压

菲利普

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM