C# - 在资源中本地化消息框和换行

8
我希望展示来自资源文件的带有换行符的字符串在MessageBox(WinForms)中。 没有使用资源文件的示例(可行):
string someMsg = "Message. Details:\n" + someDetails;

MessageBox.Show(someMsg);

结果:

信息。细节:

这里有一些细节

当我将字符串"信息。细节:\n"移动到资源文件中时:

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

结果:

消息。细节:\n这里有一些细节。

当我将带有“\n”的字符串移动到资源中时,MessageBox.Show()停止将其解释为换行符。

编辑:我在考虑:someMsg.Replace(@'\n',Environment.NewLine); 但对于如此简单的事情来说仍然很烦人。


相关但不重复:https://dev59.com/bUXRa4cB1Zd3GeqPwPpI - Tao
我不想通过Replace方法或编辑在代码中处理这个问题。我希望将此资源文件添加到“普通”用户中,以便他们可以轻松地进行翻译。 - binball
没错,但是普通用户肯定会觉得在适当的位置加入实际的换行符比保留“\n”占位符更自然,对吧?(参见Chilaka Umesh对他回答的评论)。也许问题是:您是如何将这些字符串“移动”到资源文件中的?在这个移动过程中,“\n”应该被替换为实际的换行符。 - Tao
4个回答

11

如果将此内容添加到资源中,它不会将 \n 视为转义字符。你可以在记事本中打开资源文件查看并在 XML 文件(resx)中进行更改。

或者

在记事本中输入数据并换行。复制该数据并粘贴到资源编辑器中。

编辑:

或者

将数据输入/粘贴到资源编辑器 UI 中,选择 \n 并使用实际的换行符(Shift-Enter)进行替换。


我明白了,但我希望它能够自动化并尽可能简单。 - binball
6
在资源编辑器中,输入“消息.详细信息:”,然后按下“Shift+Enter”键,而不是只按Enter键。这可能会对您有所帮助。 - Umesh CHILAKA

1
你可以这样做(只要你不是 .net 2.0):
public static class StringExt
{
  public static String FixNewLines(this String str)
  {
    return str.Replace(@'\n',Environment.NewLine);
  }
}

然后:

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

然而,这将影响您应用程序中的所有字符串(名称空间作用域)

这是一种不太优雅的解决方法,但是它很快。

个人建议逐步修复逻辑,而不是像上面那样做。


0
也许你可以将resx文件以代码形式打开,直接在XML中添加换行符。

或者

可能是由于转义字符导致读取时丢失了,也许尝试使用\\


谢谢,但我不想从代码->资源->资源代码编辑切换。 - binball

0
一个简单的解决方案是在资源字符串中存储“占位符”。例如,将此字符串存储在“MessageDetails”键下的*.resx中:“消息。详细信息:{0}{1}”。然后,在您的代码中像这样使用它:
MessageBox.Show(String.Format(GlobalStrings.MessageDetails, Environment.NewLine, @"The message"));
这里的优点是可移植性,正如您所看到的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接