You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
session-ios/SessionUtilitiesKit/General/Localization.swift

96 lines
2.9 KiB
Swift

// Copyright © 2024 Rangeproof Pty Ltd. All rights reserved.
// stringlint:disable
import UIKit
// MARK: - PendingLocalizedString
final public class LocalizationHelper: CustomStringConvertible {
private let template: String
private var replacements: [String : String] = [:]
private var numbers: [Int] = []
// MARK: - Initialization
public init(template: String) {
self.template = template
}
// MARK: - DSL
public func put(key: String, value: CustomStringConvertible) -> LocalizationHelper {
replacements[key] = value.description
return self
}
public func putNumber(_ number: Int, index: Int) -> LocalizationHelper {
self.numbers.insert(number, at: index)
return self
}
public func localized() -> String {
guard !Dependencies.unsafeNonInjected[feature: .showStringKeys] else {
return "[\(template)]"
}
// Use English as the default string if the translation is empty
let defaultString: String = {
if let englishPath = Bundle.main.path(forResource: "en", ofType: "lproj"), let englishBundle = Bundle(path: englishPath) {
return englishBundle.localizedString(forKey: template, value: nil, table: nil)
} else {
return ""
}
}()
// If the localized string matches the key provided then the localisation failed
var localizedString: String = NSLocalizedString(template, value: defaultString, comment: "")
// Deal with plurals
// Note: We have to deal with plurals first, so we can get the correct string
if !self.numbers.isEmpty {
localizedString = String(
format: localizedString,
locale: .current,
arguments: self.numbers
)
}
for (key, value) in replacements {
localizedString = localizedString.replacingOccurrences(of: tokenize(key), with: value)
}
// Replace html tag "<br/>" with "\n"
localizedString = localizedString.replacingOccurrences(of: "<br/>", with: "\n")
return localizedString
}
// MARK: - Internal functions
private func tokenize(_ key: String) -> String {
return "{" + key + "}"
}
// MARK: - CustomStringConvertible
public var description: String {
// Fallback to the localized
return self.localized()
}
}
public extension String {
func put(key: String, value: CustomStringConvertible) -> LocalizationHelper {
return LocalizationHelper(template: self).put(key: key, value: value)
}
func putNumber(_ number: Int, index: Int = 0) -> LocalizationHelper {
return LocalizationHelper(template: self).putNumber(number, index: index)
}
func localized() -> String {
return LocalizationHelper(template: self).localized()
}
}