最近在做一个多语言的项目,感想颇深,写出来与大家分享。

首先抱怨一下,谁让这个程序是Delphi的呢,用C#或者Java写根本不会有那么多问题,唉......

1.现状

Delphi直到2007才支持Unicode,但是事实是大部分的Delphi程序依然用Delphi6 & Delphi7编写。 指望通过Unicode来解决问题还是有相当难度的,要考虑的问题太多。

如果是简单的多语言界面支持,难度就小了很多,目前有很多比较成熟的框架可以借鉴,解决方案大致分为三种,这里不详述了。

第三方的技术框架提供了一种解决思路,但是更大的工作量体现在代码的重构与规范中。因为以前编写的Delphi代码由于没有考虑到多语言支持,在上了多语言框架后会有很多问题,因此需要规范此类代码。

2.技术方案

1)最近我做的项目用的是CnPack的多语言框架,这个框架可以解析Delphi的dfm文件,从而将界面上所有可视化界面元素的字符串信息抽取出来,然后保存在文本文件中。另外,它提供了运行时遍历所有控件并更改控件字符显示的功能,因此我们只需要把注意力集中在翻译和其他一些特殊问题上就可以了。

2)字符串常量的处理

Cnpack抽取界面元素时无法处理字符串常量,因此需要将所有的resourcestring, string const, static string 全部变成 variable,并试用类似于 CnTranslationMgr.TransString(...)的调用在运行时为这些字符串赋值,从而使得这部分也能被翻译到。当然,字符串常量也需要在翻译的语言文件里添加。

3)执行机制

光有多语言翻译框架是不会让应用程序支持多种语言显示的,我们必须编写一些代码来完成这个任务。当一个窗体被创建时,它大部分的界面元素已经被创建了(动态创建的除外),最简单的办法是让所有的窗体从支持多语言的base form继承下来,或者调整让base form在其他基类之上。在Form的Loaded事件中加上CnTranslationMgr.TransForm(...)即可。对于字符串常量,在每个项目的开始加上TransConst函数即可。

4)字体问题

不同的语言有不同的默认字体,例如英文是Tahoma 8,中文是宋体 9。不过Cnpack已经支持了在语言文件中自定义字体格式,因此这个问题得以解决。

5)字符长度问题

不同的语言中单词的长度是不一样的,所以在设计界面时需要考虑到这点。通常需要将控件设置成左对齐或者右对齐,同时留出一定的空间(某些语言会比英文还要长,某些则很简短,比如说中文)以防止界面不美观。当然,最终还是需要做一些微调才可以。

6)字符集问题

由于Delphi程序不支持Unicode,所以某些语言需要特定字符集的支持,例如韩文,日文等。这个依赖于操作系统的设置,因此对客户系统环境提出的一些要求。

7)动态创建组件问题

上面所说的所有都是静态的界面元素,某些界面元素是动态创建的,这时就需要修改代码去支持多语言的显示。

至此,一个多语言程序基本已经完成了,虽然不是很完美,但是已经可以应付大多数的需要了。

3.缺点

这个方案也有一些缺点。

1)对动态创建组件的支持不够理想

2)语言文件维护比较复杂

