MyEclipse 10.7汉化:OSGi fragment与dropins实战 简介MyEclipse 10.7 汉化包面向使用这款基于 Eclipse 的 Java 集成开发环境的中国开发者用于把英文界面切换为中文降低菜单、对话框、提示信息与帮助文档的阅读门槛。压缩包共 484 个文件、约 2.44MB其中 411 个 jar 承载主界面与内置插件的语言资源另有 html 帮助页、xml 与 properties 配置、jpg 界面截图和少量 java、class 辅助文件并附安装说明。已有 216 人学习下载。内容覆盖工作区与工具栏、工程创建导入导出、代码编辑器提示、Maven/Ant 构建配置、断点与变量查看等调试界面、服务器运行配置以及数据库管理、JSP/HTML 编辑器和 UML 建模等插件的汉化同时针对中文字符较宽的特点调整了控件宽度与排列。按说明替换对应文件并提前备份原文件即可完成界面语言切换适合希望减少语言障碍、专注开发与调试的 Java 开发者参考使用。1. 把汉化包塞进 dropins 就不再处理这是 MyEclipse 10.7 汉化最常见的问题在 MyEclipse 10.7 上做汉化会遇到很反常的情况文件都放了目录没错重启后界面却没有变化日志里也没有一条明确报错。原因是 10.7 的汉化本质上是向一个基于 3.7.x 内核的 OSGi 运行时中安装一组 fragment碎片包让它附着在org.eclipse.ui这类宿主插件上而不是换一份中文语言文件。宿主版本对不上、bundles.info没刷新、ini 被记事本存成了带 BOM 的 UTF-8任何一条都会让汉化静默失效。这套资源解决的正是版本对齐、目录落地和回滚这三件事适合还在维护老工程、短期内换不掉 10.7 的人。2. 先对齐内核10.7 的 OSGi 底座决定语言包能否被解析同一份汉化包装在 10.7 上毫无反应装在另一个 10.x 小版本上却正常原因基本都在内核的小版本差异上。Eclipse 平台的语言包不是普通插件它通过 MANIFEST 里的一段版本区间来声明自己“愿意挂谁”而这个区间是为某个具体内核版本写死的。所以动手之前先别急着拷文件先把内核版本读出来。2.1 三个文件读出真实内核版本安装根目录下有.eclipseproduct、configuration/config.ini和plugins/三处信息互相印证最稳。# 进入 10.7 安装根目录路径按自己的实际安装位置改 cd /opt/myeclipse10.7 # 1) 产品标识这里的 version 是平台内核版本不是 MyEclipse 的产品版本 cat .eclipseproduct # 2) 运行时配置product 标识、默认语言、启动项都在这 grep -E ^(eclipse.product|osgi.nl|osgi.bundles.defaultStartLevel|eclipse.application) configuration/config.ini # 3) 直接从插件名看内核org.eclipse.ui 的主版本号就是判断依据 ls plugins | grep -E ^org\.eclipse\.(ui|ui\.workbench|core\.runtime)_ | sort第一段输出里version3.7.x是后面所有判断的依据记住这个数字。第二段如果已经出现osgi.nlzh_CN说明之前有人改过配置但没生效得先还原再排查。第三段最关键org.eclipse.ui_3.7.2.v2012...这种文件名里下划线后面那一串就是宿主插件的真实版本语言包 MANIFEST 里的区间必须把这一串包含进去否则 fragment 永远停在 INSTALLED 状态界面自然是英文。Windows 下把上面的命令换成type .eclipseproduct、findstr /B eclipse.product osgi.nl configuration\config.ini、dir /B plugins | findstr /B org.eclipse.ui_一样能跑。养成先读版本再动手的习惯后面能省两三个小时。2.2 fragment 机制语言包是挂在宿主上的“半个插件”普通插件有独立的Bundle-SymbolicName能单独启停语言包是 fragment它没有自己的类加载器只往宿主插件的外部化字符串表里补条目。所以它的 MANIFEST 长得跟插件很像但多一行决定命名Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-SymbolicName: org.eclipse.ui.nl_zh Bundle-Version: 1.0.0.v201203221200 Fragment-Host: org.eclipse.ui;bundle-version[3.7.0,3.8.0) Bundle-Localization: fragmentFragment-Host里的bundle-version就是那条“愿意挂谁”的区间写成[3.7.0,3.8.0)表示宿主主版本必须是 3.73.6 或 3.8 都不认。当宿主实际是3.7.2时区间命中fragment 能被解析RESOLVED如果区间写成[3.6,3.7)解析阶段直接失败但失败是静默的——因为 fragment 不参与启动缺了它运行时照样启动只是字符串没被替换。这就是“汉化包放了没反应”最典型的成因。Bundle-Localization: fragment这一行也不能少。它告诉宿主的 NLS 机制翻译查找时把 fragment 里的*.properties也算进去。少了它fragment 能解析、状态也对但菜单依然英文排查起来比版本不匹配还费劲。2.3 三类语言包的选型对照市面上能拿到的 10.7 可用语言包大致分三类别只看“汉化率”这个数字。类型形态适配内核实际覆盖风险点平台级整包一整套org.eclipse.*.nl_zhjar几十个严格绑定 3.7.x 小版本工作台菜单、偏好设置、向导页、报错提示小版本差一位就整批不解析精简包只保留 ui、ui.workbench、core 等十来个高频包区间通常写得较宽主菜单和右键菜单够用偏好设置页大面积仍是英文二次打包有人把 properties 重存过可能改过编码不确定不稳容易出方块字或乱码我一般选第一类然后用 2.1 读出来的版本去核对它的区间区间不匹配时宁可去找对应小版本的包也不要手动改 MANIFEST 里的bundle-version硬凑——改了能解析但属性键名在不同小版本之间有增删界面会出现英文与中文混排甚至个别对话框直接空白。这类问题没有通用解决办法。3. 两条落地路径dropins 外挂与 plugins 覆盖放文件的方式只有两种放进dropins/让 p2 在启动时扫描或者直接覆盖plugins/里的同名包。前者可回滚、不污染主目录后者在极老的安装包上偶尔是唯一能生效的办法但代价是升级和维护会变得麻烦。3.1 dropins 外挂目录结构与首次-cleandropins的扫描规则比想象中严格它认dropins/xxx/plugins/*.jar这种一层子目录也认直接扔在dropins/下的单个 jar但不认随意嵌套的深层结构。cd /opt/myeclipse10.7 # 先备份现有的 dropins出问题一条命令就能回到解放前 cp -r dropins dropins.bak.$(date %Y%m%d) # 建一个带语义的子目录方便以后整目录切换或删除 mkdir -p dropins/nl-zh # 解压汉化包包内结构一般是 plugins/ 与 features/ 两个目录 unzip -q ~/downloads/nl_zh_3.7.zip -d dropins/nl-zh # 落完检查应该能看到一批 org.eclipse.*.nl_zh_*.jar find dropins/nl-zh -name *.jar | head -20 find dropins/nl-zh -name *.jar | wc -lcp -r dropins dropins.bak.$(date %Y%m%d)带日期是为了留退路万一第一次没生效、第二次又改坏了还能退回最初状态。dropins/nl-zh这个子目录名随意但要保持稳定后面写切换脚本时就靠它定位。最后两条find一条看样例、一条数总量数量对不上说明解压时有过长路径被截断——Windows 上尤其常见压缩包里的路径超过 260 字符会静默丢弃。第一次启动必须带-clean。它会清掉configuration/org.eclipse.osgi下的 bundle 缓存强制重新扫描 dropins。不带-clean时p2 可能沿用旧的解析结果你看到的就是“文件明明在界面却没变”。-clean只需生效一次之后每次启动都带着它会让启动时间明显变长验证通过后记得从 ini 里删掉。3.2 ini 参数-nl、-clean与-consoleLog的先后顺序10.7 的启动配置在安装根目录的myeclipse.ini里改之前先复制一份。-startup plugins/org.eclipse.equinox.launcher_1.2.0.v20110502.jar --launcher.library plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.200.v20120511-1900 -nl zh_CN -clean -consoleLog -Xmx1024m -XX:MaxPermSize256m-nl zh_CN必须拆成两行写-nl一行、值一行写成-nl zh_CN在同一行时部分启动器版本会把它当成一个整体参数丢掉。语言值用zh_CN而不是zh因为部分语言包的 properties 文件是按_zh_CN后缀命名的只给zh匹配不上。-consoleLog会把原本写进.metadata/.log的日志同步打到控制台窗口这是排查阶段最省事的一个开关——不用每次启动后翻文件。验证完成后可以去掉但留着也无妨只是多一个黑窗口。-vm如果存在必须放在文件靠前的位置且路径单独一行。10.7 对 JDK 版本敏感跑在 JDK 8 及以上常常起不来而这跟汉化没有半点关系很容易被误判成汉化包有问题。看到“启动闪退”先确认 JDK再怀疑语言包。3.3 plugins 覆盖什么时候不得不用以及回滚清单少数从旧机器上整体拷贝过来的绿色版dropins目录干脆不存在或者 p2 的 dropins 扫描器被裁掉了这时只能往plugins/里覆盖。覆盖前先做快照不然出了问题连“原来有哪些包”都说不清。cd /opt/myeclipse10.7 # 覆盖前导出插件名清单 find plugins -maxdepth 1 -name *.jar -printf %f\n | sort /tmp/plugins-before.txt # 解压汉化包直接并入 plugins 与 features unzip -q ~/downloads/nl_zh_3.7.zip -d . # 覆盖后比对找出新增和替换掉的包 find plugins -maxdepth 1 -name *.jar -printf %f\n | sort /tmp/plugins-after.txt comm -13 /tmp/plugins-before.txt /tmp/plugins-after.txt /tmp/plugins-added.txt cat /tmp/plugins-added.txtcomm -13输出的是“只在 after 里出现”的行也就是这次真正加进去的包。这份清单要留着真要回滚按清单逐个删除即可比凭记忆删安全得多。覆盖路径有个特有的坑——同名不同版本的 jar 会共存。比如原来有org.eclipse.ui_3.7.1.jar汉化包里带的是org.eclipse.ui_3.7.2.jar两个都在plugins/下OSGi 会挑版本高的那个装上但宿主的依赖关系是按旧版本建立的结果就是汉化时有时无、重启一次变一次。所以覆盖完成后必须回头看/tmp/plugins-added.txt凡是带非nl_zh字样的普通插件都要确认是不是重复版本是就删掉旧的。4. 验证从 OSGi 状态到界面的四个观察点放完文件不等于汉化成功中间还有解析、装配、加载三道。跳过验证直接看界面很容易把“能解析但没加载”和“根本没解析”混为一谈排查方向就偏了。4.1 用控制台确认 fragment 真的 RESOLVED启动时加-console -noExit会打开一个 OSGi 控制台窗口在这里能直接问运行时“这个 fragment 到底什么状态”。# 命令行启动时临时追加参数不改 ini /opt/myeclipse10.7/myeclipse -console -noExit -consoleLog -clean # 控制台里查 fragment 状态 osgi ss org.eclipse.ui.nl osgi diag 1234ss是 list bundles 的简写输出里每行开头的数字是 bundle id后面跟状态。看到RESOLVED说明宿主版本区间匹配成功、fragment 已装配问题只可能在字符串键看到INSTALLED说明有依赖没满足基本就是版本区间对不上如果连这一行都搜不出来说明文件根本没被扫描到回到 3.1 检查目录结构。diag id会打印这个 bundle 解析失败的完整原因包含缺失的宿主或版本区间。把 id 换成ss输出里对应的数字即可。这一步能在十秒内区分“版本问题”和“路径问题”比翻日志快得多。4.2 界面与日志的四个观察点观察点正常表现异常时的指向主菜单栏文件、编辑、窗口等变成中文仍英文则 fragment 未加载窗口 → 首选项左侧节点全部中文部分中文说明只装到部分包新建工程向导向导标题与步骤名中文标题中文、内容英文属正常configuration/下日志无 fragment 解析报错有Could not resolve则看 4.1四个点一起看才有诊断价值。只有首选项中文、主菜单英文通常是精简包只覆盖了org.eclipse.ui.workbench没覆盖org.eclipse.ui全都英文但日志干净多半是-clean没生效缓存还在用旧的解析结果。4.3 汉化覆盖率的边界哪些永远不会变成中文这一点得提前说清楚免得装完之后觉得“汉化不完全、资源不行”。10.7 里带自家前缀的插件如com.*开头的那一批由厂商自己维护语言包里没有对应的.nl_zhfragment因此 MyEclipse 特有的透视图名称、专属工具栏按钮、数据库连接配置向导等基本都是英文。启动画面上的产品标识同理。另外Java 堆栈、编译器报错原文、插件市场里的描述内容走的是另一套字符串来源不在语言包管辖范围。判断一个汉化包质量好不好不该看“有没有全中文”而该看平台级界面菜单、首选项、向导、对话框按钮是否完整中文化以及有没有中英混排的半截句子。5. 排查五条汉化失败的经验记录汉化这类“改了配置但界面没变化”的问题最怕的是没有顺序地乱改。我一般按“日志 → bundle 状态 → ini 内容 → 目录结构 → 权限”这个顺序走每一步都能明确排除一类原因。5.1 定位顺序从日志开始别从界面开始先看.metadata/.log在 workspace 目录下不是安装目录找Could not resolve、Missing required bundle这类关键字。日志干净说明解析层没问题问题在加载或字符串键日志有解析错误直接跳 4.1 用diag定位具体 bundle。第二步看 bundle 状态第三步核对myeclipse.ini是否有-nl zh_CN且分两行、-clean是否还在第四步确认 dropins 结构第五步才是权限。顺序颠倒的代价很直接有次我在权限上折腾了四十分钟最后发现是 ini 里-nl zh_CN写在了同一行。5.2 五条踩坑记录其一ini 被记事本存成带 BOM 的 UTF-8。现象改完myeclipse.ini后启动直接闪退或者参数完全被忽略界面还是英文。 原因Windows 记事本保存 UTF-8 时会加EF BB BF三个字节启动器解析第一行时读到不可见字符整份配置被当成非法内容。 解决用支持无 BOM 保存的编辑器重存或者用脚本确认。改完 ini 顺手跑一次检查是个好习惯# 检查 ini 是否被写成了带 BOM 的 UTF-8 path rD:\myeclipse10.7\myeclipse.ini data open(path, rb).read(3) print(BOM 存在需重存 if data b\xef\xbb\xbf else 文件头干净)其二语言包版本区间与宿主差一个小版本。现象文件都在-clean也加了界面完全没变日志里搜不到明显异常。 原因fragment 的Fragment-Host区间是[3.7.0,3.8.0)而宿主实际是3.7.2之外的版本解析失败但不影响启动属静默失败。 解决回到 2.1 读真实版本换对应小版本的包或按 4.1 用diag确认区间再决定是换包还是放弃这个包。其三plugins/下同名插件新旧共存。现象汉化时有时无重启几次表现不一致偶尔伴随启动变慢或某个视图打不开。 原因覆盖式安装留下了两个版本的同一个 bundleOSGi 按版本高低选择但依赖关系是按旧版本建立的。 解决按 3.3 的清单比对凡是新增的非nl_zh包逐个确认重复版本删旧留新删完再-clean一次。其四装到受保护目录文件被系统重定向。现象明明复制成功了资源管理器里也能看到重启后却没生效再次打开目录发现文件“不见了”。 原因安装目录在受保护路径下写入被重定向到用户虚拟目录程序读的是原位置的空目录。 解决把整个安装目录迁到用户可写的普通路径或安装时就选非系统盘迁移后重新走一遍 3.1。其五汉化包的 properties 被重存成 UTF-8。现象界面确实变中文了但部分菜单显示成方块或问号另一些菜单正常。 原因标准语言包的 properties 用\uXXXX转义保存兼容任何编码二次打包时被存成 UTF-8读取端仍按 ISO-8859-1 解码中文就散了。 解决这类包没有修复价值换回原始版本判断方法是解压后随便打开一个.properties看中文是转义序列还是可读汉字。6. 把汉化做成可切换的一层三个复用技巧反复覆盖、反复改 ini是这个环节最耗时间的部分。我的做法是把语言包当成一个可插拔的“层”主目录plugins/永远保持出厂状态中英文切换只动dropins/下一个子目录。6.1 目录级切换脚本把两套语言包分别放在安装目录之外的langpacks/zh和langpacks/en切换时只替换dropins/nl-zh#!/usr/bin/env bash # 在中文与英文界面之间切换不改动 plugins 主目录 set -e ROOT/opt/myeclipse10.7 case $1 in zh) rm -rf $ROOT/dropins/nl-zh cp -r $ROOT/langpacks/zh $ROOT/dropins/nl-zh ;; en) rm -rf $ROOT/dropins/nl-zh ;; *) echo 用法: $0 {zh|en}; exit 1 ;; esac echo 已切换到 $1下次启动请带 -cleanset -e保证任何一步失败立刻停避免删了一半留下残局。en分支只删不加因为英文界面是平台默认不需要额外语言包。rm -rf的路径写死成变量是为了防止手抖把dropins整个删掉。6.2 交付前的自检清单给同事或团队复现时我会在压缩包外放一张核对表内核版本是否已读出、语言包区间是否覆盖该版本、dropins/nl-zh/plugins下 jar 数量是否与清单一致、myeclipse.ini是否含分两行写的-nl zh_CN、ini 文件头是否干净、首次启动是否带-clean、JDK 是否在 10.7 能接受的范围内。七项里任何一项没打勾都不要往下走。从那以后我每次动myeclipse.ini都强制先跑一遍文件头检查和参数分行检查再启动——这两步加起来不到十秒却能挡掉我遇到过的将近一半失败。希望帮到你。本文还有配套的精品资源点击获取