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

iOS端旁遮普语文本加载及多语言同步显示技术咨询

iOS端旁遮普语文本加载与多语言同步显示解决方案

嘿,我来帮你搞定这两个iOS开发里的问题,都是和旁遮普语(尤其是古木基脚本)相关的,咱们一步步来拆解:

1. 如何在iOS端加载旁遮普语文本

iOS默认系统字体对古木基(Gurmukhi)脚本的支持有限,要正常显示旁遮普语文本,得做好这几步:

  • 导入支持古木基的字体
    先下载一款支持古木基脚本的字体,比如Google的Noto Sans Gurmukhi,把字体文件(比如NotoSansGurmukhi-Regular.ttf)添加到Xcode项目里,别忘了在Target -> Build Phases -> Copy Bundle Resources里确认字体已被包含。

  • 在Info.plist中注册字体
    打开Info.plist,添加Fonts provided by application数组,把字体文件名(比如NotoSansGurmukhi-Regular.ttf)作为元素加进去,这样App才能识别到自定义字体。

  • 代码中指定字体
    显示旁遮普语文本时,给对应的UILabel或UITextView设置自定义字体:

    // Swift示例
    if let gurmukhiFont = UIFont(name: "NotoSansGurmukhi-Regular", size: 17) {
        punjabiLabel.font = gurmukhiFont
    } else {
        //  fallback到系统字体
        punjabiLabel.font = UIFont.systemFont(ofSize: 17)
    }
    
  • 确保文本编码正确
    后端返回的旁遮普语文本必须是UTF-8编码的Unicode字符串,解析JSON时用iOS默认的解析器(比如Swift的JSONSerialization或Codable)就行,别手动转码,避免乱码。

2. 实现旁遮普语、古木基旁遮普语与英语内容的同步显示

基于你提供的后端响应数据,咱们按以下步骤实现同步显示:

第一步:解析后端响应数据

先把后端返回的字典格式转换成iOS端可用的模型(用Swift的Codable更简洁):

struct BaniResponse: Codable {
    let akIndex: String?
    let ang: Int?
    let author: String?
    let bani: String?
    let baniID: String?
    let english: String?
    let englishInitials: String?
    
    // 映射后端蛇形键名到Swift驼峰命名
    enum CodingKeys: String, CodingKey {
        case akIndex = "AK_Index"
        case ang = "Ang"
        case author = "Author"
        case bani = "Bani"
        case baniID = "Bani_ID"
        case english = "English"
        case englishInitials = "English_Initials"
    }
}

// 解析示例
if let jsonData = responseData.data(using: .utf8) {
    do {
        let baniResponse = try JSONDecoder().decode(BaniResponse.self, from: jsonData)
        // 解析成功后更新UI
        updateUI(with: baniResponse)
    } catch {
        print("JSON解析失败: \(error)")
    }
}

第二步:设计UI布局

用UIStackView垂直排列三个标签,分别对应古木基旁遮普语(AK_Index字段)、旁遮普语(Bani字段)、英语:

func setupUI() {
    let stackView = UIStackView()
    stackView.axis = .vertical
    stackView.spacing = 12
    stackView.translatesAutoresizingMaskIntoConstraints = false
    
    // 古木基旁遮普语标签
    let gurmukhiLabel = UILabel()
    gurmukhiLabel.numberOfLines = 0
    if let font = UIFont(name: "NotoSansGurmukhi-Regular", size: 18) {
        gurmukhiLabel.font = font
    }
    gurmukhiLabel.tag = 100
    
    // 旁遮普语标签
    let punjabiLabel = UILabel()
    punjabiLabel.numberOfLines = 0
    punjabiLabel.font = UIFont.systemFont(ofSize: 17)
    punjabiLabel.tag = 101
    
    // 英语标签
    let englishLabel = UILabel()
    englishLabel.numberOfLines = 0
    englishLabel.font = UIFont.systemFont(ofSize: 16)
    englishLabel.textColor = .gray
    englishLabel.tag = 102
    
    stackView.addArrangedSubview(gurmukhiLabel)
    stackView.addArrangedSubview(punjabiLabel)
    stackView.addArrangedSubview(englishLabel)
    
    view.addSubview(stackView)
    
    // 添加约束
    NSLayoutConstraint.activate([
        stackView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 16),
        stackView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -16),
        stackView.centerYAnchor.constraint(equalTo: view.centerYAnchor)
    ])
}

第三步:同步更新UI内容

解析完数据后,把对应字段赋值给标签,同时处理空值情况:

func updateUI(with response: BaniResponse) {
    // 古木基旁遮普语内容
    if let gurmukhiText = response.akIndex {
        if let label = view.viewWithTag(100) as? UILabel {
            label.text = gurmukhiText
            label.isHidden = false
        }
    } else {
        view.viewWithTag(100)?.isHidden = true
    }
    
    // 旁遮普语内容(处理空值)
    if let punjabiText = response.bani, !punjabiText.isEmpty {
        if let label = view.viewWithTag(101) as? UILabel {
            label.text = punjabiText
            label.isHidden = false
        }
    } else {
        view.viewWithTag(101)?.isHidden = true
        // 也可以设置占位符:label.text = "暂无旁遮普语内容"
    }
    
    // 英语内容
    if let englishText = response.english {
        if let label = view.viewWithTag(102) as? UILabel {
            label.text = englishText
            label.isHidden = false
        }
    } else {
        view.viewWithTag(102)?.isHidden = true
    }
}

小提示

  • 后端返回的Bani字段是<null>,可以选择隐藏对应标签,或者显示“暂无内容”的占位符
  • 古木基脚本的字号建议稍大一点,提升可读性
  • 如果AK_Index字段是古木基旁遮普语,一定要用自定义字体,否则会显示方块乱码

内容的提问来源于stack exchange,提问作者Jas_meet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:35:20