在PictureStudio中,我需要实现多国语言的界面切换,而且切换各种语言版本的时候希望程序是动态的加载语言,不希望切换语言后重新启动程序。

实现这样的功能可以有很愚蠢的方法,比如说你可以在程序中为界面上的所有国家的文字信息,在代码中进行赋值,你可以想像这样的做法是可以的,但绝对是愚蠢的,代码不应该写得这么丑陋。如果需要实现10个不同语言的版本,那你的代码中每一个涉及到界面文字的控件都要有至少10行代码,而且维护的时候,需要到代码中去修改不同语言显示,这显然是很糟糕的。

把语言文字作为资源,而不是放在代码中。在.NET开发中,VS2005为每一个窗口都自动创建一个与窗口同名的资源文件,后缀名为.resx(如下图)

资源文件中可以存放字符串,对象,2进制资源,如下图所示:

我们现在可以为每个窗口创建对应不同语言版本的资源文件,将文字字符作为资源存放在资源文件(resx文件其实是XML格式的文件,你可以用IE打开浏览其内容)而不是使用默认的资源文件。比如我们要实现简体中文,繁体中文,英文三种不同类型文字信息的切换。我们就要为每个窗口创建3个对应相应语言的资源文件。如下图,我们在工程中为主窗口新建一个资源文件

需要注意的是,窗口资源文件的命名是有严格规定的。比如主窗口类是MainForm,创建对应该窗口简体中文版本的资源文件的名字前面必须就是该窗口的类名(MainForm)然后一个.后面接着是语言类型的标志之后又是一个.最后是resx后缀名。语言类型的标志也是有预先规定的,比如简体中文必须是zh-CHS,具体的相关设定你需要查看MSDN的说明:

对于一个窗口,我们添加了其相应的几个语言版本的resx资源文件以后,就应该在资源文件中添加不同语言版的字符串资源。需要注意的是,不同语言版本的资源文件中,相应各个语言的版本的字符串的名字必须是相同的!见下面的截图,两个资源文件中的不同版本的字符串资源的名字是相同的。

资源文件准备好以后,我们还需要将窗口的Localizable属性设置为True,然后就做好了所有的工作,下面添加代码来实现各国语言文字的切换。在菜单英文选项单击事件函数中添加下面的代码

private void languageMenuEnglish_Click(object sender, EventArgs e)
        {
            Thread.CurrentThread.CurrentUICulture = new CultureInfo("en");
            UpDataMainFormUILanguage();
        }
//根据当前的语言区域,更新主窗口的语言信息
        private void UpDataMainFormUILanguage()
        {            
            ResourceManager rm = new ResourceManager(typeof(MainForm));
            UpDataMainFormMenuLanguage(rm);
            UpDataMainFormToolBarLanguage(rm);
        }
//根据当前的语言区域,更新主窗口菜单的语言
        private void UpDataMainFormMenuLanguage(ResourceManager rm)
        {
            fileMenu.Text = rm.GetString("fileMenu");
            fileMenuCreate.Text = rm.GetString("fileMenuCreate");
            fileMenuOpen.Text = rm.GetString("fileMenuOpen");
            fileMenuSaveProject.Text = rm.GetString("fileMenuSaveProject");
            fileMenuSaveAs.Text = rm.GetString("fileMenuSaveAs");
            fileMenuCloseProject.Text = rm.GetString("fileMenuCloseProject");
            fileMenuExit.Text = rm.GetString("fileMenuExit");

            operationMenu.Text = rm.GetString("operationMenu");
            operationMenuUndo.Text = rm.GetString("operationMenuUndo");
            operationMenuRedo.Text = rm.GetString("operationMenuRedo");
            operationMenuSelectAll.Text = rm.GetString("operationMenuSelectAll");
            operationMenuSelectInvert.Text = rm.GetString("operationMenuSelectInvert");
            operationMenuDeleteSelected.Text = rm.GetString("operationMenuDeleteSelected");
            operationMenuCut.Text = rm.GetString("operationMenuCut");
            operationMenuCopy.Text = rm.GetString("operationMenuCopy");
            operationMenuPaste.Text = rm.GetString("operationMenuPaste");

            displayMenu.Text = rm.GetString("displayMenu");
            displayMenuRuler.Text = rm.GetString("displayMenuRuler");
            displayMenuToolBox.Text = rm.GetString("displayMenuToolBox");
            displayMenuImageListForm.Text = rm.GetString("displayMenuImageListForm");
            displayMenuLayerListForm.Text = rm.GetString("displayMenuLayerListForm");
            displayMenuHistoricalCommandForm.Text = rm.GetString("displayMenuHistoricalCommandForm");
            displayMenuZoomIn.Text = rm.GetString("displayMenuZoomIn");
            displayMenuZoomOut.Text = rm.GetString("displayMenuZoomOut");

            imageMenu.Text = rm.GetString("imageMenu");
            imageMenuAdjustSize.Text = rm.GetString("imageMenuAdjustSize");
            imageMenuHorizontalFlip.Text = rm.GetString("imageMenuHorizontalFlip");
            imageVerticalFlip.Text = rm.GetString("imageVerticalFlip");
            imageMenuRotate90.Text = rm.GetString("imageMenuRotate90");
            imageMenuRotate180.Text = rm.GetString("imageMenuRotate180");

            layerMenu.Text = rm.GetString("layerMenu");
            layerMenuCreateLayer.Text = rm.GetString("layerMenuCreateLayer");
            layerMenuDeleteLayer.Text = rm.GetString("layerMenuDeleteLayer");
            layerMenuLayerCombination.Text = rm.GetString("layerMenuLayerCombination");

            filterMenu.Text = rm.GetString("filterMenu");
            filterMenuGrayEffect.Text = rm.GetString("filterMenuGrayEffect");
            filterMenuInvertColorEffect.Text = rm.GetString("filterMenuInvertColorEffect");
            filterMenuParticleEffect.Text = rm.GetString("filterMenuParticleEffect");

            languageMenu.Text = rm.GetString("languageMenu");
            languageMenuSimlpeChinese.Text = rm.GetString("languageMenuSimlpeChinese");
            languageMenuTaiWanChinese.Text = rm.GetString("languageMenuTaiWanChinese");
            languageMenuEnglish.Text = rm.GetString("languageMenuEnglish");

            helpMenu.Text = rm.GetString("helpMenu");
            helpMenuHelp.Text = rm.GetString("helpMenuHelp");
            helpMenuAbout.Text = rm.GetString("helpMenuAbout");

            return;
        }
