近日在做一个sdk项目,因为要实现多语言切换,单独类库多语言这方面的实现不是很多,故整理如下。
假设我们默认语言是英文,添加这两个文件。两个资源文件中均添加 UserCenter_Title 字段,并给其赋值。注意访问修饰符设置成public。
如果是要实现多主题的话,可相应添加图片等资源。
继承INotifyPropertyChanged并实现,最终代码可能如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34class="csharp keyword">public class AdeasygoLocalizedStrings : INotifyPropertyChanged
{
private static AppResource _localizedResources = new AppResource();
public AppResource AdeasygoLocalizedResource
{
get
{
return _localizedResources;
}
set
{
_localizedResources = value;
NotifyPropertyChanged("AdeasygoLocalizedResource");
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void NotifyPropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
这一步非常重要,添加ResourceManager属性的Set方法,以支持语言的动态切换:
1 2 3 4 5 6 7 8 9 10 11 12 13 14/// <summary>
/// 返回此类使用的缓存的 ResourceManager 实例。
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
public static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Adeasygo.Community.Sdk.Resources.AppResource", typeof(AppResource).Assembly);
resourceMan = temp;
}
return resourceMan;
}
set { resourceMan = value; }
}
public static void Init(string lang = "en")
{
ResourceManager resManager;
switch (lang)
{
case "zh":
resManager = new ResourceManager("Sdk.Resources.AppResource-zh-CN", Assembly.Load("Sdk"));
break;
default:
resManager = new ResourceManager("Sdk.Resources.AppResource", Assembly.Load("Sdk"));
break;
}
AppResource.ResourceManager = resManager;
}
如此就实现了类库中动态的语言切换,图像资源等,也可以定义在resx中实现根据语言变化或者多主题切换。
本文固定链接: http://www.liubaicai.net/index.php/archives/425
欢迎访问:http://www.liubaicai.net/ 寻找更多