同时兼容这么多需求的解决方案 我想到的 只有通过 动态切换加载资源字典  前端用绑定的模式 达到托管最大化

多语言举例

我编辑了 两个 语言包 一个中文 一个英文  (语言包这个最好用T4 写个模板,这样添加新语言接口的时候不会遗漏,只是建议)

en-us.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:s="clr-namespace:System;assembly=mscorlib">

    <s:String x:Key="Menu">Menu</s:String>

    <s:String x:Key="MenuClass">Class</s:String>

    <s:String x:Key="MenuGun">Gun</s:String>

    <s:String x:Key="LanguageType">en-us</s:String>

</ResourceDictionary>

zh-cn.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:s="clr-namespace:System;assembly=mscorlib">

    <s:String x:Key="Menu">菜单</s:String>

    <s:String x:Key="MenuClass">种类</s:String>

    <s:String x:Key="MenuGun">装备</s:String>

    <s:String x:Key="LanguageType">zh-cn</s:String>

</ResourceDictionary>

这两个资源文件 我放到新建的文件夹 Languages 里

然后在  App.xaml 里手动绑定一个默认加载的语言方案 目的是为了 写代码的时候 绑定 可以使用 键值联想 再一个也可以直接在设计视图界面 直接查看绑定效果 方便修改和 调试

    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/Languages/en-us.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>

    </Application.Resources>

添加个全局静态变量来维护记录当前使用的语言,为了方便配置启动的默认语言,我单独又在一个txt里 写了个值.我之所以没放到config里,是因为不想在给客户更新的时候把客户的个性配置方案个覆盖掉,打包发布程序必须得打包config,否则编译失败,目前我没找到更好的解决方案.

 public class GlobalSettings
     {

         private static string _CurrentLanguage;

         public static string CurrentLanguage
         {
             get
             {
                 if (string.IsNullOrEmpty(_CurrentLanguage))
                 {
                     string languageFilePath = Environment.CurrentDirectory + "\\language.txt";

                     string strLanguage = string.Empty;
                     string strDefaultLanguage = "zh-cn";

                     using (FileStream fs = new FileStream(languageFilePath, FileMode.OpenOrCreate,FileAccess.ReadWrite,FileShare.ReadWrite))
                     {
                         using (StreamReader sr = new StreamReader(fs))
                         {
                             strLanguage = sr.ReadToEnd().Trim().ToLower();
                         }
                     }

                     if (string.IsNullOrEmpty(strLanguage))
                     {
                         using (FileStream fs = new FileStream(languageFilePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite))
                         {
                             strLanguage = strDefaultLanguage;
                             using (StreamWriter sw = new StreamWriter(fs))
                             {
                                 sw.Write(strLanguage);
                             }
                         }
                     }

                     _CurrentLanguage = strLanguage;

                 }

                 return _CurrentLanguage;

             }
             set { _CurrentLanguage = value; }
         }

     }

程序入口窗体 随便放两个按钮 "中文" "英文" 用来切换系统的语言

    <Grid>
        <Button Content="中文"
                Height="23"
                HorizontalAlignment="Left"
                Margin="78,139,0,0"
                Name="button1"
                VerticalAlignment="Top"
                Width="75"
                Click="button1_Click" />
        <Button Content="英文"
                Height="23"
                HorizontalAlignment="Right"
                Margin="0,139,153,0"
                Name="button2"
                VerticalAlignment="Top"
                Width="75"
                Click="button2_Click" />
    </Grid>
   private void ShowWindow()
         {

             ];
             if (merged!=null)
             {
                 merged.Source = new Uri(string.Format("pack://application:,,,/Languages/{0}.xaml", GlobalSettings.CurrentLanguage));
                 App.Current.Resources.MergedDictionaries[] = merged;
             }

             Window1 w1 = new Window1();
             w1.ShowDialog();
             w1 = null;
         }

         private void button1_Click(object sender, RoutedEventArgs e)
         {
             GlobalSettings.CurrentLanguage = "zh-cn";
             ShowWindow();
         }

         private void button2_Click(object sender, RoutedEventArgs e)
         {
             GlobalSettings.CurrentLanguage = "en-us";
             ShowWindow();
         }

使用语言的绑定窗体 Window1.xaml

    <Grid>

        <TextBlock Height="37"
                   HorizontalAlignment="Left"
                   Margin="31,33,0,0"
                   Name="textBlock1"
                   VerticalAlignment="Top"
                   Width="83"
                   Text="{DynamicResource  Menu }"
                   />

        <TextBlock Height="37"
                   HorizontalAlignment="Left"
                   Margin="159,33,0,0"
                   Name="textBlock2"
                   Text="{DynamicResource   MenuClass }"
                   VerticalAlignment="Top"
                   Width="83" />

        <TextBlock Height="37"
                   HorizontalAlignment="Left"
                   Margin="31,104,0,0"
                   Name="textBlock3"
                   Text="{DynamicResource   MenuGun }"
                   VerticalAlignment="Top"
                   Width="83" />

        <TextBlock Height="37"
                   HorizontalAlignment="Left"
                   Margin="149,104,0,0"
                   Name="textBlock4"
                   Text="{DynamicResource   LanguageType }"
                   VerticalAlignment="Top"
                   Width="83" />
    </Grid>
    