//根据当前的语言区域,更新主窗口工具栏的语言
        private void UpDataMainFormToolBarLanguage(ResourceManager rm)
        {
            fileButtonCreate.ToolTipText = rm.GetString("fileButtonCreate");
            fileButtonOpen.ToolTipText = rm.GetString("fileButtonOpen");
            fileButtonSave.ToolTipText = rm.GetString("fileButtonSave");

            operationButtonCut.ToolTipText = rm.GetString("operationButtonCut");
            operationButtonCopy.ToolTipText = rm.GetString("operationButtonCopy");
            operationButtonPaste.ToolTipText = rm.GetString("operationButtonPaste");

            operationButtonUndo.ToolTipText = rm.GetString("operationButtonUndo");
            operationButtonRedo.ToolTipText = rm.GetString("operationButtonRedo");

            displayButtonZoomIn.ToolTipText = rm.GetString("displayButtonZoomIn");
            displayButtonZoomOut.ToolTipText = rm.GetString("displayButtonZoomOut");

            toolBoxPopButton.Text = rm.GetString("toolBoxPopButton");

            return;
        }       

ResourceManager是操作资源的类,使用这个类的对象来操作字符串资源。 Thread.CurrentThread.CurrentUICulture 的属性设置为英文以后,ResourceManager对象rm的调用rm.GetString会调用当前语言对应的字符资源。GetString根据字符串资源名字,找到相应的语言版本的资源,所以之前我们不同版本的字符串资源的名字必须是相同的。

当切换到简体中文时,所加的代码也类似

private void languageMenuSimlpeChinese_Click(object sender, EventArgs e)
        {
            Thread.CurrentThread.CurrentUICulture = new CultureInfo("zh-CHS");
            UpDataMainFormUILanguage();
        }

以上的处理方法,在有众多语言版本需要实现时,代码量都差不多,添加一种语言版本,只要添加相应的资源文件,代码中只要加上两句,1设置程序当前语言区域属性,2调用读取资源的函数。当发现语言有需要更正的地方时,可以相当方便在资源文件中修改,而不用动源代码。切换文字区域后,程序也不用重新启动,Paint.Net程序切换后需要重新启动,我不知道他们的具体做法是怎样的。但我使用的方法避免了重新启动程序,应该更好些吧。

切换为中文的情况:

切换为英文的情况:

