关于winforms:C# – MessageBox – 资源和换行符中的消息本地化

C# - MessageBox - Message localization in resources and lines breaks

我想显示带有行分隔符的资源字符串的MessageBox(WinForms)。

无资源示例(作品):

1
2
3
4
string someMsg ="Message. Details:
"
+ someDetails;

MessageBox.Show(someMsg);

结果:

消息。细节:

这里有一些细节

当我移动字符串消息时。详细信息:

1
2
string someMsg = GlobalStrings.MsgBoxJustTest + someDetails;
MessageBox.Show(someMsg);

结果:

消息。详细信息:下面是一些详细信息

当我将带有""的字符串移动到资源时,messagebox.show()停止将其解释为换行符。

编辑:我在想:somemsg.replace(@'',environment.newline);但这么简单的事情还是很烦人。


如果将其添加到资源中,它不会将作为转义字符只需在记事本中打开您的资源文件就可以看到这一点,并在XML文件(resx)中查看。

用新行在记事本中键入数据。复制并粘贴到资源编辑器中

编辑:

在资源编辑器UI中键入/粘贴数据,选择并用实际的换行符替换数据,换行符为Shift-Enter


您可以这样做(只要您的不是.NET 2.0):

1
2
3
4
5
6
7
8
public static class StringExt
{
  public static String FixNewLines(this String str)
  {
    return str.Replace(@'
'
,Environment.NewLine);
  }
}

然后:

1
2
string someMsg = GlobalStrings.MsgBoxJustTest + someDetails;
MessageBox.Show(someMsg.FixNewLines());

但是,这将影响应用程序中的所有字符串(命名空间范围)

这是一个肮脏的修复,但它是一个快速修复。

就我个人而言,我只是一路修好我的逻辑,而不是像上面那样做。


一个简单的解决方案是将"占位符"存储在资源字符串中。对于instane,此字符串存储在*.resx中的"messagedetails"键下:"message"。详情:0 1"。然后,在您的代码中,这样使用它:

messagebox.show(string.format(globalStrings.messagedetails,environment.newline,@"the message"));

正如你所看到的,这里的优势是可移植性。


也许您可以打开resx文件作为代码,并直接将换行符添加到XML

可能是因为转义字符的缘故,他们在阅读时迷路了,可以尝试使用\\