ACLocalized

Library for localizing UI of application on the fly.

version

Requirements

  • IOS 11 or above
  • Xcode 12.5 or above

Core

Singleton class for general bundle settings, locale and language.

public class ACLocalizedCore {
    public static let shared = ACLocalizedCore()
    
    public var coreBundle: Bundle
    public var defaultLanguage: ACLocalizedLanguage
    public var language: ACLocalizedLanguage
    public var supportedLanguages: [ACLocalizedLanguage]
    
    public func localizedString(key: String, table: String, args: CVarArg...) -> String
}

Strings

The library provides several types of localized strings. Each of them corresponds to the general protocol ACLocalizedStringProtocol. Which provides the translation of a localized string to String and NSAttributedString.

public protocol ACLocalizedStringProtocol {
    func toString() -> String
    func toAttributedString() -> NSAttributedString
}

ACLocalizedKeyString

Localized string that takes its value from localization tables by key.

public struct ACLocalizedKeyString {
   public let key: String
   public let table: String
   public let args: [CVarArg]
}

The string is received using the method from ACLocalizedCore:

extension ACLocalizedKeyString: ACLocalizedStringProtocol {
   
   public func toString() -> String {
       ACLocalizedCore.shared.localizedString(key: self.key, table: self.table, args: self.args)
   }
   
   public func toAttributedString() -> NSAttributedString {
       NSAttributedString(string: self.toString())
   }
   
}

ACLocalizedAttributedString

Localized string with attributes.

public struct ACLocalizedAttributedString {
   public let string: ACLocalizedStringProtocol
   public let attributes: [NSAttributedString.Key: Any]?
}

Any string corresponding to the ACLocalizedStringProtocol can be used as the string parameter. Attributes will be applied to the result from toString():

extension ACLocalizedAttributedString: ACLocalizedStringProtocol {
   
   public func toString() -> String {
       self.string.toString()
   }
   
   public func toAttributedString() -> NSAttributedString {
       NSAttributedString(string: self.toString(), attributes: self.attributes)
   }
   
}

If the value of the string parameter is ACLocalizedAttributedString then its attributes will be ignored.

ACLocalizedString

Represents a composition of various strings corresponding to the protocol ACLocalizedStringProtocol.

public struct ACLocalizedString {
    public var strings: [ACLocalizedStringProtocol]
}

Strings can contain any value. When translated into a string, they will be combined:

extension ACLocalizedString: ACLocalizedStringProtocol {
    
    public func toString() -> String {
        self.strings.reduce("", { $0 + $1.toString() })
    }
    
    public func toAttributedString() -> NSAttributedString {
        let result = NSMutableAttributedString()
        self.strings.forEach({ result.append($0.toAttributedString()) })
        
        return result
    }
    
}

Operations are also available:

  • ACLocalizedString = ACLocalizedString + ACLocalizedString
  • ACLocalizedString += ACLocalizedString
  • ACLocalizedString = “(ACLocalizedString)” (Interpolation)

UIKit

To support on the fly localization each UI-component implements properties that store localized strings. For example:

public extension UILabel {
    var textLocalized: ACLocalizedString?
    var attributedTextLocalized: ACLocalizedString?
}

When setting one of the localized properties, the localized string value will be set to the corresponding native property. For example, textLocalized corresponds to text. And when calling the <component_prefix>LocalizeIfNeeded() method, all set properties will be localized. For automatic localization, it is enough to create a base class for the UIViewController from which the rest of the viewControllers will be inherited. For example:

class AppViewController: UIViewController, ACLocalizedResponderProtocol {
    func applyLocalize() {}
    func didLocalized() {}

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        self.viewControllerLocalizeIfNeeded()
    }

}

Starting from viewControllerLocalizeIfNeeded() the <component_prefix>LocalizeIfNeeded() methods will be called for all UI-components:

func viewControllerLocalizeIfNeeded() {
    self.objectLocalizeIfNeeded()
    self.tabBarController?.tabBar.tabBarLocalizeIfNeeded()
    self.navigationController?.navigationBar.navigationBarLocalizeIfNeeded()
    self.navigationItem.objectLocalizeIfNeeded()
    self.tabBarItem.objectLocalizeIfNeeded()
    self.view.viewLocalizeIfNeeded()
}

SwiftGen Template

Documentation on template generation can be found here. Template files are here.

Demo

Small project demonstrating the interaction of ACLocalized modules in the application.

Install

Swift Package Manager(SPM) is Apple’s dependency manager tool. It is now supported in Xcode 11. So it can be used in all appleOS types of projects. It can be used alongside other tools like CocoaPods and Carthage as well.

Install package into your packages

Add a reference and a targeting release version in the dependencies section in Package.swift file:

import PackageDescription

let package = Package(
    name: "<your_project_name>",
    products: [],
    dependencies: [
        .package(url: "https://github.com/DPLibs/appcraft-localized-ios.git", from: "<current_version>")
    ]
)

Install package via Xcode

  1. Go to File -> Swift Packages -> Add Package Dependency...
  2. Then search for https://github.com/DPLibs/appcraft-localized-ios.git
  3. And choose the version you want

License

Distributed under the MIT License.

Author

Email: [email protected]

GitHub

View Github