简介:这是一份面向OpenClinica开源临床数据采集(EDC)系统的多语言资源包,适合需要将系统界面本地化、开展跨国或多中心临床研究的系统管理员、数据管理人员及开发人员。压缩包共85个文件,包含83个properties格式的语言资源文件和2个txt说明文档,总计540KB;properties文件按admin、format、audit_events、workflow等界面模块分类,覆盖英语、中文、法语、德语、葡萄牙语等多种语言,能够满足系统菜单、按钮及提示信息等界面的本地化需求。目前已有640人学习下载。借助该语言包,使用者无需逐条翻译界面字符串,即可快速搭建本土化操作环境,降低非英语背景研究者的使用门槛,同时保证不同站点在统一术语下填写数据,对提升临床研究数据质量和协作效率有明显帮助。资源轻量、结构清晰,适合作为OpenClinica本地化部署的实用工具包。 做临床试验数据管理的人,应该对OpenClinica不陌生。这套开源的EDC(电子数据采集)系统功能确实能打,但有一个问题从入门第一天就跟着你——默认界面全是英文。项目组里的CRC、研究护士、甚至是部分审核老师,看到满屏的“Subject”“CRF”“Discrepancy”就头大。我自己第一次接触OpenClinica时,光给同事解释“Visit”和“Event”的区别就解释了一个下午。
后来趁着项目空闲,我花了两周时间把OpenClinica的语言包机制摸了一遍,做出了一套能用的中文语言包。这篇博文就把这段经历完整写出来,从语言包底层原理到实际部署、再到各种翻车现场,一次性讲透。如果你正准备给OpenClinica换中文界面,或者已经试过网上流传的Excel替换法但没成功,这篇文章应该能帮你少踩很多坑。
1. OpenClinica语言机制拆解:先搞清楚系统怎么加载语言
1.1 语言包的底层形态
OpenClinica基于Java技术栈,使用Spring MVC框架,它的国际化(i18n)机制是标准的Java ResourceBundle方案。简单来说,系统的所有界面文案都外置在properties文件中,这些文件按照功能模块分散在war包的特定目录下。
我以OpenClinica 3.1版本为例,语言资源文件放在以下路径:
OpenClinica.war/WEB-INF/classes/org/akaza/openclinica/i18n/这个目录下你会看到一类文件:openclinica.properties(核心页面文案)、extract.properties(数据导出模块)、admin.properties(管理后台)、rules.properties(规则引擎)等。每个文件内部是标准的键值对,比如:
subject_table_subject_name=Subject Name subject_table_subject_name_folded=Subject Name viewing_subject_details=Viewing Subject Details当系统检测到浏览器的Locale是en_US时,就读取这些默认英文文件;当Locale是zh_CN时,会尝试加载同名的openclinica_zh_CN.properties文件。如果找不到对应语言的资源文件,Java的ResourceBundle机制会自动回退到英文默认值。
知道了这个原理,事情就简单了。所谓“中文语言包”,本质上就是一套翻译好的*_zh_CN.properties文件,放进正确的目录,然后让系统在中文环境下加载它们。
1.2 中文语言包的两种构建思路
网上关于OpenClinica汉化的帖子不少,但很多是零散经验,甚至有些已经过时。我梳理了目前实际可用的两条路线:
- 替换法:直接修改
openclinica.properties等文件的value值,把英文换成中文,重新打包war或覆盖解压目录中的文件。优点是简单直接,缺点是一旦升级OpenClinica版本,所有修改都会被覆盖,维护成本高。 - 新增法:保留原英文文件不动,额外创建
*_zh_CN.properties翻译文件。这样做的好处是语言包和系统解耦,升级时只需重新放入语言包文件,不污染原始配置。
我最终选择的是新增法。理由很实际:OpenClinica社区版更新频率不算快,但一旦官方发新版,war包整体替换是必然的。如果用替换法,每次升级都得重新做一遍翻译;用新增法,把语言包文件放在独立目录,升级后重新放一次就行。
这里补充一个关键认知:不要试图翻译数据库里存的内容。OpenClinica中,CRF表单本身的内容(如题目标签、选项文本)是存在数据库里的,语言包管不到这部分。语言包只覆盖系统框架层的界面文案,比如菜单、按钮、提示消息、表格列头等。CRF表单的汉化需要单独在表单设计层面处理,这是两套体系。
2. 构建中文语言包的完整操作流程
2.1 方案一:Excel批量翻译法
我一开始采用的方案,也是网上流传最广的方法:导出所有英文properties内容,用Excel批量翻译,再转成Java支持的编码格式。具体步骤如下:
第一步:提取所有待翻译条目
从war包中解压出所有*.properties文件,以openclinica.properties为例,用脚本统计条目数。我当时统计下来,核心模块大约有2400多条,加上admin、rules、extract等模块,总计接近4000条。这个量级靠人工逐个翻译不现实,必须用工具辅助。
第二步:Excel中批量翻译
我把properties文件导入Excel,保持“key | 英文原文 | 中文翻译”三列结构。翻译环节我用的是“机器翻译初稿 + 人工校对”的组合方式。先批量调用翻译接口生成初稿,再逐条校对专业术语。这里特别提醒:机器翻译在普通界面文案上效果可以接受,但在涉及临床试验的术语上必须人工干预。比如“Discrepancy”不能翻译成“差异”,在EDC语境下应翻译为“质疑”;“Query”不是“查询”而是“质疑记录”;“SDV”要保留英文缩写并注释为“源数据核查”。
第三步:转码与文件生成
这一步是最大的坑。Java的properties文件默认使用ISO-8859-1编码,不能直接保存中文。需要将中文内容转换为\uXXXX格式的Unicode转义序列。我使用Java自带的native2ascii工具完成转换:
native2ascii -encoding UTF-8 openclinicasrc.properties openclinica_zh_CN.properties转换完成后,打开文件检查一下,中文内容应该全部变成类似\u4e3b\u9898的格式,每条键值对仍然保持key=value结构。
2.2 方案二:UI直译与数据库扩展
Excel批量翻译适合一次性处理大量文案,但OpenClinica的部分模块(如admin.properties、rules.properties)更新频率不同,而且系统管理界面还有一些动态提示消息存于数据库。这些内容Excel法覆盖不到。
我在实际操作中做了两件事处理剩余部分:
- 管理后台的翻译:OpenClinica的管理员界面本身没有开放语言管理入口,但可以通过直接翻译
admin.properties、datainfo.properties等文件来实现。这部分内容量不大(大约300条),我放在第二步处理,避免影响主流程。 - 确认locale选项:打开
system.properties或datainfo.properties,查找localeOptions参数。系统默认只启用en_US,要让中文出现在语言切换列表中,需要增加一项zh_CN。我用UTF-8编码直接编辑该文件:
localeOptions=en_US,zh_CN如果不做这一步,即使语言包文件放好了,界面上也没有切换中文的入口。很多朋友反馈“语言包装了但没反应”,八成是漏了这个参数。
3. 部署与验证:从替换文件到清理缓存
3.1 打包与替换细节
我的运行环境是Tomcat 8 + OpenClinica 3.1,war包部署模式。语言包文件的替换有两种方式,原理不同,效果一样。
方式一:直接替换解压目录
Tomcat启动时会把war包解压到webapps/OpenClinica/目录。直接修改该目录下对应位置的properties文件,重启Tomcat就生效。这种方法适合快速验证,但Tomcat在重新部署war包时会覆盖这些修改。
方式二:重新打包war
将解压后的目录中WEB-INF/classes/org/akaza/openclinica/i18n/下的语言包文件更新后,用jar命令重新打包:
jar cvf OpenClinicaNew.war -C extracted_OpenClinica_dir/ .实际部署时,我推荐方式一。原因很简单:war包打包过程容易漏文件或产生路径问题,而直接修改解压目录是最直观、最方便定位问题的。正式环境建议先备份原始properties文件,再执行覆盖操作。
3.2 系统参数与语言切换验证
语言包文件放好并重启后,还需要在系统内验证两件事。
第一,登录OpenClinica,点击右上角用户菜单,确认“Locale”或“Language”下拉框中出现了“中文(简体)”选项。如果没有出现,大概率是localeOptions参数未正确配置,或者Tomcat启动时读取的配置文件路径不是你以为的那个。
第二,切换语言后,分别访问以下核心页面检查翻译效果:
- 登录页(Login)
- 患者列表(Subject List/View)
- CRF填写页面(Enter Data)
- 质疑管理(Discrepancy Management)
- 数据导出(Extract Data)
- 管理控制台(Administration)
我当时的验证结果是,核心页面90%以上的文案成功显示中文,剩余未翻译的内容主要集中在个别旧版本遗留的硬编码字符串(比如某些弹窗提示在Java代码中直接以英文写死,不走资源文件)。
提示:启动Tomcat时如果看到类似
MissingResourceException: Can't find bundle for base name org.akaza.openclinica.i18n.openclinica, locale zh_CN的日志,说明文件命名或放置路径有问题,系统没找到你的中文资源文件。检查文件名是否带_zh_CN后缀、是否在正确的包目录下。
4. 常见问题与排查技巧实录
4.1 中文显示成乱码
这是最常见的翻车点。我最初用系统自带的“另存为”直接修改properties文件,结果所有中文在界面上变成???或䏿–‡。原因前面提过:Java的properties文件不认UTF-8直接写的中文,必须用\uXXXX转义。
排查方法很简单,用文本编辑器打开语言包文件,如果看到的是直接的中文字符,而不是\u4e2d\u6587格式,那就有问题。正确做法是用native2ascii转换,或者在IDE(如IntelliJ IDEA)中设置properties文件的默认编码为ISO-8859-1或Transparent Native-to-ASCII conversion,让IDE自动转换。
4.2 语言包不生效或切换失效
有朋友遇到过:文件放置正确、重启了服务,但界面还是英文。这种情况先看Tomcat日志,有没有读取到_zh_CN文件加载记录。如果日志中完全没有中文包加载信息,检查以下几点:
- 文件名是否完全匹配,比如
openclinica_zh_CN.properties,注意大小写和下划线位置 - 文件是否放到了正确的类路径目录下,不是war包解压后的根目录,而是
WEB-INF/classes/下对应包结构的目录 localeOptions中的语言代码是否与文件名中的locale一致
还有一个隐蔽问题:Tomcat有自己的缓存机制,有时文件已经更新,但运行时读取的是缓存中的旧内容。这种时候不能只靠重启Tomcat,要清理work/Catalina/localhost/OpenClinica/下的缓存目录,再重启。
4.3 数据库消息与页面标题的漏网之鱼
OpenClinica中有不少提示消息是运行期从数据库读取的,比如规则触发的提醒消息、某些系统通知。这部分内容不经过语言包机制,所以你会发现界面大部分已经变成中文,但某些提示仍然显示英文。
我的处理办法是直接更新数据库中的对应记录。以PostgreSQL为例:
UPDATE notification_table SET message = '您有一条新的质疑记录需要处理' WHERE message = 'You have a new discrepancy to review';但这里强调一定要谨慎。操作前先备份数据表,确认你要改的字段是显示文案,而不是业务逻辑标识。临床数据系统最怕改错数据,宁可多查几遍。
4.4 升级与迁移时的语言包保留策略
OpenClinica版本升级,war包替换后,之前手改的一切都会恢复原样。我的建议是建立一个独立的languagepack/目录,里面存放所有*_zh_CN.properties文件,同时写一个简单的部署脚本,升级后自动复制到目标目录:
cp -r ./languagepack/*.properties /usr/local/tomcat/webapps/OpenClinica/WEB-INF/classes/org/akaza/openclinica/i18n/这套做法虽然简单,但能保证语言包不随升级丢失。
还有一个容易混淆的概念需要提醒。如果你用OpenClinica做的是真实临床试验项目,并且涉及CRF附件或图片文字的OCR识别需求,网上搜到的tess4j语言包和这套OpenClinica界面语言包完全不是一回事。Tess4j是OCR引擎的语言包,用于识别扫描件中的文字,不要混用,两者的配置路径和依赖关系都不相同。
5. 多语言包管理与自动化部署建议
如果你所在机构的OpenClinica用户不只是中文使用者,比如总部要求同时支持英文、日文、法文,那么单纯做一套中文语言包就不够了。这时候需要建立一套可维护的多语言包管理流程。
我的实践思路是:为每种语言建立一份独立的翻译文件,所有语言包统一纳入版本控制(Git),翻译条目以英文为基准,中文和日文等作为分支维护。每次OpenClinica版本升级后,先对比新版英文properties与旧版的差异,只翻译新增或变更的条目,而不是整套重翻。这一步可以借助Beyond Compare之类的文件对比工具,或者写脚本提取diff条目。
部署时,我写了一个基于Shell的自动部署脚本,核心逻辑如下:
#!/bin/bash # 将语言包复制至Tomcat解压目录 I18N_DIR=/opt/tomcat/webapps/OpenClinica/WEB-INF/classes/org/akaza/openclinica/i18n LANG_PACK_DIR=/data/languagepack/current if [ -d "$I18N_DIR" ]; then cp -r "$LANG_PACK_DIR"/*.properties "$I18N_DIR"/ echo "语言包复制完成,请重启Tomcat" else echo "未找到OpenClinica目录,请确认路径" exit 1 fi脚本会先检查目标目录是否存在,避免在Tomcat尚未解压war包时误操作。部署后统一重启,并检查日志确认语言包加载成功。
提示:不要直接用root账号修改应用目录文件,建议单独创建部署账号,并限制权限范围。修改Tomcat目录文件前一定要备份,这是临床应用系统的基本纪律。
6. 实际操作中的关键心得体会
写到这里,把我在这个过程中最有价值的几个经验沉淀一下,希望后来者少走弯路。
第一个心得:做OpenClinica语言包,前期先理清范围比直接开干重要得多。语言包只能覆盖框架层的系统文案,CRF表单内容、数据库动态消息都不在范围内。如果你一开始就抱着“全汉化”的目标去做,很容易会在某个页面发现永远有漏网的英文,然后陷入无休止的修补中。我的建议是先把范围划分为“核心框架文案必须覆盖”和“数据库动态内容按需处理”两层,优先搞定第一层,评估上线效果后再推进第二层。
第二个心得:不用追求一次性完美翻译所有条目。OpenClinica的properties文件中还有一部分只在极少数管理操作中出现的调试文案,实际用户根本看不到。按重要性分级,先把高频主路径(登录、患者管理、CRF填表、质疑处理、导出)翻译到位,低频管理日志后续再补,完全不耽误系统上线。我的实际数据是:核心高频条目约1500条,低频/隐藏条目约2000+条,前者翻译校对花了3天,后者用机器翻译加抽检处理的。
第三个心得:建立翻译术语表很重要。临床试验数据管理涉及大量专业术语,同一个英文单词在系统不同模块可能需要不同翻译。比如“Event”在访视管理场景下翻译为“访视”,在审计日志中翻译为“事件”,不能一刀切。我在翻译开始前先整理了项目组常用的中英文术语对照表,和医学同事确认了重点术语的规范译法,这比翻译到三分之一时再回头改术语要高效得多。
如果你所在团队正在筹划OpenClinica中文化,希望这篇实操笔记能帮上忙。语言包本身做起来并不神秘,核心就三件事:搞清楚Java资源文件的加载机制、用正确编码生成翻译文件、验证并维护好部署流程。这三件事做完,基本就稳了。剩下的功夫,都在术语准确性和长期维护的细节里。
本文还有配套的精品资源,点击获取