68 lines
2.3 KiB
Swift
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)
|
|
}
|
|
}
|