我正在研究一起构成产品的所有5个项目中的文本本地化。
Localization:
因此,如果用户来自美国,则他们将在en-US
中看到产品,如果来自中国,则他们将在ch-CH
中看到文本。
我被困在下面的东西中。
每个项目都有其 OWN 存储区的Resx文件(我将其保存用于翻译的文件)。
Project A - en-US.resx file
cn-CH.resx file
Project B - en-US.resx file
ch-CH.resx file
Project C - en-US.resx file
ch-CH.resx file
.
.
.
现在我有一个项目Common
,该项目被所有项目引用。
所以我在singleton
Common
类
public sealed class Translation
{
private static readonly Translation translation = new Translation();
public static Translation GetTranslation { get { return translation; } }
private Translation() { }
static Translation() { }
public string GetTranslatedMessage(string key, CultureInfo culture, string message, string namespace)
{
var rm = new ResourceManager("namespace", Assembly.GetExecutingAssembly());
message = rm.GetString(key, culture);
return message;
}
}
到目前为止,很好,您可以看到我正在将{strong> namespace 用作4th parameter
和resource manager
,以便我可以在正确的项目存储区中查找翻译,只需执行以下操作即可:
Translation.Translate(key, culture, message, namespace) // singleton class taking in the namespace to find the right bucket
它工作正常。
问题/问题:但是对于每个项目,我都需要传递名称空间,这意味着我要调用的地方都需要传递名称空间。我想知道有什么办法,我可以隐式告诉每个项目需要研究哪个存储桶。我可以使用Abstract或2个singleton类,也许是factory吗?或类似的东西。我是新手,因此对如何解决此问题不熟悉。我只是不想在每个调用中传递名称空间。
WorkAround:我可以在每个项目中重复相同的单例代码并使工作正常,但是然后我将在每个项目中重复相同的单例代码/
答案 0 :(得分:0)
如果您愿意接受hack-y解决方案,并且各种命名空间文件都位于以命名空间命名的文件夹中,则可以使用CallerFilePathAttribute
并将命名空间从路径中分离出来。它似乎很脆弱:
查找C# Caller Information。他们显示的示例是:
public void DoProcessing()
{
TraceMessage("Something happened.");
}
public void TraceMessage(string message,
[System.Runtime.CompilerServices.CallerMemberName] string memberName = "",
[System.Runtime.CompilerServices.CallerFilePath] string sourceFilePath = "",
[System.Runtime.CompilerServices.CallerLineNumber] int sourceLineNumber = 0)
{
System.Diagnostics.Trace.WriteLine("message: " + message);
System.Diagnostics.Trace.WriteLine("member name: " + memberName);
System.Diagnostics.Trace.WriteLine("source file path: " + sourceFilePath);
System.Diagnostics.Trace.WriteLine("source line number: " + sourceLineNumber);
}
// Sample Output:
// message: Something happened.
// member name: DoProcessing
// source file path: c:\Users\username\Documents\Visual Studio 2012\Projects\CallerInfoCS\CallerInfoCS\Form1.cs
// source line number: 31
然后将其标记为source file path
的内容进行路径游戏以获取名称空间。使用这些属性的参数始终是可选的(通常将其默认值设置为default(T))。编译器将注入该值,而调用方则不应。