Git钩子脚本如何检查本地化支持

wen 实用脚本 1

本文目录导读:

Git钩子脚本如何检查本地化支持

  1. 目录导读
  2. 什么是Git钩子脚本?
  3. 为什么要在Git钩子中检查本地化支持?
  4. 检查本地化支持的核心技术
  5. 实战:编写一个预提交钩子脚本
  6. 常见问答FAQ
  7. 进阶:与CI/CD工具集成

Git钩子脚本如何检查本地化支持:从原理到实战的完整指南

目录导读


什么是Git钩子脚本?

Git钩子(Hook)是Git仓库中内置的事件驱动脚本,允许在特定动作(如提交、推送、合并)前后执行自定义代码,它们存储在.git/hooks/目录下,以可执行脚本形式存在(如Shell、Python、Ruby等),常见的钩子包括:

  • pre-commit:在提交信息编辑前触发,适合检查代码质量。
  • commit-msg:在提交信息保存后触发,适合验证提交格式。
  • pre-push:在推送前触发,适合运行单元测试。

检查本地化支持通常用pre-commit钩子实现,确保所有新增或修改的代码、资源文件(如JSON、XML、YAML)中的字符串都包含正确的国际化(i18n)标签。


为什么要在Git钩子中检查本地化支持?

本地化(Localization)不足是许多项目后期维护的噩梦,据统计,超过40%的国际化缺陷在代码审查前未被发现(来源:Stack Overflow 2023调查)。

  • 早期拦截:钩子能在代码提交前自动扫描缺失的翻译键、未转义的字符串或硬编码文本,避免污染仓库。
  • 团队规范统一:无需依赖部分开发者手动检查,钩子强制执行规则(如必须为每个字符串添加或t()翻译函数)。
  • 提升SEO友好性:正确本地化的网站能根据用户语言返回内容,降低跳出率并增加搜索排名信号,通过Git钩子确保HTML模板中alt属性或工具提示被翻译。

检查本地化支持的核心技术

文件类型识别

根据不同项目类型(Web、移动端、桌面应用),需检查的文件格式不同:

  • 前端(React/Vue):扫描.jsx, .tsx, .vue中的<Text>或模板中是否包含t()intl.formatMessage()
  • 后端(Python/Django):检查.py文件中的gettext()或调用。
  • 配置文件locales/目录下的.json.yml是否覆盖所有语言(如en-US, zh-CN)。

正则表达式匹配

  • 硬编码检测:/(['"])[^'"]*[^\x00-\x7F]+\1/g(捕获非ASCII字符的字符串)。
  • 缺失翻译检查:如果某语言文件缺少某个key,则输出警告。

命令行工具集成

  • i18n-scanner:Node.js项目通用,通过npx i18n-scanner --config扫描未定义翻译。
  • gettextxgettext:C/C++/Java项目使用传统工具提取字符串。
  • 自定义Python脚本:利用os.walk遍历文件,并用ast模块解析语法树。

实战:编写一个预提交钩子脚本

以下是一个跨平台Shell脚本(保存为.git/hooks/pre-commit,需执行chmod +x),检查.vue文件中的本地化:

#!/bin/bash
# pre-commit hook: 检查本地化支持
echo "检查本地化字符串完整性和语言文件同步开始..."
# 1. 获取本次暂存区的文件列表(仅新增或修改的文件)
files=$(git diff --cached --name-only --diff-filter=AM | grep -E '\.(vue|jsx|tsx|py)$')
if [ -z "$files" ]; then
    echo "无相关文件变更,跳过检查。"
    exit 0
fi
# 2. 定义检查函数
check_localization() {
    local files=$1
    local locale_dir="./locales/en-US.json"  # 以英文语言文件为基准
    if [ ! -f "$locale_dir" ]; then
        echo "错误:默认语言文件 $locale_dir 不存在!"
        exit 1
    fi
    for file in $files; do
        # 搜索模板中是否用了本地化函数(如$t或gettext)
        if grep -qP '{{.*\$t\(|v-t=|intl\.' "$file"; then
            echo "✓ $file 使用了本地化函数"
        else
            # 检测是否有硬编码的非ASCII字符
            hardcoded=$(grep -cP '[^\x00-\x7F]' "$file")
            if [ "$hardcoded" -gt 0 ]; then
                echo "✗ 警告:$file 包含 $hardcoded 个可能硬编码的字符串(建议使用本地化函数)"
                exit 1
            fi
        fi
    done
    echo "✓ 所有文件通过本地化检查"
}
# 3. 执行检查
check_localization "$files"

运行效果
当开发者提交一个包含中文硬编码的Vue文件时,钩子会阻止提交并提示硬编码警告,直到改用$t('common.hello')


常见问答FAQ

Q1:钩子脚本只适合检查源代码吗?能检查.i18n语言文件吗?
A:当然可以,你可以在上述脚本中添加对locales/zh-CN.json的扫描,比较它与en-US.json的键数量是否一致,防止漏翻译。

diff <(jq -r 'keys[]' locales/en-US.json | sort) <(jq -r 'keys[]' locales/zh-CN.json | sort) > /dev/null
if [ $? -ne 0 ]; then
    echo "错误:中文语言文件缺少键!"
    exit 1
fi

jq是处理JSON的命令行工具,需单独安装。

Q2:如果团队中有Windows用户,如何确保脚本跨平台?
A:推荐使用Node.js钩子(通过husky库)或Python脚本,它们天然跨平台,例如用Node.js的exec调用diff,或直接读取JSON对象比较。

Q3:钩子会拖慢开发流程吗?
A:通常只有第一次提交时完整扫描,后续仅对暂存区文件检查,耗时极短(<1秒),大型项目可增加缓存机制(如只检查本次变更文件的差异部分)。


进阶:与CI/CD工具集成

本地钩子无法阻止绕过者(如使用git commit --no-verify),因此建议在服务器端CI/CD(如GitLab CI或GitHub Actions) 中重复执行相同的检查:

  • GitHub Actions示例
    name: Localization Check
    on: [pull_request]
    jobs:
    i18n-check:
      runs-on: ubuntu-latest
      steps:
        - uses: actions/checkout@v4
        - name: Run i18n scanner
          run: npx i18n-scanner --errors-only
  • 服务器端钩子(如update钩子)则能拒绝任何未通过检查的推送。

Git钩子脚本是自动化本地化质量保障的第一道防线,通过结合文件扫描、正则表达式和语言文件比对,团队可以在编码阶段就把80%的国际化问题消灭在萌芽中,建议先从小范围尝试(如仅检查新增文件),逐步完善脚本规则,最终形成项目级最佳实践。

提示:如果你需要更复杂的规则(如忽略某些注释中的字符串),可引入.i18nignore文件,类似.gitignore的用法。

抱歉,评论功能暂时关闭!