Hermes Agent 36967370fd SwiftBricks: Bricks JSON UI framework native Swift/SwiftUI implementation
- Core: Schema (Codable), Store, EventBus, RPC, Engine, I18n
- Controls: Text, Title1-6, Label, Input, Textarea, Number, Date, Button, Select
  VBox, HBox, ScrollPanel, DynamicColumn, Tabular, Form, InlineForm,
  TabView, Menu, PopupWindow, Html, Image, UrlWidget
- Renderer: BricksView (main entry), ControlRenderer (recursive dispatch)
- 30+ widget types, 9 bind actiontypes
- Form validation (required/minlength/maxlength/min/max/email/number/pattern)
- i18n with multi-language JSON files
- 18 tests covering schema parsing, store, i18n, events
2026-06-21 12:12:03 +08:00

88 lines
2.5 KiB
Swift
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import Foundation
/// Bricksi18n
/// JSON
@MainActor
public final class BricksI18n: ObservableObject {
/// 2: zh, en, ja, ko
@Published public var locale: String = "zh"
/// : key translated text
@Published public var messages: [String: String] = [:]
/// i18n
public var enabled: Bool = true
/// i18n
public var basePath: String = ""
public init(locale: String = "zh") {
self.locale = locale
}
// MARK: -
///
public func loadMessages(_ dict: [String: String]) {
messages = dict
}
/// JSON
public func loadJSON(_ jsonString: String) {
guard let data = jsonString.data(using: .utf8),
let dict = try? JSONSerialization.jsonObject(with: data) as? [String: String] else { return }
messages = dict
}
/// URL
public func loadFromURL(_ url: String) async {
guard let urlObj = URL(string: url) else { return }
do {
let (data, _) = try await URLSession.shared.data(from: urlObj)
if let dict = try? JSONSerialization.jsonObject(with: data) as? [String: String] {
messages = dict
}
} catch {
print("[SwiftBricks i18n] Failed to load: \(error)")
}
}
/// i18n
/// : {basePath}/i18n/{locale}/i18n.json
public func loadLocale(_ lang: String) async {
locale = lang
guard enabled else { return }
let url = "\(basePath)/i18n/\(lang)/i18n.json"
await loadFromURL(url)
}
// MARK: -
/// i18n_getmsgs
public func t(_ key: String) -> String {
guard enabled else { return key }
return messages[key] ?? key
}
///
public func translate(_ text: String) -> String {
t(text)
}
// MARK: -
public static let supportedLocales = ["zh", "en", "ja", "ko"]
public static func localeName(_ code: String) -> String {
switch code {
case "zh": return "中文"
case "en": return "English"
case "ja": return "日本語"
case "ko": return "한국어"
default: return code
}
}
}