You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI多语言适配:基于选中语言动态设置自定义字体的优化方案

优化多语言字体切换的实现方案

方案1:封装Font扩展+语言枚举映射

先通过枚举管理支持的语言,再把语言与字体的对应关系集中封装到Font扩展中,避免分散的条件判断:

// 用枚举管理支持的语言,避免字符串拼写错误
enum AppLanguage: String {
    case en, ar, tr, ku, fa
    // 新增语言只需在这里加case
}

extension Font {
    // 定义字体样式,区分粗细和字号
    enum TextStyle {
        case regular(size: CGFloat)
        case bold(size: CGFloat)
        
        var size: CGFloat {
            switch self {
            case .regular(let size), .bold(let size):
                return size
            }
        }
    }
    
    static func forLanguage(_ language: AppLanguage, style: TextStyle) -> Font {
        let fontName: String
        switch (language, style) {
        case (.en, .bold):
            fontName = "bahij_bold"
        case (.en, .regular):
            fontName = "bahij_regular"
        case (.ar, .bold):
            fontName = "arabic_font_bold"
        case (.ar, .regular):
            fontName = "arabic_font_regular"
        case (.tr, .bold):
            fontName = "turkish_font_bold"
        case (.tr, .regular):
            fontName = "turkish_font_regular"
        case (.ku, .bold):
            fontName = "kurdish_font_bold"
        case (.ku, .regular):
            fontName = "kurdish_font_regular"
        case (.fa, .bold):
            fontName = "persian_font_bold"
        case (.fa, .regular):
            fontName = "persian_font_regular"
        }
        return .custom(fontName, size: style.size)
    }
}

使用时直接调用扩展方法,代码简洁:

// 假设currentLanguage是当前选中的AppLanguage枚举值
Text("txt_language")
    .font(.forLanguage(currentLanguage, style: .bold(size: 14)))

方案2:结合Environment的全局字体Modifier

如果希望视图不用手动传递语言参数,可通过Environment全局共享当前语言,再封装自定义Modifier:

  1. 定义EnvironmentKey传递语言
struct CurrentLanguageKey: EnvironmentKey {
    static let defaultValue: AppLanguage = .en
}

extension EnvironmentValues {
    var currentLanguage: AppLanguage {
        get { self[CurrentLanguageKey.self] }
        set { self[CurrentLanguageKey.self] = newValue }
    }
}
  1. 封装自动读取环境语言的Modifier
struct LanguageFontModifier: ViewModifier {
    @Environment(\.currentLanguage) private var currentLanguage
    let style: Font.TextStyle
    
    func body(content: Content) -> some View {
        content.font(.forLanguage(currentLanguage, style: style))
    }
}

extension View {
    func languageFont(style: Font.TextStyle) -> some View {
        modifier(LanguageFontModifier(style: style))
    }
}
  1. 在App入口注入环境变量
@main
struct MultiLangApp: App {
    @State private var selectedLanguage: AppLanguage = .en
    
    var body: some Scene {
        WindowGroup {
            ContentView()
                .environment(\.currentLanguage, selectedLanguage)
                // 绑定语言切换控件,比如Picker
                .toolbar {
                    Picker("Language", selection: $selectedLanguage) {
                        Text("English").tag(AppLanguage.en)
                        Text("Arabic").tag(AppLanguage.ar)
                        // 其他语言选项
                    }
                }
        }
    }
}
  1. 视图中直接使用Modifier
Text("txt_language")
    .languageFont(style: .bold(size: 14))

方案优势

  • 扩展性强:新增语言只需在枚举和Font扩展的switch中添加对应分支,无需修改所有视图代码
  • 代码简洁:避免重复的.if判断,视图层只需关注字体样式,无需处理语言逻辑
  • 类型安全:用枚举代替字符串管理语言,减少拼写错误

内容的提问来源于stack exchange,提问作者Rebin A. Dev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 15:55:27