Chinaunix首页 | 论坛 | 博客
  • 博客访问: 308333
  • 博文数量: 40
  • 博客积分: 1
  • 博客等级: 民兵
  • 技术积分: 670
  • 用 户 组: 普通用户
  • 注册时间: 2011-07-31 11:19
个人简介

从事银行核心系统设计开发的程序猿

文章存档

2019年(1)

2018年(4)

2017年(11)

2016年(6)

2015年(18)

分类: 信息化

2015-06-18 07:22:37

*多语言与多环境


系统对多语言的支持,这在某些情况下,也是非常有用的,例如将核心系统部署为海外分行系统。通常情况下,海外系统独立搭建,操作人员部分是当地人员,也可能有派驻人员。同一套环境的多语言随时切换,其实并不存在实际场景,因为数据表内容存放,只会按照一个语言标准。举个例子,核心系统的户名地址等字段,是根据系统所在国家设语言,存放成不同文字,比如中文,而这些字段都会在输入输出中展示。因此,即使是将用户环境和操作界面切换成英文环境,字段内容仍会出现中文。另外,多语言不应额外增加处理的负担。
于是,系统的多语言,就分为两个方面。一是这套系统是否可以轻松做到转向其他语言的翻译,即如何作为一套海外系统部署。二是当系统后台维护人员运行工具时,如果能根据用户做到参数说明和输出展示的语言选择,尽可能符合本地人员和派驻人员的习惯。下面以中文(默认)和英文(辅助)为例,总结一下做法。


数据表部分,对于不同国家的版本,将各数据存放对象的CCSID设置为相应国家语言代码,如中文则为1388。
应用程序部分,区别在于返回报文的某些字符串字段内容语言不同。这些字段的数据来源,除了数据库中直接记录的字段,还可以在应用程序中拼接而成,比如出错信息。核心系统使用了错误信息表,在RPG程序中做错误信息的拼接组装。例如,“EIOER”错误代码内容为“接口&1字段&2值&3不正确”。其中&1,&2,&3由应用程序字符串代入。因此,应用程序中,全部将文本定义成命名为C_MGXXXX的常量。制作其他语言版本时,只需翻译所有C_MG常量,错误信息表和文件的中文描述即可(因为某些错误信息,会拼接表的中文信息,例如:更新表&1失败,&1为PF的中文描述活期分户账,如何获取在统一错误处理部分详细介绍)。
工具部分,就需要考虑操作用户不同时的语言不同了。AS400为CMD提供了多语言提示文件的方法,但CMD只是发起命令界面,执行程序的过程显示就没有办法了。因此换了一种做法,将工具的CMD,PGM等分多套语言版本编译到不同的目标库中。如XXXOBJMON放置默认的中文工具程序,XXXOBJMONE放置辅助的英文版本程序。然后通过用户USRPRF的初始化程序不同,来指定LIBL中的先后顺序,达到执行的不同语言版本的效果。


下面是中文语言习惯的用户USRPRF初始化程序。

  1. PGM
  2. INCLUDE SRCMBR(CLHD) SRCFILE(DSCPPGM)
  3. DCL VAR(&PFX) TYPE(*CHAR) LEN(3)
  4. DCL VAR(&JRN) TYPE(*CHAR) LEN(10)
  5. DCL VAR(&JRNLIB) TYPE(*CHAR) LEN(10)
  6. DCL VAR(&OTHLIB) TYPE(*CHAR) LEN(10)
  7. CALL PGM(GETPREFIX) PARM(&PFX)
  8. CHGVAR VAR(&JRN) VALUE(&PFX *CAT 'JRN')
  9. CHGVAR VAR(&JRNLIB) VALUE(&PFX *CAT 'SYSJRN')
  10. CHGVAR VAR(&OTHLIB) VALUE(&PFX *CAT 'OBJOTH')
  11. CHGSYSLIBL LIB(QSYS2989)
  12. CHGCURLIB CURLIB(&OTHLIB)
  13. STRCMTCTL LCKLVL(*CHG) CMTSCOPE(*JOB) +
  14. DFTJRN(&JRNLIB/&JRN)
  15. MONMSG MSGID(CPF8351)
  16. ENDPGM


下面是英文语言习惯的用户USRPRF初始化程序。注意在OBJMON前会先搜索OBJMONE。

  1. PGM
  2. INCLUDE SRCMBR(CLHD) SRCFILE(DSCPPGM)
  3. DCL VAR(&PFX) TYPE(*CHAR) LEN(3)
  4. DCL VAR(&JRN) TYPE(*CHAR) LEN(10)
  5. DCL VAR(&JRNLIB) TYPE(*CHAR) LEN(10)
  6. DCL VAR(&MONLIB) TYPE(*CHAR) LEN(10)
  7. DCL VAR(&ENULIB) TYPE(*CHAR) LEN(10)
  8. DCL VAR(&OTHLIB) TYPE(*CHAR) LEN(10)
  9. CALL PGM(GETPREFIX) PARM(&PFX)
  10. CHGVAR VAR(&JRN) VALUE(&PFX *CAT 'JRN')
  11. CHGVAR VAR(&JRNLIB) VALUE(&PFX *CAT 'SYSJRN')
  12. CHGVAR VAR(&MONLIB) VALUE(&PFX *CAT 'OBJMON')
  13. CHGVAR VAR(&ENULIB) VALUE(&PFX *CAT 'OBJMONE')
  14. CHGVAR VAR(&OTHLIB) VALUE(&PFX *CAT 'OBJOTH')
  15. ADDLIBLE LIB(&ENULIB) POSITION(*BEFORE &MONLIB)
  16. CHGCURLIB CURLIB(&OTHLIB)
  17. STRCMTCTL LCKLVL(*CHG) CMTSCOPE(*JOB) +
  18. DFTJRN(&JRNLIB/&JRN)
  19. MONMSG MSGID(CPF8351)
  20. ENDPGM


其中,GETPREFIX程序,是获取当前应用环境。系统在一台机器上可以部署多套环境,以前三位环境代码区分。所有的库名前三位即为环境代码,用户登录时,就可以根据LIBL的设置,对应到相应环境。应用程序编写时,尽量使用*LIBL查找目标,如果确需指定库名,则先调用GETPREFIX,根据用户USRPRF的初始化程序所在库前三位,获得环境代码。

  1. PGM PARM(&PREFIX)
  2. INCLUDE SRCMBR(CLHD) SRCFILE(DSCPPGM)
  3. DCL VAR(&PREFIX) TYPE(*CHAR) LEN(3)
  4. DCL VAR(&PGMLIB) TYPE(*CHAR) LEN(10)
  5. RTVUSRPRF INLPGMLIB(&PGMLIB)
  6. CHGVAR VAR(&PREFIX) VALUE(%SST(&PGMLIB 1 3))
  7. ENDPGM


阅读(2633) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~