Files
ggbond268--mactools/Sources/Core/Plugins/Dynamic/PluginLocalizedMetadata.swift
T
wehub-resource-sync 1d1286fadb
Build / Build and test (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:18:38 +08:00

68 lines
2.3 KiB
Swift

import Foundation
import MacToolsPluginKit
struct PluginLocalizedMetadata: Codable, Equatable {
let displayName: String?
let summary: String?
init(displayName: String? = nil, summary: String? = nil) {
self.displayName = displayName
self.summary = summary
}
}
enum PluginLocalizationMatcher {
static func localizedMetadata(
from metadataByLanguage: [String: PluginLocalizedMetadata],
preferredLanguages: [String]? = nil,
userDefaults: UserDefaults = .standard
) -> PluginLocalizedMetadata? {
guard !metadataByLanguage.isEmpty else {
return nil
}
for language in preferredLanguages ?? effectivePreferredLanguages(in: userDefaults) {
let candidates = candidateLanguageIdentifiers(for: language)
for candidate in candidates {
if let exact = metadataByLanguage[candidate] {
return exact
}
if let caseInsensitive = metadataByLanguage.first(where: {
$0.key.caseInsensitiveCompare(candidate) == .orderedSame
})?.value {
return caseInsensitive
}
}
}
return metadataByLanguage["en"]
?? metadataByLanguage["zh-Hans"]
?? metadataByLanguage.values.first
}
private static func effectivePreferredLanguages(in userDefaults: UserDefaults) -> [String] {
if userDefaults === UserDefaults.standard {
return PluginRuntimeLocalization.preferredLanguages
}
if let preference = userDefaults.string(forKey: PluginRuntimeLocalization.preferenceUserDefaultsKey),
preference != "system" {
return [preference]
}
// Keep this fallback for manifest decoding in isolated stores and
// backwards-compatible callers that explicitly provide AppleLanguages.
if let appleLanguages = userDefaults.stringArray(forKey: "AppleLanguages"),
!appleLanguages.isEmpty {
return appleLanguages
}
return Locale.preferredLanguages
}
private static func candidateLanguageIdentifiers(for language: String) -> [String] {
PluginRuntimeLocalization.candidateLanguageIdentifiers(for: language)
}
}