很多时候,一款软件不仅仅只是一套语言环境,如果针对不同国家的人,各写一套软件来发布,明显不现实。
如何实现多语言呢?我相信看完这篇文章后,一定会对你有所帮助.

全球化过程力图确保您的应用程序可以处理来自不同文化的数据。它可能会非常简单,如确保您的日历标题足够宽以便能够处理夏威夷月份名称,或者使用您的用户所期望的负数格式。

全球化不同于本地化,后者实际上是将应用程序的资源翻译为不同的语言。即使只使用一种语言,您的应用程序也需要考虑全球化问题。

CultureInfo 对象是使用某种特定文化标识符创建的。例如,为了创建一个在中国区域设置中使用时包含有关中国区域设置信息的对象,您会在构造函数中指定名称 "zh-ch"。Framework 包括许多有关文化的信息,Windows 还包含用于各种区域设置的数据。除此之外,用户还可以创建他们自己的自定义文化。

如果您打算将您的应用程序本地化为多种语言,具体该怎么办?此过程可能涉及 System.Globalization 中处理的所有数据显示功能,以及应用程序各个部件的翻译。您可能还打算针对不同的文化显示不同的图像。为此,您可以制作应用程序的多个副本,每个都对应一个本地化目标语言。

Framework 提供了一种方法,它可以通过 System.Resources 命名空间中的某些类来提取这些可本地化的资源。用于创建、读取和使用这些资源的主类分别是 ResourceWriter、ResourceReader 和 ResourceManager。

ResourceReader 类允许您枚举资源文件中成对的名称/值。但是,最常见的工作通常是针对某一特定文化来查找特定的资源。这是通过 ResourceManager 类实现的。您可以使用 GetObject 和 GetString 方法访问单独的资源,或者也可以使用 GetResourceSet 方法将某一特定文化的所有资源加载到 Hashtable 中。

在下面的Demo中,将列出目前设备中所支持的语言。然后选择一个语言后,界面会根据选择的语言进行转换。

程序运行后的效果:

当我选择"en-us",点Menu下的Change Language后,窗体的Title已发生变化了。

当我选择"zh-cn",同样操作,也发生变化。

这就是多语言的效果。在实际项目中,可以根据当前UI的语言来取得最初的语言资源。用户也可以在运行中随意切换相应的语言。

具体实现:

1 //从ListBox中取得选择的语言名
2 CultureInfo cInfo = CultureInfo.GetCultureInfo(this.listBox1.SelectedItem.ToString());
3 //通过资源管理器来取得资源,SmartDeviceProject5资源文件中对应的命名空间,Form1表示资源文件名
4 ResourceManager rm = new ResourceManager("SmartDeviceProject5.Form1", Assembly.GetExecutingAssembly());
5 this.Text = rm.GetObject("Form1.Title", cInfo).ToString();

看一下,我的工程中的资源文件:

Form1.zh-cn.resx和Form1.en-us.resx表示2个不同的资源文件,zh-ch表示中文,en-us表示英文。ResourceManager会自动去匹配当前语言所需要的资源文件的。

最后,介绍一个小应用。在.net cf中,是无法取得机器上的所有的资源信息的。只有通过API来取得。
调用EnumSystemLocales来取得资源文件。

private const int LCID_INSTALLED = 0x01;
private delegate int EnumLocalesHandler(string lpLocaleString);
private static EnumLocalesHandler m_localesDelegate;
private static List<CultureInfo> m_cultures;

private void Form1_Load(object sender, EventArgs e)
{
    m_cultures = new List<CultureInfo>();
    m_localesDelegate = new EnumLocalesHandler(EnumLocalesProc);

IntPtr fnPtr = Marshal.GetFunctionPointerForDelegate(m_localesDelegate);
    int success = EnumSystemLocales(fnPtr, LCID_INSTALLED);

for (int i = 0; i < m_cultures.Count; i++)
    {
        if (m_cultures[i].Name != "")
            this.listBox1.Items.Add(m_cultures[i].Name);
    }
}

private static int EnumLocalesProc(string locale)
{
    try
    {
        m_cultures.Add(CultureInfo.GetCultureInfo(int.Parse(locale, NumberStyles.HexNumber)));
    }
    catch
    {
        // failed for this locale - ignore and continue 
    }

return 1;
}

[DllImport("coredll", SetLastError = true)]
private static extern int EnumSystemLocales(IntPtr lpLocaleEnumProc, uint dwFlags);

EnumSystemLocales会遍历取得所有的语言,通过定义委托的方式,来一个个加入到List中。

运行环境:VS2008

代码下载:InternationalDemo.rar

Author:AppleSeeker(冯峰)
Date:2009-01-20

文章导读:移动开发索引贴

转载于:https://www.cnblogs.com/appleseeker/archive/2009/01/20/1379044.html