C#实现多国语言的界面切换的更多相关文章

  1. 引擎设计跟踪(九.8) Gizmo helper实现与多国语言

    最近把gizmo helper的绘制做好了. 1.为了复用代码,写了utility来创建sphere, cube, cylinder, plane, ring(line), circle(solid) ...

  2. MFC多国语言——资源副本

    此随笔主要参考了http://www.cnblogs.com/xianyunhe/archive/2011/09/02/2163842.html 为软件提供多国语言的支持的具体实现方法有很多,但基本原 ...

  3. Vnc自动登录器-多国语言绿色版

    推荐:介绍一个VNC连接工具:iis7服务器管理工具.IIs7服务器管理工具可以批量连接并管理VNC服务器.作为服务器集成管理器,它最优秀的功能就是批量管理windows与linux系统服务器.vps ...

  4. 解析大型.NET ERP系统 多国语言实现

    实现多国语言有许多种实现方案,无外乎是一种字符串替换技术,将界面控件的文本标签替换成相应语言的文字..NET Windows Forms实现多国语言的方法有以下几种: 1 .NET的方案,使用资源文件 ...

  5. Unity iOS混合开发界面切换思路

    Unity iOS混合开发界面切换思路 最近有很多博友QQ 私信 或则 留言联系我,请教iOS和Unity界面之前相互切换的问题,源代码就不私下发你们了,界面跳转功能的代码我直接贴到下面好了,顺带说i ...

  6. 高质量,高效率的多国语言软件开发(Web/PC/Mobile),使用接口约束/调用不同语言资源

    偶然间翻出了几年前写的一个小程序,把当时的资料整理整理分享一下. 当时为了给自己的软件实现多国语言功能,而开发的辅助工具:SE String Resource. 这是当时基于自己另一款 IDE 软件抽 ...

  7. WinCE6.0多国语言软键盘

    N久以前写过一篇<WinCE下自定义的大软键盘>,这个自定义软键盘就是为RM905a+项目来做的.RM905a+的系统分辨率是640*480,WinCE原生键盘小的太小,大的又太大.所以就 ...

  8. Inno Setup:获取isl中的多国语言字串

    原文 http://zwkufo.blog.163.com/blog/static/25882512010101041626803/?suggestedreading&wumii 用InnoS ...

  9. WPF应用程序支持多国语言解决方案

    原文:WPF应用程序支持多国语言解决方案 促使程序赢得更多客户的最好.最经济的方法是使之支持多国语言,而不是将潜在的客户群限制为全球近70亿人口中的一小部分.本文介绍四种实现WPF应用程序支持多国语言 ...

随机推荐

  1. Windows7 下安装ORACLE 11G(遇到的问题)

    首先官网下载ORACLE11G(我的电脑是32位) 下载到磁盘后(解压成为一个文件有个DATABASE文件夹) 点击安装 只安装数据库软件(之后再创建数据库:因为容易出问题) 之后的安装过程就跟着走就 ...

  2. 使用info.plist(或工程名-info.plist)向程序中添加软件Build ID或者版本号信息

    在实际应用程序开发过程中,经常需要向程序中添加软件版本号或者类似的信息,以保证之后发现问题时知道bug所在的版本,我们可以通过在工程名-info.plist文件中设置相关的key/value对(键/值 ...

  3. 轮子来袭 vJine.Core Orm 之 01_快速体验

    vJine.Core 是.Net环境下C#类库,在其包含的众多功能中ORM功能尤为突出,现简介如下. 一.支持的数据库: SQLite, MySQL, MS SQL, Oracle. 二.使用方法: ...

  4. bat里如何用相对路径

    在bat中直接使用绝对路径没有问题,但是文件传到其他地方时,绝对路径会发生改变,因此想通过使用相对路径来解决. 可以通过在bat获取当前bat所在的目录,然后cd 该目录来解决该问题 在bat前面增加 ...

  5. [DLL] Dynamic link library (dll) 的编写和使用教程

    前一阵子,项目里需要导出一个DLL,但是导出之后输出一直不怎么对,改了半天才算改对...读了一些DLL教程,感觉之后要把现在的代码导出,应该还要花不少功夫...下面教程参照我读的3个教程写成,所以内容 ...

  6. c++实现类似Common Lisp的多参数加法和比较

    在CL里我们可以这样: $ sbcl * (+ 1 2 3) 6 * (< 1 2 3) T * (< 2 3 1) NIL * 从简单的方面看, CL的+和<就是一个接收多参数的函 ...

  7. Python3 错误处理 和 测试

    try 让我们用一个例子来看看try的机制: try: print('try...') r = 10 / 0 except ZeroDivisionError as e: print('except: ...

  8. 挑战EXT——QUI框架介绍与下载

    挑战EXT——QUI框架介绍与下载 为庆祝新版QUI问世特写此文: 提起EXTJS的大名,恐怕WEB开发界无人不晓吧.EXTJS框架发展到现在,已经非常成熟和全面了.它的组件库尤其是DataGrid组 ...

  9. post提交与get提交的一个小知识点

    今天偶然发现post提交与get提交的一个小知识点,记下来以后可以看看. 将form表单的method的设置为get后,通过url传递的参数将不会被传递到服务器,例如1.ashx?a=123,的a=1 ...

  10. 图片裁切插件jCrop的使用心得(一)

    之前,项目经理为了提升用户体验让我在之前图片上传功能的基础上实现图片的裁切功能,作为一个前端小白来说听了这个需求心里一紧,毕竟没有做过,于是跟项目经理商量要先做下调研.在一上午的调研中发现了jCrop ...