我有一个Singleton
班级
public sealed class GlobalTranslator
{
public Translator Translator = new Translator();
static readonly GlobalTranslator INSTANCE = new GlobalTranslator();
private GlobalTranslator()
{
}
public static GlobalTranslator Instance
{
get
{
return INSTANCE;
}
}
}
这将允许我为我的Translator
班级
public class Translator : MarkupExtension
{
readonly CultureInfo Ci;
const string ResourceId = "LDVELH_WPF.Resources.Strings";
public Translator()
{
Ci = Thread.CurrentThread.CurrentCulture;
}
public Translator(String language)
{
switch (language.ToLower())
{
case "french":
Ci = new CultureInfo("fr-FR");
break;
case "english":
Ci = new CultureInfo("en-GB");
break;
default:
Ci = new CultureInfo("en-GB");
break;
}
}
public Translator(SupportedLanguage language)
{
switch (language)
{
case SupportedLanguage.French:
Ci = new CultureInfo("fr-FR");
break;
case SupportedLanguage.English:
Ci = new CultureInfo("en-GB");
break;
default:
Ci = new CultureInfo("en-GB");
break;
}
}
public string Text
{
get;
set;
}
override public object ProvideValue(IServiceProvider serviceProvider)
{
if (Text == null)
return "";
ResourceManager Resmgr = new ResourceManager(ResourceId
, typeof(Translator).GetTypeInfo().Assembly);
return Resmgr.GetString(Text, Ci);
}
public string ProvideValue(string stringToTranslate)
{
Text = stringToTranslate;
if (Text == null)
return "";
ResourceManager Resmgr = new ResourceManager(ResourceId
, typeof(Translator).GetTypeInfo().Assembly);
return Resmgr.GetString(Text, Ci);
}
}
在我只使用我的翻译类之前,我可以这样绑定:
Content="{Core:Translator Text=MyText}"
设置我的Text属性会调用我的ProvideValue(IServiceProvider serviceProvider)
方法,所以我将绑定MyText的resource.string。
现在我有多种语言,我尝试使用我的GlobalTranslator
做同样的事情。
我可以通过
GlobalTranslator.Instance
的引用
<Window.Resources>
<x:StaticExtension Member="Core:GlobalTranslator.Instance" x:Key="MyGlobalTranslator"/>
</Window.Resources>
但我似乎找不到像
这样的方法Content="{MyGlobalTranslator.Translator Text=MyText}"
我仍然可以在
背后的代码中执行此操作MyButton.Content = GlobalTranslator.Instance.Translator.ProvideValue("MyText");
但是想知道是否有办法在xaml中进行。
答案 0 :(得分:0)
所以为了解决我的问题,我不得不重构一些代码。
在初始化组件时,每次视图创建一个新的Translator
,我希望此Translator
考虑所选的CultureInfo
,因此我创建了一个新的Singleton
GlobalCulture
,而不是从CultureInfo Ci
获取Translator
,而是直接从我的GlobalCulture
中取出GlobalTranslator
。
这样,如果我使用我的Translator
或我的视图InitializeComponent
初始化的新CultureInfo
,我就无所谓了。我将永远得到正确的Translator
。
我的public class Translator : MarkupExtension
{
const string ResourceId = "LDVELH_WPF.Resources.Strings";
public Translator()
{
}
public string Text
{
get;
set;
}
override public object ProvideValue(IServiceProvider serviceProvider)
{
if (Text == null)
return "";
ResourceManager Resmgr = new ResourceManager(ResourceId
, typeof(Translator).GetTypeInfo().Assembly);
return Resmgr.GetString(Text, GlobalCulture.Instance.Ci);
}
public string ProvideValue(string stringToTranslate)
{
Text = stringToTranslate;
if (Text == null)
return "";
ResourceManager Resmgr = new ResourceManager(ResourceId
, typeof(Translator).GetTypeInfo().Assembly);
return Resmgr.GetString(Text, GlobalCulture.Instance.Ci);
}
}
现在看起来像是:
GlobalTranslator.Instance.Translator = new Translator(language);
当我更改语言设置而不是执行:GlobalCulture.Instance.CultureInfo = new CultureInfo(language);
我这样做:
Content="{Core:Translator Text=MyText}"
所以我可以通过six