.Net Compact Framework 基础篇(10)--多语言程序的定制相关推荐

  1. 拼题A基础篇 10 统计字符

    拼题A 基础篇 统计字符 #include<stdio.h> #include<math.h> main() {int letter = 0, blank = 0, digit ...

  2. C语言基础专业书,C语言程序设计基础

    C语言程序设计基础 (2017年清华大学出版社出版的图书) 编辑 锁定 讨论 上传视频 <C语言程序设计基础>是2017年清华大学出版社出版的图书,作者是贾学斌.宋海民.胡大威. 书    ...

  3. c语言基础程序设计报告,c语言程序设计基础课程设计报告.doc

    c语言程序设计基础课程设计报告.doc 还剩 16页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价低环保! 内容要点: C 语言程序 ...

  4. Python Qt GUI设计:QMainWindow、QWidget和QDialog窗口类(基础篇—10)

    目录 1. QMainWindow窗口 2.QWidget窗口 3.QDialog窗口 3.1.QMessageBox窗口 3.2.QInputDialog窗口 3.3.QFontDialog窗口 3 ...

  5. 02、老徐教你学C语言基础篇2——C语言摩拳擦掌齐上阵(环境篇)——理论

    工欲善其事必先利其器 君欲学语言必先熟其境 C语言的语法.理论前面我们有了一定的了解,但是看书永远看不出一个程序员,再好的武功秘籍没经过10数年的敲打也不可能成为绝世高手,段誉毕竟是少数,我们还是老老 ...

  6. Java多线程系列--“基础篇”10之 线程优先级和守护线程

    概要 本章,会对守护线程和线程优先级进行介绍.涉及到的内容包括: 1. 线程优先级的介绍 2. 线程优先级的示例 3. 守护线程的示例 转载请注明出处:http://www.cnblogs.com/s ...

  7. java基础篇(10) 可变参数列表介绍

    一.可变参数简介 在不确定参数的个数时,可以使用可变的参数列表. 1. 语法: 参数类型-(三个点) 例如: void printArray(Object-) 注意: 每个方法最多只有一个可变参数,因 ...

  8. 扇贝编程python学习笔记-基础篇10

    聚沙成塔 集腋成裘 文章目录 第十二关 1.列表元素的删除 2.列表分片 3.列表常用方法 4.练习 第十二关 知识点复习 学习用时:50min 随堂测验+上机作业:50min 随堂作业正确率:2/3 ...

  9. uniapp基础篇 - - 实现APP语言国际化

    文章目录 一.今日实战目标 二.实战步骤 1. 引入库 2. 创建相关文件 文件源代码 3. 编辑main.js文件 4. 在页面中使用 5. 切换语言的方法 总结 提示:该项目只用于个人实战,不应用 ...

最新文章

  1. http://www.shanghaihaocong.com-WORDPRESS开发的企业主题站
  2. 8月第3周回顾:四巨头发三大新闻 一报告引多家争议
  3. 人工智能领域最重要的10大里程碑:AlphaGo征服世人
  4. python 打包egg_将Python程序打包到egg或WHL安装包或exe包中,把,python,成,或者,whl
  5. day18 17.c3p0连接池使用
  6. redis数据库价格_阿里云数据库Redis购买流程
  7. 洛谷P4364 [九省联考2018]IIIDX(线段树)
  8. 【渝粤题库】广东开放大学 社交礼仪 形成性考核
  9. 太突然!多所高校永久关闭
  10. java 验证码 添加背景图_java登陆界面怎么加背景图 会的我加你
  11. C++ opengl 学习笔记-在OpenGL入门级代码里面glLoadIdentity的理解
  12. 【C语言】scanf()输入浮点型数据
  13. 深入分析Kubelet Bootstrap Checkpoint
  14. 文件对比软件Beyond Compare提示文件禁止编辑的解决方法
  15. 在MFC中的socket编程
  16. 直播视频秒开及视频优化
  17. 软件学报zotero文献格式
  18. 获取素材列表返回40004 invalid media type !(大坑)解决办法
  19. Android上的滤镜效果
  20. 设计模式(十):模板方法模式

热门文章

  1. linux基本命令示例_Linux正常运行时间命令示例
  2. 如何在Ubuntu 18.04上设置Apache虚拟主机
  3. Android DialogFragment
  4. 迅捷cad_迅捷协议
  5. LiteSpeed Web服务器“恢复所有侦听器”解决方法
  6. 非基元类型数据结构_Java数据类型–基元和二进制文字
  7. C# 编译的DLL文件在其他项目中调用时,看不见注释
  8. oracle--Tracing PL/SQL subprogram calls with parameters values--Mahmoud Hatem,
  9. shell监控脚本-监控mysql 主从复制
  10. 时间序列数据的存储和计算 - 开源时序数据库解析(一)