首页 > 编程语言 >C#桌面应用程序多语言编程

C#桌面应用程序多语言编程

时间:2023-09-15 15:55:55浏览次数:30  
标签:文件 语言 自定义 C# 编程 应用程序 如下 实现 窗体

当我们的软件需要在国外应用时,就需要将软件界面的文字切换成相应国家的语言,这时就需要实现软件界面的多语言,也称为国际化,本篇博客讲的是C#的多语言版本的实现。本篇博客分别讲解如下内容:

主窗体的多语言实现
自定义窗体的多语言实现
自定义控件的多语言实现
MessageBox对话框的多语言实现、普通字符串的多语言实现。
本篇博客讲解的方法是冷切换而非热切换,即更改语言设置后,软件需要重启才能生效。当你的软件界面/自定义控件很多时,本篇博客的方法重复性工作会很多,多少个窗体/自定义控件就需要重复多少遍下面的操作多少遍,且一个窗体/自定义控件如果是两种语言就需要2个资源文件,随着窗体的增多,资源文件也会增多。目前博主没有找到所有窗体一种语言共用一个资源文件的方法。本篇博客的方法供大家参考学习。

一、主窗体的多语言实现
1.1 实现方法
实现的思路是利用不同的资源文件来实现,基本分为三步:

1.更改主窗体的Localizable属性值。
2.给主窗体增加多个资源文件,每个资源文件为一种语言,然后翻译相应的显示文字。
3.在主窗体的代码段加一两句代码即可。
1.2 操作说明
打开主窗体界面,在属性页找到Localizable属性值,将其修改为True,如下图所示。如果你的VS没有属性页窗口,那就在VS的菜单栏-》视图-》其他窗口-》属性窗口打开它。

添加资源文件并写好资源文件。添加资源文件的方法有两个自动添加和手动添加两种。

1.自动添加。修改窗体的language属性值为相应语言。然后生成一次解决方案,在将language属性值切换到其他选项,此时相应位置会出现一个和窗体同名外加几个字符的资源文件,可能有时不会生成,博主有时也没成功,目前没找到原因,这时候就需要手动添加了。
2.手动添加。在解决方案资源管理器中,在项目名上右键-》添加-》新建项-》资源文件,名称按指定格式命名,命名规则是相应窗体的名称+“.”+ 相应语言字符串+“.resx”。英文是“en”,简体中文是“zh-CHS”。我添加后的情况如下图所示。窗体名.resx这个资源文件是默认资源,自动添加的,另外两个是我手动添加的。

 然后是写资源文件,将需要翻译的界面显示字符翻译成相应语言并保存,如果不知道怎么写,可参照默认资源文件,复制其内容再进行修改。我写的资源文件如下图所示。

 

 最后在窗体名的cs文件的构造函数的第一行加入以下代码即可,记住一定要InitializeComponent之前加,根据语言选择下方代码:

//中文
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("zh-CHS");
//英文
//System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en");

1.3 运行结果

运行结果如下图所示:

 

界面实现了多语言显示,但是可以发现浅蓝色的那块并没有变化,那是放的自定义控件。那么如何实现自定义控件的多语言呢,请看下一节。

二、自定义控件的多语言实现

实现自定义控件的多语言,很简单,只需要完成上方的前两步即可,不需要加代码。操作步骤就不重复说了,直接上我完成的图。

 

 

 

 完成以上步骤后,运行,我的运行结果如下图所示:

 

三、自定义子窗体的多语言实现

先来测试一下,在主窗体中打开一个自定义子窗体,运行结果是什么样的,如下图所示:

 很显然,子窗体没有和主窗体相同语言。如何实现呢,首先还是重复前两个步骤。想实现子窗体和主窗体相同语言,方法是给子窗体的构造函数传入一个参数即可,实现如下所示

 

 代码如下:

//在主窗体的构造函数中第一行加如下代码
//language = "en";
language = "zh-CHS";
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(language);

//写一个子窗体的带一个参数的构造函数加入如下代码
public MySubForm(string language)
{
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(language);
InitializeComponent();
}

//在主窗体创建子窗体的代码部分加如下代码
MySubForm subForm = new MySubForm(language);

完成以上工作后,运行结果如下:

 

四、MessageBox的多语言实现

在软件编写过程中,经常会用到消息对话框和用户交互,所以消息对话框的多语言实现也至关重要。我们先给按钮写个事件,按一下按钮就弹出一个对话框,代码如下:

 运行效果如下:

 

如何实现呢,消息对话框的多语言实现和前面的方法不太一样,其实它的实现和对任何想要实现多语言的字符串本质上是一样的,所以在此只讲一个。方法如下:

