Library for localizing UI of application on the fly.



  • IOS 11 or above
  • Xcode 12.5 or above


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


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


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())


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 {
   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.


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)


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) {



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

func viewControllerLocalizeIfNeeded() {

SwiftGen Template

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


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


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: "", from: "<current_version>")

Install package via Xcode

  1. Go to File -> Swift Packages -> Add Package Dependency...
  2. Then search for
  3. And choose the version you want


Distributed under the MIT License.


Email: [email protected]


View Github