多语言软件开发之new CultureInfo(“”)与CultureInfoCreateSpecificCulture(“”)的异同
在多语言资源软件制作中肯定会遇到这样的问题,如下面的代码:
System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("zh-CHS");.codearea{ color:black; background-color:white; line-height:18px; border:1px solid #4f81bd; margin:0; width:auto !important; width:100%; overflow:auto; text-align:left; font-size:12px; font-family: "Courier New","Consolas","Fixedsys","BitStream Vera Sans Mono", courier,monospace,serif} .codearea pre{ color:black; line-height:18px; padding:0 0 0 12px !important; margin:0em; background-color:#fff !important} .linewrap pre{white-space:pre-wrap; white-space:-moz-pre-wrap; white-space:-pre-wrap; white-space:-o-pre-wrap; word-wrap:break-word; word-break:normal} .codearea pre.alt{ background-color:#f7f7ff !important} .codearea .lnum{color:#4f81bd;line-height:18px}
或
System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("en");.codearea{ color:black; background-color:white; line-height:18px; border:1px solid #4f81bd; margin:0; width:auto !important; width:100%; overflow:auto; text-align:left; font-size:12px; font-family: "Courier New","Consolas","Fixedsys","BitStream Vera Sans Mono", courier,monospace,serif} .codearea pre{ color:black; line-height:18px; padding:0 0 0 12px !important; margin:0em; background-color:#fff !important} .linewrap pre{white-space:pre-wrap; white-space:-moz-pre-wrap; white-space:-pre-wrap; white-space:-o-pre-wrap; word-wrap:break-word; word-break:normal} .codearea pre.alt{ background-color:#f7f7ff !important} .codearea .lnum{color:#4f81bd;line-height:18px}
上面这两种写法,在执行时都会报异常:
如果修改成如下写法:
System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en");.codearea{ color:black; background-color:white; line-height:18px; border:1px solid #4f81bd; margin:0; width:auto !important; width:100%; overflow:auto; text-align:left; font-size:12px; font-family: "Courier New","Consolas","Fixedsys","BitStream Vera Sans Mono", courier,monospace,serif} .codearea pre{ color:black; line-height:18px; padding:0 0 0 12px !important; margin:0em; background-color:#fff !important} .linewrap pre{white-space:pre-wrap; white-space:-moz-pre-wrap; white-space:-pre-wrap; white-space:-o-pre-wrap; word-wrap:break-word; word-break:normal} .codearea pre.alt{ background-color:#f7f7ff !important} .codearea .lnum{color:#4f81bd;line-height:18px}
System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("zh-CHS");.codearea{ color:black; background-color:white; line-height:18px; border:1px solid #4f81bd; margin:0; width:auto !important; width:100%; overflow:auto; text-align:left; font-size:12px; font-family: "Courier New","Consolas","Fixedsys","BitStream Vera Sans Mono", courier,monospace,serif} .codearea pre{ color:black; line-height:18px; padding:0 0 0 12px !important; margin:0em; background-color:#fff !important} .linewrap pre{white-space:pre-wrap; white-space:-moz-pre-wrap; white-space:-pre-wrap; white-space:-o-pre-wrap; word-wrap:break-word; word-break:normal} .codearea pre.alt{ background-color:#f7f7ff !important} .codearea .lnum{color:#4f81bd;line-height:18px}
代码一可以正常执行,代码二执行出现如下错误:
上面的代码为什么会出现,这样的问题呢?
这里我们要来说一下:区域性、固定区域性、非特定区域性、特定区域性
区域性名称遵循 RFC 1766 标准,格式为“ - ”,其中 是从 ISO 639-1 派生的由两个小写字母构成的代码, 是从 ISO 3166 派生的由两个大写字母构成的代码。例如,美国英语为“en-US”。在双字母语言代码不可用的情况中,将使用从 ISO 639-2 派生的三字母代码;例如,三字母代码“div”用于使用 Dhivehi 语言的区域。某些区域性名称带有指定书写符号的后缀;例如“-Cyrl”指定西里尔语书写符号,“-Latn”指定拉丁语书写符号。
固定区域性不区分区域性。可以使用空字符串 ("") 按名称或者按区域性标识符 0x007F 来指定固定区域性。固定区域性由CultureInfo类的InvariantCulture属性来代表固定区域性的实例。固定区域性仅与英语语言关联,不与任何国家/地区关联。它几乎可用在要求区域性的“全局化”命名空间中的所有方法中。如果你的程序进行字符串比较或大小写更改操作,则应该使用 InvariantCulture 确保无论系统如何设置的区域性,行为都将按照InvariantCulture所代表的英语语言的固定区域性来完成。
非特定区域性是与某种语言关联但不与国家/地区关联的区域性。特定区域性是与某种语言和某个国家/地区关联的区域性。例如,“en”是非特定区域性,而“en-US”是特定区域性。注意,“zh-CHS”(简体中文)和“zh-CHT”(繁体中文)均为非特定区域性。
区域性有层次结构,即特定区域性的父级是非特定区域性,而非特定区域性的父级是 InvariantCulture。CultureInfo类的Parent属性将返回与特定区域性关联的非特定区域性。如果特定区域性的资源在系统中不存在,或因其它原因不可用,则使用非特定区域性的资源;如果非特定区域性的资源也不可用,那么使用主程序集中嵌入的资源。
下面这两个语句有什么异同:
var cultureSpecific = CultureInfo.CreateSpecificCulture(name);
var culture = new CultureInfo(name);
.codearea{ color:black; background-color:white; line-height:18px; border:1px solid #4f81bd; margin:0; width:auto !important; width:100%; overflow:auto; text-align:left; font-size:12px; font-family: "Courier New","Consolas","Fixedsys","BitStream Vera Sans Mono", courier,monospace,serif} .codearea pre{ color:black; line-height:18px; padding:0 0 0 12px !important; margin:0em; background-color:#fff !important} .linewrap pre{white-space:pre-wrap; white-space:-moz-pre-wrap; white-space:-pre-wrap; white-space:-o-pre-wrap; word-wrap:break-word; word-break:normal} .codearea pre.alt{ background-color:#f7f7ff !important} .codearea .lnum{color:#4f81bd;line-height:18px}
使用第一种方法,只能创建固定区域性或特定区域性的CultureInfo实例。如果name为空字符串,则建立固定区域性的实例,如果name为非特定区域性,那么建立name 关联的默认特定区域性的 CultureInfo实例。第二种方法,则是建立一个name所指定的区域性的CultureInfo实例,它可以是固定的,非特定的或特定区域性的。
虽然“en”和”zh-CHS”都是非固定区域,但是“en”默认有关联的特定区域,而”zh-CHS“和”zh-CHT“都没有默认关联特定区域,所以上面的第四段代码会报错。
如果要设置当前线程的区域性,用下面的代码就可以正常执行:
public static void SetCurrentThreadCultureInfo(string name)
{
Properties.Resource.Culture = new System.Globalization.CultureInfo(name);
var newName = name;
switch (Properties.Resource.Culture.Name)
{
case "zh-CHS":
newName = "zh-CN";
break;
case "zh-CHT":
newName = "zh-TW";
break;
default:
break;
}
System.Threading.Thread.CurrentThread.CurrentUICulture = System.Globalization.CultureInfo.CreateSpecificCulture(newName);
}
.codearea{ color:black; background-color:white; line-height:18px; border:1px solid #4f81bd; margin:0; width:auto !important; width:100%; overflow:auto; text-align:left; font-size:12px; font-family: "Courier New","Consolas","Fixedsys","BitStream Vera Sans Mono", courier,monospace,serif} .codearea pre{ color:black; line-height:18px; padding:0 0 0 12px !important; margin:0em; background-color:#fff !important} .linewrap pre{white-space:pre-wrap; white-space:-moz-pre-wrap; white-space:-pre-wrap; white-space:-o-pre-wrap; word-wrap:break-word; word-break:normal} .codearea pre.alt{ background-color:#f7f7ff !important} .codearea .lnum{color:#4f81bd;line-height:18px}
到处,本文完成。
版权声明:
本Blog内的所有文章如非特别注明,版权均归作者个人所有,任何外部引用或摘抄请注明原文地址,未经作者授权不得用于任何以营利目的的行为,谢谢合作!
-------------------------------------------------------------------------------------------------------------------
- 多语言资源文件编辑插件:
- 此插件支持VS2005,2008,2010
- 和VS接合紧密,使用多语言资源文件的编辑非常简单
- 减少你多语言开发时的工作量
- 下载地址:工具下载
-------------------------------------------------------------------------------------------------------------------
多语言软件开发之new CultureInfo(“”)与CultureInfoCreateSpecificCulture(“”)的异同相关推荐
- 《高质量程序设计指南——C/C++语言》第1章 高质量软件开发之道
第1章 高质量软件开发之道 本书的第1章之高质量软件开发之道,作者用大量的篇幅介绍了"软件质量"的基本概念,解释了软件质量的十大属性.这十大质量属性又分为功能性和非功能性两类,功能 ...
- 浅谈嵌入式MCU软件开发之S32K1xx系列MCU启动过程及重映射代码到RAM中运行方法详解
内容提要 注:本文摘自NXP工程师胡恩伟的微信公众号"汽车电子expert成长之路",大家感兴趣可以关注一下. 引言 1. S32K1xx系列MCU启动过程详解(startup_S ...
- android软件开发之webView.addJavascriptInterface循环渐进【二】
说明 文章列表 android软件开发之webView.addJavascriptInterface循环渐进[一]: http://www.sollyu.com/android-software-de ...
- Android软件开发之TextView详解(六)
Android软件开发之TextView详解 雨松MOMO原创文章如转载,请注明:转载自雨松MOMO的博客原文地址:http://blog.csdn.net/xys289187120/article/ ...
- 图片轮播c语言,IOS开发之UIScrollView实现图片轮播器的无限滚动
IOS开发之UIScrollView实现图片轮播器的无限滚动 简介 在现在的一些App中常常见到图片轮播器,一般用于展示广告.新闻等数据,在iOS内并没有现成的控件直接实现这种功能,但是通过UIScr ...
- 软件开发详细设计说明书_汽车软件开发之ASPICE系统需求过程组
点击蓝字 关注我们 汽车电子软件开发流程 和朋友交流时,被问到是什么行业时? 我:汽车电子软件开发. 朋友:那你认为什么开发语言是最好的呢? 我:.......Matlab.ASCET? 朋友:gun ...
- 三十年软件开发之路:老码农的自我修养!
[CSDN编者按]"千帆过尽仍少年",对于程序员来说,保留技术初心.不断提升实力是夯实自己的不二法则.而本文的作者,作为一名有着三十多年开发经验的"老"程序员, ...
- 浅谈嵌入式MCU软件开发之startup过程详解(从复位向量到main函数之前的准备工作)
引言 一般工程师都怕研究MCU的startup过程,其原因可能有:1.觉得没有必要,startup的过程和启动代码在新建工程时,并且已经默认加入并配置好,能够保证MCU正常工作,只要关系main()函 ...
- 从易经中看软件开发之道
<易经>是阐述天地世间关于万象变化的古老经典,是博大精深的辩证法哲学书. 老祖宗留下的东西,保罗万象,自然不会漏掉软件开发这个行当的. 从软件开发者角度去看易经,其实就是一个高层级的软件架 ...
最新文章
- SolidEdge 工程图中如何标注尺寸公差
- 助力AI腾飞,深度学习走向何方?
- tf.arg_max
- 2019b官方手册中文版_数据科学|「最全」实至名归,NumPy 官方早有中文教程,结合深度学习,还有防脱发指南...
- intellij idea 如何将普通项目转换为maven项目
- monotouch在ipad中的实例应用--显示图像和文字
- Spring Data JPA 从入门到精通~@EntityListeners注解示例
- java写的学生信息查询系统_Java编写学生信息查询系统,报错!!!
- 二进制分类(信息学奥赛一本通-T1412)
- 一统江湖的大前端(1)——PPT制作库impress.js(含附件)
- ASP.NET AjaxPro的应用 .AjaxPro使用中“XXX未定义”的一种解决方法(转载的)
- spring.net与OracleODP结合时发生的版本问题
- 操作系统(六) 进程同步
- SNMP 模拟器 vxsnmpsimulator 使用方法
- BugKidz专版NBSI
- 在launcher中隐藏app图标
- 弘玑Cyclone上榜36氪中国超自动化先锋企业
- 区块链应用 | 高盛报告深度解读:区块链在未来的5大应用
- PL2303HXD驱动
- Python 之 如何一行输入多个整数
热门文章
- 【java学习】 面向对象编程+java购物车系统
- 酷我音乐linux版本,酷我音乐盒的 Gtk/Linux 实现 – v2.5 版本发布
- 让docsify-katex支持化学公式mhchem扩展
- python numpy 实现与(and),非与(not),或(or),异或(xor)逻辑运算!
- 《算法笔记》第4章常用技巧及排序算法
- ps中常用模糊的区别
- Mysql视图和触发器
- 基于QUIC 协议的HTTP/3
- ulpfec,flexFec,Pro-MPEG cop3协议对比
- 蛇形矩阵之逆时针矩阵