SwiftUI中如何根据当前Locale为文本设置不同字体?
解决方案:根据Locale自动切换字体
因为@Environment只能在View或ViewModifier的上下文里使用,直接扩展Font类无法读取环境变量,所以我们可以通过自定义ViewModifier来实现需求,下面提供两种简洁的实现方式:
方式一:通用化的多样式支持
先定义一个支持多种字体样式的ViewModifier,后续可以轻松扩展更多样式:
// 定义字体样式枚举,方便扩展 enum AppFontStyle { case title case headline case body } // 自定义Modifier处理Locale判断和字体切换 struct LocalizedFontModifier: ViewModifier { @Environment(\.locale) private var locale private let style: AppFontStyle init(style: AppFontStyle) { self.style = style } func body(content: Content) -> some View { content.font(resolveFont()) } private func resolveFont() -> Font { let isKurdish = locale.identifier == "ku" switch style { case .title: return isKurdish ? Font.custom("rabar_013", size: 30) : .title case .headline: return isKurdish ? Font.custom("rabar_013", size: 24) : .headline case .body: return isKurdish ? Font.custom("rabar_013", size: 17) : .body } } } // 给View做扩展,简化调用 extension View { func appFont(_ style: AppFontStyle) -> some View { modifier(LocalizedFontModifier(style: style)) } }
调用方式:
Text("Test") // 配合Localizable.strings自动切换中英文/库尔德语文本 .appFont(.title)
方式二:针对单一样式的极简实现
如果只需要支持title这一种样式,可以直接写更简洁的扩展:
extension View { func myTitleFont() -> some View { modifier(MyTitleFontModifier()) } } private struct MyTitleFontModifier: ViewModifier { @Environment(\.locale) private var locale func body(content: Content) -> some View { let targetFont = locale.identifier == "ku" ? Font.custom("rabar_013", size: 30) : Font.title return content.font(targetFont) } }
调用方式:
Text("Test") .myTitleFont()
注意事项
- 确保自定义字体
rabar_013已正确导入项目,并且在Info.plist的Fonts provided by application中配置了对应字体文件名 - 文本内容的多语言切换需要依赖项目中的
Localizable.strings文件,分别维护英文和库尔德语的对应翻译
内容的提问来源于stack exchange,提问作者Enos
相关产品推荐
相关产品推荐

