// 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 { // If the localized string matches the key provided then the localisation failed var localizedString: String = NSLocalizedString(template, comment: "") for (key, value) in replacements { localizedString = localizedString.replacingOccurrences(of: tokenize(key), with: value) } // Replace html tag "
" with "\n" localizedString = localizedString.replacingOccurrences(of: "
", with: "\n") // Deal with plurals if !self.numbers.isEmpty { localizedString = String( format: localizedString, locale: .current, arguments: self.numbers ) } 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() } }