Flutter 多语言

依赖:

复制代码
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
相关推荐
by————组态2 小时前
集成详细说明
前端·物联网·信息可视化·组态·组态软件
我是小疯子663 小时前
jQuery快速入门指南
前端
傻啦嘿哟3 小时前
Python中的@property:优雅控制类成员访问的魔法
前端·数据库·python
北辰alk3 小时前
Vue 自定义指令生命周期钩子完全指南
前端·vue.js
是小崔啊3 小时前
03-vue2
前端·javascript·vue.js
getapi3 小时前
在 Google Play 上更新你已上架的 Flutter 应用
flutter·googlecloud·web app
学习非暴力沟通的程序员3 小时前
Karabiner-Elements 豆包语音输入一键启停操作手册
前端
Jing_Rainbow3 小时前
【 前端三剑客-39 /Lesson65(2025-12-12)】从基础几何图形到方向符号的演进与应用📐➡️🪜➡️🥧➡️⭕➡️🛞➡️🧭
前端·css·html
刘羡阳3 小时前
使用Web Worker的经历
前端·javascript