为了允许从源代码中提取所有可翻译的消息,我们希望使用特定的语义' Message
课程。只有消息可以呈现给UI。这样我们就可以防止在UI中出现太多未翻译的字符串。
但gettext提取引擎无法提取像Message.Create("a" + x)
这样的出现。
那么在C#中是否有一种方法可以确保我的函数(GetText._
之类)只用字符串文字调用?
或者我应该以某种方式恢复预处理?是否有任何库/工具可以做到这一点?
答案 0 :(得分:2)
语言中没有任何内容可以支持必须是字符串文字的参数,不。我认为这将是一种奇怪的语言"功能",个人。
我建议的是创建一个MessageTemplate
类或类似的东西,并将您的方法更改为接受MessageTemplate
参数。
MessageTemplate
类可以有一组特定的实例,其中包含您需要的所有字符串。例如:
public sealed class MessageTemplate
{
public static MessageTemplate InvalidFilter { get; } =
new MessageTemplate("invalid_filter");
public static MessageTemplate Success { get; } =
new MessageTemplate("success");
public string Name { get; }
private MessageTemplate(string name) => Name = name;
}
然后方法调用将是这样的:
Message.Create(MessageTemplate.Success);
优点:
MessageTemplate
个引用,因为他们知道是消息模板,而不仅仅是任意字符串如果确实只想接受字符串文字,那么最好的办法就是为此目的创建一个属性,然后编写一个Roslyn分析器。这将检查每个方法调用,并验证如果参数具有该属性,则参数是字符串文字。
就我个人而言,我认为在整个代码库中散布这些神奇,脆弱的字符串常量会产生不良影响,但它是您最接近完全行为的最佳行为。已请求。当然,只有在使用Roslyn构建时才会产生效果。