
简介Navicat 16 Premium 中文语言包面向需要在图形化界面中管理 MySQL、MariaDB、Oracle、SQL Server 等数据库的中文用户用于补充软件简体中文本地化资源降低英文界面带来的理解成本。压缩包为 zip 格式共 1304 个文件约 7.82MB包含 598 个 strings 文本、389 个 png 图标、307 个 html 帮助页面以及少量 js、css、gif 等配套文件覆盖界面文案、帮助内容与视觉资源。已有 19504 人学习下载说明其在 Navicat 汉化场景中具有一定参考价值。资源目录中的 zh-Hans.lproj 对应简体中文语言项目便于读者了解语言包的文件组织与本地化构成描述显示其在 macOS 下验证可行Windows 环境因资源加载机制不同可作为兼容性判断与方案比对的参考。1. 装完客户端第一件事界面语言为什么总卡在英文某同事把 navicat 16 premium 装好丢过来一句「菜单全是英文帮我弄个中文的」。点开工具菜单里的界面语言选项下拉只有 English 一项——软件本身具备多语言框架缺的是可被识别的中文资源文件。navicat 16 premium 中文语言包要解决的就是这一层让程序在启动时能找到并加载简体中文词条。它不难用真正的门槛在版本对齐、目录命名和编码三处任一处错位就会出现半中半英、启动闪退或者干脆退回英文。适合手上已经装着 16 系列、连接配置和查询历史都不想重来、只想把界面换成中文的从业者。2. 中文语言包改的是哪一层资源目录、文件格式与加载顺序先把「语言包」这三个字拆开看。多数商业客户端的界面文本不是硬编码在 exe 里而是抽成独立的资源文件运行时按当前语言标识去某个固定目录取词条。所谓汉化本质是把一份语言标识为简体中文的资源放到程序会去查的路径上并让它和当前构建号的词条键集合对得上。理解这条链路后面所有排错都有方向。2.1 先定位真实安装路径再谈覆盖Windows 上快捷方式指向的往往是启动器而不是主目录直接按默认路径猜容易改错地方。稳妥做法是从快捷方式反查或者用进程路径确认。macOS 上主程序和资源都在.app包内用find把目录结构打出来最直观。# macOS确认主程序位置并列出包内已有的语言资源目录 APP$(ls -d /Applications/Navicat*.app | head -1) echo $APP find $APP/Contents/Resources -maxdepth 1 -type d -name *.lproj | sort# Windows从开始菜单快捷方式反查真实安装目录 $lnk Get-ChildItem $env:ProgramData\Microsoft\Windows\Start Menu\Programs -Recurse -Filter *Navicat* | Select-Object -First 1 $sh New-Object -ComObject WScript.Shell $sh.CreateShortcut($lnk.FullName).TargetPath第一条命令里ls -d只取目录本身不展开内容head -1是防止机器上装了多个版本时输出多行find -maxdepth 1限定只在 Resources 下一层找避免把插件目录里的同名资源也扫出来。第二条走的是 Windows 快捷方式的 COM 接口TargetPath拿到的是可执行文件的绝对路径比读注册表更省事。提示Windows 安装目录里常常还多一层厂商目录路径形如C:\Program Files\厂商\Navicat Premium 16。以实际反查结果为准不要照抄网上的路径。定位到主目录后先别急着复制文件把目录里已有的语言资源形态看清楚是zh-Hans.lproj这样的目录还是translations下的一批资源文件还是跟主程序同级的若干.dll。形态不同落盘方式完全不同。2.2 语言包的几种常见形态与对应处理方式拿到手的压缩包先ls一遍按扩展名和目录层级归类再决定怎么放。常见的几种形态和处理策略如下形态典型位置处理方式风险点.lproj目录内含.stringsmacOS 应用包Contents/Resources整目录放入或在已有目录内合并目录名必须是程序认的语言标识独立资源文件.qm/.dat等程序目录下的语言子目录同名覆盖文件名大小写敏感与主程序同级的二进制资源程序根目录覆盖前必须核对构建号版本错配直接导致启动失败纯文本配置.json/.ini配置或lang子目录放入后重启生效编码必须是 UTF-8 无 BOM我一般会先把压缩包解到临时目录用find . -type f | sort打一份清单和安装目录里对应的子目录做一次文件名对拍。清单能对上、只是内容不同说明是同构替换风险最低清单里有大量安装目录中不存在的文件说明这份包针对的是另一个构建号先别覆盖。2.3 加载顺序与构建号为什么小版本差一位就翻车程序启动时的取词顺序通常是读配置里的语言标识 → 去资源目录按标识找候选 → 命中则加载未命中回退到内置英文。构建号一变开发方新增或重命名了词条键旧包加载后这些键找不到对应值表现出来就是「大部分中文、零星几处英文」严重的会在初始化阶段因为资源结构不符直接退出。查构建号的方式各平台不同但都比版本号更细Windows 看主程序属性里的文件版本macOS 看Info.plist里的版本字段。# macOS一次性把营销版本号和构建号都读出来 /usr/libexec/PlistBuddy -c Print :CFBundleShortVersionString \ /Applications/Navicat Premium.app/Contents/Info.plist /usr/libexec/PlistBuddy -c Print :CFBundleVersion \ /Applications/Navicat Premium.app/Contents/Info.plistCFBundleShortVersionString是对外的版本号如 16.xCFBundleVersion才是内部构建号。语言包说明里写的如果是后者就必须严格一致如果只写了前者那么在同一主版本内通常可用但词条缺失要接受。注意不要用「版本号相同就一定能用」来判断。同一个 16.x 下的不同构建词条键集合可能差出几百条覆盖前先做一次文件名对拍能省掉一次重装。3. 落地四步备份、覆盖、切换、验收各自要盯什么流程本身很短出问题的几乎都是「跳步」。四步里最容易被省略的是第一步和第四步而这两步恰好决定了翻车后能不能五分钟内恢复。3.1 备份先把后悔药备好整目录备份不要只备份要覆盖的那几个文件。理由很实际覆盖过程中你可能顺手动了旁边的配置或者程序在首次启动时重写了资源索引只还原被覆盖的文件并不能回到原状。# Windows整目录镜像备份保留 ACL 和时间戳 robocopy C:\Program Files\厂商\Navicat Premium 16 D:\backup\navicat16_bak /E /COPYALL /R:1 /W:1# macOS整包复制一份带时间戳的副本到共享目录 APP/Applications/Navicat Premium.app sudo cp -R $APP /Users/Shared/Navicat-backup-$(date %Y%m%d%H%M).approbocopy的/E表示含空目录/COPYALL连权限一起复制否则还原时可能因为权限不同启动失败/R:1 /W:1把重试次数和等待时间压到最低避免遇到占用文件时卡很久。cp -R在 macOS 上对.app包是有效的但需要用sudo因为包内部分文件属于 root。备份目录别放在同一个盘上也别放在会被同步工具扫到的位置几百兆的副本反复同步很烦人。3.2 覆盖与权限什么时候需要提权什么时候不需要Windows 上目标目录在Program Files下写入必须管理员权限否则复制会静默失败一部分文件——这是最坑的一种情况因为资源文件只写进去一半启动后表现是随机位置的英文和乱码。macOS 上情况更复杂应用包是签名过的直接改包内容会破坏签名完整性程序可能在启动时被系统拦下。所以 macOS 的优先顺序我一般按这个来先确认程序自带的界面语言开关里有没有简体中文再看包内是否已经存在zh-Hans.lproj目录有些版本是随安装包一起发的只是没启用最后才考虑替换文件且替换前一定整包备份。真正需要手工替换的场景其实不多。覆盖操作本身没什么技巧要点是「同名同路径、整批替换、不要合并出两套」# 以 macOS 为例把语言包目录整体放入 Resources先确认目标不存在 RES/Applications/Navicat Premium.app/Contents/Resources test -e $RES/zh-Hans.lproj echo 目标已存在先改名保留 || echo 目标不存在可放入 cp -R ./pkg/zh-Hans.lproj $RES/test -e那行是刻意加的防呆如果目标目录已经存在直接cp -R会变成往里套一层结果是zh-Hans.lproj/zh-Hans.lproj程序永远读不到。养成先判断再复制的习惯比事后排查省时间。3.3 切换语言配置项在哪为什么改了没反应多数客户端的语言开关在「工具 → 选项 → 常规」一类的设置页里改完要求重启进程。这里有两个常见误解一是以为改完立即生效实际上语言资源通常在进程启动阶段一次性载入必须完全退出再启动托盘图标也要退二是以为设置会写进安装目录实际上多数写在用户级配置里重装不丢但也意味着换用户账号后要重设一次。如果设置页里根本没有简体中文这个选项说明程序没有扫描到可用的中文资源。此时不要反复切换直接去资源目录确认目录名和语言标识是否匹配——这是下一章要展开的重点。3.4 验收清单别只看主界面验收要按区域扫一遍因为语言包覆盖不完整时缺失往往集中在少数几个模块。我习惯按下面这张表逐项确认全部通过才算装好验收区域检查点常见缺失表现主菜单栏文件、编辑、查看等顶级菜单顶级菜单中文、下拉项英文右键菜单表、视图、查询上的上下文菜单完全未汉化连接对话框新建连接、SSL、SSH 选项卡标签中文、按钮英文数据网格列头右键、排序、筛选部分词条为半角符号混排导出与导入向导分步向导的标题与按钮向导页标题英文错误提示故意输错 SQL 触发报错报错正文仍为英文错误提示那一项最容易被忽略但它恰恰是新手最常看到的文本。故意执行一条语法错误的 SQL看看弹窗正文是不是中文如果是英文说明语言包只覆盖了界面层没有覆盖消息层这类包在排错时帮助有限。4. 汉化质量怎么量化覆盖率、占位符与字形三道关判断一份语言包值不值得用靠感觉不准。有三条可以量化的硬指标词条覆盖率、占位符完整性、字形渲染。前两条能脚本化第三条靠肉眼加缩放测试。4.1 三条硬指标的定义与判定标准覆盖率指目标语言文件里的键数量占源语言键数量的比例。低于某个阈值时界面会频繁回退到英文读起来割裂感很强。占位符完整性指%s、%d、{0}这类格式化标记在译文里是否与源文数量、顺序一致——译文漏掉一个%s运行时轻则文本被吞重则直接抛格式化异常。字形渲染则看中文在默认字体和系统缩放下的表现方块字、截断都属于这一项。我的判定线是覆盖率看关键模块连接、查询、导出是否 100%整体允许少量缺失占位符必须零错误这条没有商量余地字形在 100% 和 150% 缩放两档下都不能出现截断。4.2 用脚本扫出缺失词条与占位符错位.strings类文件的格式很规整一行一个键值对用正则就能解析。下面这段脚本做三件事找出目标缺失的键、比对占位符、标记仍是纯英文的疑似漏翻项。import re from pathlib import Path # 只处理 .strings 形态json / ini 形态改一下解析函数即可复用后面两段逻辑 LINE re.compile(r^\s*((?:[^\\]|\\.)*)\s*\s*((?:[^\\]|\\.)*)\s*;) # 覆盖常见的格式化占位符写法 PH re.compile(r%\d*\$?[sdif]|\{\d\}|\{[A-Za-z_]\w*\}) def load(path): data {} for line in Path(path).read_text(encodingutf-8, errorsreplace).splitlines(): m LINE.match(line) if m: data[m.group(1)] m.group(2) return data src load(en.lproj/Localizable.strings) dst load(zh-Hans.lproj/Localizable.strings) # 1) 目标缺失 for k in sorted(set(src) - set(dst)): print(MISSING, k) # 2) 占位符数量或顺序不一致 for k, v in dst.items(): a, b PH.findall(src.get(k, )), PH.findall(v) if a ! b: print(PLACEHOLDER, k, a, b) # 3) 译文仍是纯 ASCII疑似漏翻排除只是符号/数字的短串 for k, v in dst.items(): if v.strip() and all(ord(c) 128 for c in v) and len(v.strip()) 3: print(SUSPECT_EN, k, v[:40])解析部分用errorsreplace是有意的语言包经常混入非 UTF-8 编码的残留文件直接read_text会抛异常中断整个扫描替换模式能让你先看到问题清单。PH正则里同时挂了%s系和{0}系两套写法因为不同模块可能用不同的格式化库。第三段只在译文全是 ASCII 且长度超过 3 时告警避免把「OK」「ID」这类本来就不该翻的短词也报出来。扫描结果按优先级处理PLACEHOLDER是必改项MISSING看模块重要性SUSPECT_EN逐个确认。这三类信息整理成一张表就能给出一份包的可用性结论而不是「感觉还行」。4.3 字体与缩放中文发虚、按钮截断怎么调界面语言切到中文后字号和字宽都变了。Windows 上系统缩放设到 125% 或 150% 时固定宽度的按钮最容易出现文本被截成「导出…」这类残缺显示macOS 上如果语言包没有声明字体回退链个别标签会退到默认字体中英文混排时行高不一致看起来发虚。处理思路是分层的先确认是系统缩放问题还是语言包问题——把缩放调回 100%如果截断消失那就是布局没给中文留够宽度属于语言包本身的适配缺陷能做的只有在配置里调大默认字号或换用更紧凑的字体。如果 100% 下依然发虚看是不是语言包把字体族写死了指向了系统里没有安装的字体。注意改字体设置属于可逆操作但改语言资源里的字体声明会进一步破坏包的一致性。我一般只动用户级配置不动安装目录里的资源文件。5. 常见问题排查五个真实翻车现场与对应解法下面五条都是覆盖语言资源时反复出现的场景按「现象 → 原因 → 解决」记下来遇到时按顺序对号入座比盲试快得多。5.1 覆盖后启动直接闪退现象双击图标进程起来一两秒就退出没有任何错误弹窗。原因覆盖进去的资源文件和主程序的构建号不匹配程序在初始化阶段解析资源结构时失败。这在二进制资源形态的包里最常见。解决立刻用 3.1 的备份回滚不要反复重试。回滚后重新核对构建号确认语言包说明里标注的版本与你PlistBuddy或文件属性里读到的一致。如果只有主版本号一致先用非覆盖方式验证——把新资源放到旁边的临时目录用配置指向它试一次确认能起来再正式覆盖。5.2 大部分中文个别对话框仍是英文现象主菜单、右键菜单都是中文但新建连接的高级选项卡、导出向导的某一页还是英文。原因语言包只覆盖了主资源没有覆盖子模块或插件目录下的独立资源。客户端的功能模块拆分得越细这种「主资源全、子资源缺」的情况越普遍。解决拿扫描脚本对整棵资源树跑一遍看MISSING集中在哪个子目录再对照压缩包结构确认是不是少放了一层。常见的坑是压缩包里带了一层顶层目录解压后直接整个复制结果资源被套进了多余的一层程序自然读不到。5.3 中文显示成问号或方块现象词条位置出现了成片的???或者空心方块。原因文件编码不是 UTF-8或者用的是带 BOM 的 UTF-8。带 BOM 的文件在部分解析器里会把 BOM 当成键名的一部分导致整批键匹配失败表现出来就是未翻译。解决批量转成 UTF-8 无 BOM 再放回去。转之前先确认源文件到底是什么编码别一律按 UTF-8 处理否则会把本来正常的文件转坏。# 先探测编码再决定是否转换不要无脑 -w file -I ./pkg/zh-Hans.lproj/Localizable.strings # 确认是 unknown-8bit 或 iso-8859-1 时转成 UTF-8 并去掉 BOM iconv -f GB18030 -t UTF-8 ./pkg/zh-Hans.lproj/Localizable.strings \ | sed 1s/^\xEF\xBB\xBF// ./pkg/zh-Hans.lproj/Localizable.strings.utf8file -I输出的是 MIME 编码猜测对纯 ASCII 内容会误报成 us-ascii属正常现象。sed那一行专门剥掉可能存在的 BOM\xEF\xBB\xBF是 UTF-8 BOM 的三字节表示。转换完记得用脚本再扫一遍确认键数量没变少——编码转换失败最典型的表现就是键数量骤降。5.4 语言选项里根本没有「简体中文」现象设置页的语言下拉里只有英文和另外一两种看不到简体中文。原因目录名或语言标识不被程序识别。同一门语言在不同框架下的标识写法不同zh-Hans、zh_CN、zh-CN、chs都有人用写错一个字符就等于没放。解决不要猜去看程序当前能识别的那几种语言分别对应什么目录名照葫芦画瓢改成同一套命名规则。改名比改内容安全得多改错了也只是不生效不会导致启动失败。改完重启进程再看下拉。5.5 覆盖后某些按钮消失或功能报错现象界面确实是中文了但某个工具栏按钮不见了或者点某个功能弹出参数错误。原因语言包的词条集合比当前构建号旧新增的按钮文本键缺失程序渲染时跳过了整个控件参数错误则是占位符数量对不上导致的。解决这类问题没法靠改文本修只能换包或回滚。所以我一直坚持覆盖前先跑 4.2 的扫描脚本——MISSING和PLACEHOLDER两类告警如果集中在新增功能上就别装了装上去也是残缺的。6. 把切换做成可回滚软链方案与三分钟验收真正让这件事变轻松的不是找到一份完美的语言包而是把「换语言」变成一次可逆操作。我后来的做法是不再直接往应用包里写文件而是在包外的固定位置维护一份语言资源用符号链接指过去。这样切换只是换链接目标回滚只是删链接安装目录本身几乎不动。# 在包外维护语言资源用软链指进去验收完成后记得换回实体文件 RES/Applications/Navicat Premium.app/Contents/Resources LANG_STORE/Users/Shared/navicat-lang # 首次把原始目录挪出来存档建立链接 test -d $RES/zh-Hans.lproj mv $RES/zh-Hans.lproj $LANG_STORE/orig-zh-Hans.lproj ln -s $LANG_STORE/zh-Hans.lproj $RES/zh-Hans.lproj # 回滚删链接把原始目录放回去 rm $RES/zh-Hans.lproj mv $LANG_STORE/orig-zh-Hans.lproj $RES/zh-Hans.lprojln -s建的是软链删链接不会影响目标内容这一点是它比直接复制安全的核心原因。但软链有代价它会改变包内文件的实际类型某些完整性校验会因此判定包被修改。所以这套方案我只在验证阶段用——用它快速对比两三份语言包的实际效果选定之后再按第 3 章的流程做一次实体覆盖。验收阶段结束后一定要换回实体文件别让链接留在包里。配套的三分钟验收可以固化成一个小脚本把 3.4 那张表里能自动判定的部分跑掉# 粗筛统计目标语言目录下的键数量与源语言做比例对比 SRC_CNT$(grep -c en.lproj/Localizable.strings) DST_CNT$(grep -c zh-Hans.lproj/Localizable.strings) echo 覆盖率约 $(( DST_CNT * 100 / SRC_CNT ))%$DST_CNT / $SRC_CNT这个比例只是粗筛grep -c 会把注释行也算进去所以真实覆盖率会比输出值略低。它的价值在于快速排除明显残缺的包——比例低于八成的基本不用往下看了。剩下的细项也就是占位符和纯英文残留还是交给 4.2 的脚本。从那以后我每次装语言包都强制走一遍「备份 → 扫描 → 软链试跑 → 实体覆盖 → 按表验收」五步一步不落。看似慢实际比翻车后重装快得多也少了很多「到底是包的问题还是我改错了」的自我怀疑。希望帮到你。本文还有配套的精品资源点击获取