|
|
这两年给国内小团队做工具产品,前端选型五花八门,但后台和桌面工具里,依然能见到易语言的身影。说到“多语言界面国际化”,很多人第一反应是“易语言不适合做这个”。真不至于。我的经验是:只要把“资源抽离”“加载时机”“格式一致”这三个环节打通,易语言同样能做出稳定、可维护的多语言界面。
先说原则。国际化不是把中文替换成英文那么简单,它是“把文案和界面逻辑解耦”。易语言项目里,最容易踩的坑是把字符串硬编码在窗口、菜单、信息框里。等需要上多语言时,只能全局搜一遍替换,注定崩溃。正确做法是:初始化阶段加载语言包,界面元素只存“键”,展示时按键取值。这样做的回报是长期维护成本直线
下降,团队新人也能快速接手。这里的“键”建议采用可读性强的命名,比如 Win.Main.Menu.File,而不是一串编号。长远看,命名就是协作契约。
资源抽离有几种实现路线。最“土法”的是用 ini/CSV 文本文件做语言包,启动时读入字典;更稳健的是 JSON,因为层级和转义更友好;如果你愿意引入外部库,还可以读取标准的 PO/MO,但这在易语言里集成成本略高。我的折中方案是:开发期用 JSON,打包时配套一份简易的校验脚本,确保每个键在所有语言里都存在。工具随手写,哪怕是用 Python 一百行,也能救命。
加载时机是第二个关键。桌面程序常见两个姿势:一是冷启动时加载当前系统语言;二是在“设置-语言”里即时切换。我更推荐前者为主、后者为辅。前者简单可靠;后者要做全局刷新,易语言的窗口控件冗杂,事件又多,容易遗漏。我的做法是:切换语言后不强刷控件,而是提示“重启后生效”;真的要即时生效,就把所有窗口文本更新封装到一个 RefreshUI(LanguageDict) 的过程里,遍历控件树,统一重绘,别在各个按钮点击里零碎更新。
格式一致性常被忽略,但它决定了“翻译可落地”。第一,字符串里禁止拼接变量碎片,采用占位符:例如 "已选择 {0} 个文件";第二,数值、日期、百分号、小数点,全部交给统一的格式化器,别在各处 ToStr;第三,注意右到左(RTL)以及多字节字符宽度,尽管你暂时不做阿拉伯语,也要避免用“固定宽度空格+对齐”的土法美学。标点也有地域差异,中英文引号、冒号后空格,提前制定规范。
易语言的一些“坑”可以提前规避。比如窗口设计器里很多控件的 Caption 会在编译时固化,如果你只在创建后改一次,某些动态弹出子窗口仍会显示中文。解决办法是:为所有创建路径(包括弹窗)统一走一个 InitLang(窗口句柄, 语言字典) 的入口;再比如菜单项和托盘提示,别忘了它们不在常规控件枚举里,需要单独覆盖。还有热键提示(如 Ctrl+S)和省略号、冒号位置,翻译时要和目标语言习惯一致。
翻译流程也值得搭一条“窄而稳”的线。工程里保留一份 zh-CN 作为源,派生 en-US、ja-JP 等,约定任何新增键必须先落到源语言,再由脚本提示缺失。多人协作可以用最简单的 Git 流程,语言包单独一个目录,提交时跑校验。别急着找外包翻译,先用通顺的“工程师英文”把上下文写全,附截图或注释,避免孤立短语被误译。实在需要外部翻译,给一个能在线预览的最小可运行包,边看边改,效率高一倍。
测试环节,我推荐“假语言”法:做一份语言包,把所有字符替换为全宽字符或在前后加 [!!] 前后缀,迅速暴露硬编码和控件宽度问题。同时在设置里放一个“重载语言包”按钮,开发期无需重启就能反复验证。对于长文本(提示、协议),单独使用多行控件并允许自动换行,别把宽度卡死。
最后谈取舍。国际化不是一次性工程,而是一套“工具+约定+纪律”。易语言的生态没有现成的大框架,就更要把这三件事做笨做稳:键控驱动、集中加载、统一格式化。等你第一次无痛上新一门语言、不改一行业务代码,只换一份 JSON 时,就会明白这套方法的价值。如果需要一个起步模板,可以参考 ICU 的占位思路,然后用简化版规则在本地实现;或者借鉴 https://unicode.org/reports/tr35 的语言标签规范,至少把语言代码写对,这些都是避坑的捷径。 |
|