这时不需要添加资源文件,只需要在用到messageBox的窗体的相应资源文件中加内容即可,首先在资源文件中加入想要实现多语言的字符串。下图是我写的,供大家参考。第一列只是个名称,你可以根据需要命名即可(类似于变量名),到时候代码段就是用到这个名称。第二列是你要显示的字符串的多语言版本。

 

 然后写一个方法,以供后面使用代码如下:

///应用资源文件中某个值
///参数1:指定用哪个界面类的资源文件
///参数2:指定用资源文件中的哪个值
public static string ApplyResource(Type resourceObject, string Name)
{
System.Resources.ResourceManager resource = new System.Resources.ResourceManager(resourceObject);
return resource.GetString(Name);
}

然后修改消息对话框位置的代码,我的位置就在按钮的事件中,修改后如下图所示:

private void button1_Click(object sender, EventArgs e)
{
//MessageBox.Show("I am MessageBox", "Hello");
MessageBox.Show(ApplyResource(this.GetType(), "StrMessageBoxContent"),
ApplyResource(this.GetType(), "StrMessageBoxTitle"));
}

 改好后,运行结果如下所示:

 

标签:文件,语言,自定义,C#,编程,应用程序,如下,实现,窗体
From: https://www.cnblogs.com/funiyi816/p/17705189.html

相关文章

  • Dynamic CRM 字段数据类型及其后端赋值方式
    dynamiccrm字段数据类型及其赋值方式首先实例化一个对象:Entity_entity=newEntity("salesorder");1.十进制数取值:var_typeDecimal=_entity.GetAttributeValue<decimal>("unitprice");赋值:_entity["unitpri......
  • openharmony应用开发HDC 常用命令
    1.查看hdc版本:hdc--version 2.查看设备sn号:hdclisttargets 3.进入shell:hdcshell 4.重启设备hdcshellreboot 5.设置RK开发板根目录的读写权限hdcshellmount-orw,remount/#此命令用于解决推包时提示只读路径,无法推送。例如:[Fail]Erroropeningfile:......
  • Vue——模版语法、文本指令、事件指令、属性指令、style和class、条件渲染、列表渲染
    模版语法<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title><scriptsrc="./js/vue.js"></script></head><body><divid=&......
  • OpenCloudOS + 英特尔第四代至强处理器:完美适配,加速未来
    作为连接底层硬件和上层工作负载的桥梁,操作系统是发挥硬件潜能、保障业务质量的技术底座。自从OpenCloudOSIntelSIG成立后,社区和英特尔就将第四代至强可扩展处理器(SapphireRapids,简称为SPR)与OpenCloudOS的适配作为IntelSIG的首要工作。通过双方的深度合作,反复打磨,Ope......
  • 解决错误 org.apache.ibatis.type.TypeException: The alias xxx is already mapped t
    具体错误信息如下:其实就是此类名和其他包有冲突那么解决办法就是声明一个别名就好了:使用注解解決办法......
  • flask从入门到精通之钩子、异常、context、jinjia模板、过滤器
    一、请求全局钩子【hook】此处的全局钩子,其实就是类似django里面的中间件。也就是只要调用或者注册了,在http请求响应中是必然执行的。在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如:在项目运行开始时,建立数据库连接,或创建连接池;在客户端请求开始时,根据......
  • Azure Data Factory(八)数据集验证之服务主体(Service Principal)
    一,引言如下图所示,今天我们接着上一篇内容,继续讲解AzureDataFactory中的数据集连接服务的认证方式:ServicePrincipal关于ServicePrincipal的创建可以参考:AzureAD(四)知识补充-服务主体至于需要给ServicePrincipal分配什么样的角色和权限,大家可以自行参考实际项目......
  • Salesforce正在推出AI功能,传统的项目文档管理还需要么?
    随着新版本的发布,Salesforce平台愈发强大,但也更加复杂。无论你是如何使用Salesforce的,使用文档都有助于保持组织性。特别是当下Salesforce正在推出AI功能,为组织带来巨大的竞争优势。AI需要准确的数据,组织文档越好,AI可以提供的结果就越准确。ElementsGPT已经使用AI来交付惊人的......
  • css-面试题
    1-css中隐藏元素的方法有哪些?display:none;不显示对应的元素,文档布局中不占控件visibility:hidden;隐藏元素,但仍占空间2-display的值有哪些?分别是什么作用?inline默认,将元素设为行内元素block将元素设为块元素inline-block将元素设为行内块元素none隐......
  • 简单介绍cmakelist的使用
    Windows平台1在文件夹中创建一个CPP文件;自己随便写一个主函数就行 写一个简单的c++main函数;2创建一个CMakeLists.txt文件,写上下列内容;可以使用notepad,会对一些字段自动补齐cmake_minimum_required(VERSION3.5FATAL_ERROR)Project(HELLOW-01LANGUAGESCXX)add_e......