这样只需要动态切换加载资源字典就好了

这样是直接编译到程序集里了 扩展性还差很多

可以把 一套资源字典编译到 一个单独的dll里 这种做法就比较类似  *.skin的做法  这种就是把动态加载资源 替换成 动态加载 dll

只是做了个简单的例子 提供个思路

WPF 多语言 多资源 多皮肤 处理方案的更多相关文章

  1. 项目笔记---WPF多语言方案

    近期由于朋友邀请帮忙给一个开源的游戏“外挂”做一个I18N的解决方案,恰好也是WPF做的,之前有过相关经验,就忙了一个星期终于搞定了,已经提交给作者了,现在这里做一个分享. 这里分享下我个人Fork的 ...

  2. 一份关于Swift语言学习资源的整理文件

    一份关于Swift语言学习资源的整理文件     周银辉 在这里下载 https://github.com/ipader/SwiftGuide

  3. (转)WPF控件开源资源

    (转)WPF控件开源资源 Textbox Drag/Drop in WPFhttp://www.codeproject.com/Articles/42696/Textbox-Drag-Drop-in- ...

  4. Go语言学习资源

    Go语言学习资源 下载:http://www.golangtc.com/downloadhttp://www.golangtc.com/download/liteide 安装及开发工具http://j ...

  5. WPF笔记(1.8 资源与映射)——Hello,WPF!

    原文:WPF笔记(1.8 资源与映射)--Hello,WPF! 终于,看明白了,已经是凌晨1:39分.这本书这一节写得实在是不好,一个local搞得我糊里糊涂,于是,准备按照他的思路,按照我的理解,改 ...

  6. WPF中静态引用资源与动态引用资源的区别

    WPF中静态引用资源与动态引用资源的区别   WPF中引用资源分为静态引用与动态引用,两者的区别在哪里呢?我们通过一个小的例子来理解. 点击“Update”按钮,第2个按钮的文字会变成“更上一层楼”, ...

  7. WPF 多语言解决方案 - Multilingual App Toolkit

    1.首先安装Multilingual App Toolkit   2.新建项目,在VS中点击"工具" -> "Multilingual App Toolkit&qu ...

  8. WPF控件开源资源

    (转)WPF控件开源资源 Textbox Drag/Drop in WPFhttp://www.codeproject.com/Articles/42696/Textbox-Drag-Drop-in- ...

  9. WPF中引入外部资源

    有时候需要在WPF中引入外部资源,比如图片.音频.视频等,所以这个常见的技能还是需要GET到. 第一步:在VS中创建一个WPF窗口程序 第二步:从外部引入资源,这里以引入图片资源为例 1)新建Reso ...

随机推荐

  1. Flex XML

    一.创建XML类 1.把字符串对象转换为XML: var xmlStr:String="<students><student><name>吕布</n ...

  2. 深刻理解Java中final的作用(一):从final的作用剖析String被设计成不可变类的深层原因

    声明:本博客为原创博客,未经同意,不得转载!小伙伴们假设是在别的地方看到的话,建议还是来csdn上看吧(原文链接为http://blog.csdn.net/bettarwang/article/det ...

  3. Android-----使用Button特效 selector+shape

    当然除了使用drawable这样的图片外今天谈下自定义图形shape的方法,对于Button控件Android上支持以下几种属性shape.gradient.stroke.corners等. 我们就以 ...

  4. C#中listbox中选中多项,并删除

    1.SelectionMode 改成可以多选2.利用KeyDown事件: private void listBox1_KeyDown(object sender, KeyEventArgs e) { ...

  5. 关于QStringRef

      QString 为字符串操作提供了各种成员比如mid().left().right().它们都创建会一个新的字符串,因此有一个对在已存在QString的malloc和深拷贝. 与此相反,QStri ...

  6. Anatomy of the Linux kernel--转

    ref:http://www.ibm.com/developerworks/linux/library/l-linux-kernel/?S_TACT=105AGX52&S_CMP=cn-a-l ...

  7. Linux中命令链接操作符的十个最佳实例

    转载: http://www.linuxeden.com/html/softuse/20140112/147406.html http://www.tecmint.com/chaining-opera ...

  8. Mybatis-Generator 自动生成Dao、Model、Mapping相关文档

    最近在学习mybatis,结果在写Mapping的映射文件时insert语句一直报错,于是想看看标准的映射文件是什么样.百度到Mybatis-Generator 自动生成Dao.Model.Mappi ...

  9. python编码encode和decode

    计算机里面,编码方法有很多种,英文的一般用ascii,而中文有unicode,utf-8,gbk,utf-16等等. unicode是 utf-8,gbk,utf-16这些的父编码,这些子编码都能转换 ...

  10. WPF 之 左键弹出操作菜单,并禁用右键菜单

    在目前的WPF版本中,很多的控件都有一个ContextMenu的属性,可以设置组件的右键菜单,这点确实是很方便,但是有些时候我们可能会需要当单击鼠标左键才弹出这个ContextMenu,而不是单击鼠标 ...