我们应该在资源中存储格式字符串吗

jpo*_*poh 25 c# resources localization string-formatting

对于我目前正在进行的项目,我必须将特殊格式的字符串提供给第三方服务进行处理.所以我正在建立这样的字符串:

string someString = string.Format("{0}{1}{2}: Some message. Some percentage: {3}%", token1, token2, token3, number); 
Run Code Online (Sandbox Code Playgroud)

而不是硬编码字符串,我正在考虑将其移动到项目资源中:

string someString = string.Format(Properties.Resources.SomeString, token1, token2, token3, number); 
Run Code Online (Sandbox Code Playgroud)

在我看来,第二种选择并不像第一种选择那样可读,即阅读代码的人必须提取字符串资源以确定最终结果应该是什么样子.

我该如何解决这个问题?在这种情况下,硬编码格式字符串是否是必要的恶魔?

Mic*_*tta 19

我确实认为这是一个必要的邪恶,我经常使用它.我做的有点臭,是:

// "{0}{1}{2}: Some message. Some percentage: {3}%"
string someString = string.Format(Properties.Resources.SomeString
                                  ,token1, token2, token3, number);
Run Code Online (Sandbox Code Playgroud)

..至少在代码足够稳定之前,我可能会因为别人看到的而感到尴尬.

  • 您还应该向资源文件添加注释以说明参数是什么.如果文件转到翻译,这对本地化程序非常有用. (5认同)

Nic*_*dad 17

您可能希望这样做有几个原因,但唯一的原因是您要将应用程序本地化为另一种语言.

如果您使用的是资源字符串,请记住以下几点.

  1. 在您想要本地化的资源字符串集中尽可能包含格式字符串.这将允许翻译者对格式化项目的位置重新排序,以使它们更好地适应翻译文本的上下文.

  2. 避免使用您的语言格式的字符串.最好将这些用于数字.例如,消息:

    "您指定的值必须介于{0}和{1}之间"

    如果{0}和{1}是5和10之类的数字,那就太棒了.如果要格式化像"five"和"ten"这样的字符串,这将使本地化变得困难.

  3. 您可以通过简单地命名资源来解决您所谈论的可读性问题.

    string someString = string.Format(Properties.Resources.IntegerRangeError,minValue,maxValue);

  4. 评估您是否在代码中的正确抽象级别生成用户可见字符串.通常,我倾向于将最靠近用户界面的代码中的所有用户可见字符串分组.如果某些低级文件I/O代码需要提供错误,则应该使用您在应用程序中处理的异常和一致的错误消息来执行此操作.这也将整合所有需要本地化的字符串,而不是在整个代码中使用它们.