据我所知,使用.NET中的资源文件处理本地化字符串中的动态数据的最佳方法是将您的本地化字符串放在resources.resx文件中,并在其中包含占位符: Lorem {0 } ipsum。并在您的代码中,以这种方式处理它:string.Format(Resources.My_Localized_Key, myValue);
。
我的担忧如下:
1 /如何确保占位符将被实际值替换?例如,团队中的新开发人员可能需要在他正在编写的一些新代码中使用此本地化字符串,但不知道他必须用一些数据来提供它。也不是什么样的数据。
2 /如果稍后,由于某些原因,本地化字符串将更改为 Lorem {0} ipsum {1}。,我们如何确保在应用程序中对此字符串的所有使用都将更新?
有没有更好的方法来处理这个问题?例如,一种以强类型方式处理这些占位符的方法,而不必使用反射或必须解析本地化字符串的内容......?或者只是这样做的方式?
答案 0 :(得分:1)
在实践中,对于问题1,开发人员不会在不检查其内容的情况下重用字符串,如果他们这样做,他们可能会在他们运行代码时(或QA会)注意到占位符。所以它不太可能,也不会成为世界末日。
对于问题2,您可以在Visual Studio中使用“查找用法”来获取为资源创建的自动生成的属性,以查找它所使用的每个位置,并确保参数的正确数量(和顺序)随处可见它被使用了。但一般来说,资源字符串无论如何都不会被重用(实际上不建议在不同的上下文中重用可本地化的文本,因为例如由于语言规则或空间限制,翻译可能需要在不同的上下文中进行更改)。 / p>
我将看到的另一个风险是翻译人员可能会忽略或搞乱占位符,这将更难以发现。但这只是本地化错误的一个例子......本地化应用程序时还有很多其他问题可能会出错,而且通常没有办法防范它们。
答案 1 :(得分:0)
我认为您可以编写自己的Visual Studio自定义工具(http://www.codeproject.com/Articles/31257/Custom-Tools-Explained),它从resx文件生成Resources类并使用它而不是标准一。在您的工具中,您可以解析本地化字符串,如果它有占位符,那么您可以生成方法而不是属性Resources.My_Localized_Key
。根据占位符的数量,方法可以看起来像Resources.My_Localized_KeyFormat(object param)
,具有适当数量的参数。
但这只是一个想法,我自己没有实现它(但我确实为resx文件实现了代码生成的自定义工具,并且工作正常)。
或者你可以使用F#在编译时将params检查到它的string.Format版本。