Delphi程序之多语言支持相关推荐

  1. c 多语言切换dll,【图片】老C教学之——给你的程序添加多语言支持【dll】【vb吧】_百度贴吧...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 else if (iWhichLanguage == 1){ switch (num){ case 0: strcpy(str, "文件(&am ...

  2. android app支持多语言,支持多语言支持的Android应用程序

    本文中,我们将学习如何构建支持(国际化和本地化)多种语言的Android APP .语言在应用程序的整体界面中起着至关重要的作用,如果您可以添加更多语言,以便您可以支持更广泛的受众,那么语言就非常棒. ...

  3. PostgreSQL数据库之国际化语言支持学习总结

    目 录 学习参考书籍.网站或博文: PostgreSQL本国语言支持 官方文档,点击前往 GNU gettext官方文档 GNU gettext简介 PostgreSQL数据库之国际化语言支持学习总结 ...

  4. 关于DELPHI程序多语言支持的问题

    写DELPHI程序,是如何实现繁体化的?是如何开发英文版的?是通过外挂语言包吗? 我完整地说一下我的问题: 我写一个DELPHI程序,开发环境是是简体中文版本win xp系统+ Delphi 7的.现 ...

  5. Delphi 开发跨平台 Android / iOS 程序的多语言

    使用 Delphi 的 FireMonkey 框架,开发跨平台的程序,可以做到一个源码,编译成 Windows, Mac OS, Android, iOS,甚至是 Linux 上面运行的程序. 简单说 ...

  6. IOS APP 国际化 程序内切换语言实现 不重新启动系统(支持项目中stroyboard 、xib 混用。完美解决方案)

    IOS APP 国际化 程序内切换语言实现 不重新启动系统(支持项目中stroyboard .xib 混用.完美解决方案) 参考文章: (1)IOS APP 国际化 程序内切换语言实现 不重新启动系统 ...

  7. [UWP]针对UWP程序多语言支持的总结,含RTL

    原文:[UWP]针对UWP程序多语言支持的总结,含RTL UWP 对 Globalization and localization 的支持非常好,可以非常容易地实现应用程序本地化. 所谓本地化,表现最 ...

  8. 安装程序包的语言不受系统支持

    安装了一个虚拟机,在安装office2007/2003的时候会出现"安装程序包的语言不受系统支持"的提示,从而导致不能安装. 我的解决方案是: 1.写个文件,命名为1.reg,文件 ...

  9. 安装的计算机语言不受支持,win10提示安装程序包的语言不受系统支持解决方案...

    为了获得更好的体验,很多Windows10系统用户都会使用最新版本程序.不过,一些朋友在安装使用office2007后,却发现使用起来并不是很流畅,在准备卸载的时遇到了提示:安装程序的语言不受系统支持 ...

最新文章

  1. 解决IDEA快捷键 Alt+Insert 失效的问题
  2. android listview 中的checkbox,Android中ListView与CheckBox的使用,及问题解决
  3. 密码学系列之:memory-hard函数
  4. win10虚拟内存怎么设置最好_淘宝直通车时间段怎么设置?哪个时间段开最好?...
  5. dial up network
  6. Qt工作笔记-QSort的基本使用
  7. 手贱拆笔记本清灰记录
  8. Mybatis自动去重
  9. Unity入门——UI界面
  10. 苹果强制使用HTTPS传输后APP开发者必须知道的事
  11. java中根遍历后根遍历构造,恳求大佬指点!!!首先标明空子树的先根遍历序列建立一棵二叉树...
  12. JavaScript小记——Ajax异步请求
  13. 3.4 Docker最新入门教程-Docker入门-共享应用程序
  14. idea方法模板注释,完美解决param与return
  15. Vitamio使用篇,打造强悍的视频播放器
  16. 灵魂拷问!Mysql和Redis数据同步该怎么做?请查收
  17. 大型数据库设计原理实验1
  18. python安全开发-多线程目录扫描端口扫描子域名爆破dou瓣属性爬取
  19. 国内BI工具五巨头有哪些?各自有哪些擅长的?
  20. java 如何打开osk_如何通过程序(C++语言开发)去将osk隐藏或者关闭??

热门文章

  1. js禁止点击按钮(点击无效)
  2. python点到线段的最小距离
  3. 变化。。。。。随风而变
  4. 双色球彩票系统升级版
  5. 公司趣味运动会运动员代表发言稿
  6. java和js中替换字符串的方法
  7. 智能合约:从 Python 调用智能合约
  8. 山东专利申请快速通道流程
  9. 3D电影为何如此有魅力?重置版的《阿凡达》依旧让人疯狂
  10. Android系统操作的50个实用技巧