依赖:
dependencies:
intl: ^0.20.2 # 添加 intl 包
dev_dependencies:
flutter_test:
sdk: flutter
# The "flutter_lints" package below contains a set of recommended lints to
# encourage good coding practices. The lint set provided by the package is
# activated in the `analysis_options.yaml` file located at the root of your
# package. See that file for information about deactivating specific lint
# rules and activating additional ones.
flutter_lints: ^5.0.0
build_runner: ^2.4.0 # 用于运行代码生成命令
source_gen: ^1.4.0
实现步骤:
在intl_en.arb等文件中添加字符串
执行实现命令
实现命令:
cd /Users/jim.feng/ludens_ai_mobile_app && chmod +x script/gen_l10n.sh && ./script/gen_l10n.sh
实现脚本:
#!/bin/bash
# ============================================================================
# 多语言生成脚本
# ============================================================================
# 功能:自动生成 Flutter 多语言文件
# 用法:./script/gen_l10n.sh [--clean] [--check]
#
# 参数说明:
# --clean : 清理生成的文件后重新生成
# --check : 检查翻译完整性(检查是否有缺失的翻译)
# ============================================================================
set -e # 遇到错误立即退出
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 项目根目录
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$PROJECT_ROOT"
# 语言文件目录
L10N_DIR="lib/l10n"
TEMPLATE_FILE="$L10N_DIR/intl_en.arb"
SUPPORTED_LOCALES=("en" "ja" "zh")
# 打印带颜色的消息
print_info() {
echo -e "${BLUE}ℹ${NC} $1"
}
print_success() {
echo -e "${GREEN}✓${NC} $1"
}
print_warning() {
echo -e "${YELLOW}⚠${NC} $1"
}
print_error() {
echo -e "${RED}✗${NC} $1"
}
# 检查必要文件是否存在
check_requirements() {
print_info "检查必要文件..."
if [ ! -f "l10n.yaml" ]; then
print_error "l10n.yaml 文件不存在"
exit 1
fi
if [ ! -f "$TEMPLATE_FILE" ]; then
print_error "模板文件 $TEMPLATE_FILE 不存在"
exit 1
fi
for locale in "${SUPPORTED_LOCALES[@]}"; do
if [ ! -f "$L10N_DIR/intl_${locale}.arb" ]; then
print_warning "语言文件 $L10N_DIR/intl_${locale}.arb 不存在"
fi
done
print_success "文件检查完成"
}
# 检查翻译完整性
check_translations() {
print_info "检查翻译完整性..."
# 读取英文模板的所有键(排除元数据)
local en_keys=$(grep -o '"[^"]*":' "$TEMPLATE_FILE" | grep -v '^"@' | sed 's/":$//' | sed 's/^"//' | sort)
local missing_count=0
for locale in "${SUPPORTED_LOCALES[@]}"; do
if [ "$locale" = "en" ]; then
continue
fi
local arb_file="$L10N_DIR/intl_${locale}.arb"
if [ ! -f "$arb_file" ]; then
print_warning "跳过 $arb_file(文件不存在)"
continue
fi
print_info "检查 $locale 语言文件..."
local missing_keys=""
while IFS= read -r key; do
# 检查键是否存在(包括元数据键)
if ! grep -q "\"$key\":" "$arb_file" && ! grep -q "\"@$key\":" "$arb_file"; then
missing_keys="${missing_keys}${key}\n"
((missing_count++))
fi
done <<< "$en_keys"
if [ -n "$missing_keys" ]; then
print_warning "$locale 语言文件缺少以下键:"
echo -e "$missing_keys"
else
print_success "$locale 语言文件完整"
fi
done
if [ $missing_count -eq 0 ]; then
print_success "所有翻译完整!"
return 0
else
print_warning "发现 $missing_count 个缺失的翻译"
return 1
fi
}
# 清理生成的文件
clean_generated() {
print_info "清理生成的文件..."
# 清理 lib/l10n 目录下生成的文件(保留 .arb 文件)
find "$L10N_DIR" -name "app_localizations*.dart" -type f -delete 2>/dev/null || true
# 清理 lib/generated 目录
if [ -d "lib/generated" ]; then
rm -rf lib/generated
print_success "已清理 lib/generated 目录"
fi
print_success "清理完成"
}
# 生成多语言文件
generate_l10n() {
print_info "开始生成多语言文件..."
# 运行 Flutter 的 l10n 生成命令
if flutter gen-l10n; then
print_success "多语言文件生成成功"
# 检查生成的文件
if [ -f "$L10N_DIR/app_localizations.dart" ]; then
print_success "✓ app_localizations.dart 已生成"
else
print_warning "app_localizations.dart 未生成"
fi
for locale in "${SUPPORTED_LOCALES[@]}"; do
if [ -f "$L10N_DIR/app_localizations_${locale}.dart" ]; then
print_success "✓ app_localizations_${locale}.dart 已生成"
fi
done
else
print_error "多语言文件生成失败"
exit 1
fi
}
# 创建 lib/generated/l10n.dart 的符号链接或导出文件
create_generated_l10n() {
print_info "创建 lib/generated/l10n.dart..."
# 确保目录存在
mkdir -p lib/generated
# 创建导出文件
cat > lib/generated/l10n.dart << 'EOF'
export '../l10n/app_localizations.dart';
EOF
print_success "lib/generated/l10n.dart 已创建"
}
# 验证生成的文件
verify_generated() {
print_info "验证生成的文件..."
local errors=0
# 检查主文件
if [ ! -f "$L10N_DIR/app_localizations.dart" ]; then
print_error "app_localizations.dart 未生成"
((errors++))
fi
# 检查各语言实现文件
for locale in "${SUPPORTED_LOCALES[@]}"; do
if [ ! -f "$L10N_DIR/app_localizations_${locale}.dart" ]; then
print_error "app_localizations_${locale}.dart 未生成"
((errors++))
fi
done
# 检查生成的导出文件
if [ ! -f "lib/generated/l10n.dart" ]; then
print_warning "lib/generated/l10n.dart 未创建"
fi
if [ $errors -eq 0 ]; then
print_success "所有文件验证通过"
return 0
else
print_error "发现 $errors 个错误"
return 1
fi
}
# 主函数
main() {
echo "=========================================="
echo " Flutter 多语言生成脚本"
echo "=========================================="
echo ""
# 解析参数
local CLEAN=false
local CHECK=false
for arg in "$@"; do
case $arg in
--clean)
CLEAN=true
shift
;;
--check)
CHECK=true
shift
;;
--help|-h)
echo "用法: $0 [选项]"
echo ""
echo "选项:"
echo " --clean 清理生成的文件后重新生成"
echo " --check 检查翻译完整性"
echo " --help 显示此帮助信息"
exit 0
;;
*)
print_error "未知参数: $arg"
echo "使用 --help 查看帮助信息"
exit 1
;;
esac
done
# 执行检查
check_requirements
# 执行翻译检查
if [ "$CHECK" = true ]; then
check_translations
exit $?
fi
# 清理(如果需要)
if [ "$CLEAN" = true ]; then
clean_generated
fi
# 生成多语言文件
generate_l10n
# 创建生成的导出文件
create_generated_l10n
# 验证生成的文件
verify_generated
echo ""
print_success "多语言生成完成!"
echo ""
print_info "生成的文件位置:"
echo " - lib/l10n/app_localizations.dart"
echo " - lib/l10n/app_localizations_*.dart"
echo " - lib/generated/l10n.dart"
echo ""
}
# 运行主函数
main "$@"
l10n.yaml配置
arb-dir: lib/l10n
template-arb-file: intl_en.arb
output-localization-file: app_localizations.dart
output-class: S
supported-locales:
- en
- ja
- zh