【问题标题】:Should we store format strings in resources?我们应该在资源中存储格式字符串吗?
【发布时间】:2009-06-08 02:39:58
【问题描述】:

对于我目前正在进行的项目,我必须将特殊格式的字符串交付给第 3 方服务进行处理。所以我正在构建这样的字符串:

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

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

string someString = string.Format(Properties.Resources.SomeString, token1, token2, token3, number); 

在我看来,第二个选项不像第一个那样可读,即阅读代码的人必须提取字符串资源来计算最终结果应该是什么样子。

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

【问题讨论】:

    标签: c# localization resources string-formatting


    【解决方案1】:

    我确实认为这是一种必要的邪恶,我经常使用它。我做的很臭的事情是:

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

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

    【讨论】:

    • 您还应该在资源文件中添加 cmets 以说明参数是什么。如果文件需要翻译,这对本地化人员非常有用。
    • @CodingMonkey:同意。让本地化工程师的生活尽可能轻松。您不希望翻译猜测。
    • @MichaelPetrotta> 您将如何稳定代码以便不再需要这些 {0} 字符串?我个人考虑不使用string.Format,而是使用:"begin {middle} end".Replace("{middle}", middle)。当然,这种方法有其自身的问题......
    • 请注意,您应该仔细检查已翻译的资源,因为string.Format 会抛出太少的参数:string.Format("This is a message with {0} {1} parameters", "several", "cool"); 如果开发人员删除了第二个参数但不检查已翻译的资源,您会得到一个您的翻译出现运行时错误。
    【解决方案2】:

    您想要这样做的原因有很多,但唯一重要的原因是您要将应用程序本地化为另一种语言。

    如果您使用资源字符串,请记住几件事。

    1. 尽可能在要本地化的资源字符串集中包含格式字符串。这将允许翻译人员重新排列格式化项目的位置,以使其更好地适应翻译文本的上下文。

    2. 避免在您的语言格式标记中使用字符串。最好使用 这些是数字。例如,消息:

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

      如果 {0} 和 {1} 是 5 和 10 之类的数字,那就太好了。如果您要格式化为“五”和“十”之类的字符串,这将使本地化变得困难。

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

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

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

    【讨论】:

      【解决方案3】:

      您可以使用 CodeRush Xpress 来帮助添加硬编码字符串,甚至加快向资源文件中添加字符串的速度:http://www.devexpress.com/Products/Visual_Studio_Add-in/CodeRushX/

      编写字符串后,您可以通过一个步骤访问 CodeRush 菜单并提取到资源文件。很不错。

      Resharper 有similar functionality

      【讨论】:

      • 这不是一个长期的解决方案。当您转换后访问您的代码时,您的代码仍将填充Properties.Resources.SomeStringnnn,例如在维护期间
      • 这条评论已经很老了。但是Properties.Resources.SomeString 是您当时在 C# 项目中访问字符串的方式,并且在外部进程中本地化 resources.dll 是正确的。您并不总是希望直接本地化二进制文件,因此在资源文件中包含文本是关键。
      【解决方案4】:

      我不明白为什么在程序中包含格式字符串是一件坏事。与传统的无证幻数不同,乍一看它的作用非常明显。当然,如果您在多个地方使用格式字符串,则绝对应该将其存储在适当的只读变量中以避免冗余。

      我同意将其保留在资源中是不必要的间接性。如果您的程序需要本地化,并且您正在通过资源文件进行本地化,则可能的例外情况。

      【讨论】:

      • 是的,这很痛苦,但某种形式的重定向对于本地化几乎是必不可少的。我曾在软件本地化方面工作过,相信我,您不想向我们发送代码。或者尝试将更改合并回代码中。
      • 是的,但是 gettext 风格的本地化允许将原始字符串保留在代码中,同时仍然只向翻译人员发送一个 pot(模板)文件。所以资源文件不是唯一的选择。
      【解决方案5】:

      是的,你可以

      新的让我们看看如何

      String.Format(Resource_en.PhoneNumberForEmployeeAlreadyExist,letterForm.EmployeeName[i])
      

      这每次都会给我动态消息

      顺便说一句,我使用的是ResXManager

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-04
        • 1970-01-01
        相关资源
        最近更新 更多