storyboard localization in swift 4.0

早过忘川 提交于 2019-12-13 02:57:53

问题


I want to implement storyboard localization in swift language. (means I want to localization for fix label and button text)

I have already idea about NSLocalizedString but I dont want to code for fix text Label

for e.g

NSLocalizedString("Welcome", comment: "")

I have already add Localizable.strings file as well as Main.string file for particular language. but I can not success in implement Localization


回答1:


Bhumesh

I have used this library for in - app localisation. Which is very easy to use.

https://github.com/marmelroy/Localize-Swift

Now For Storyboard support I have Created Following extension that is IBDesignable So you can easily provide localised text from storyboard itself

1 ) Add This into new swift file

import Localize_Swift

@IBDesignable class LocalizableLabel: UILabel {

    @IBInspectable var table :String? // Table 
    @IBInspectable var key:String? // KEY 

    @IBInspectable var extraTextToAppend:String? // Some text need to append , if any


    override func awakeFromNib() {
        guard let key = key else {return}
        self.text = key.localized(using: table)
        NotificationCenter.default.addObserver(self, selector: #selector(setText), name: NSNotification.Name(LCLLanguageChangeNotification), object: nil)

        if let extraText = self.extraTextToAppend, let text = self.text {
            self.text = text + extraText
        }

    }

    @objc func setText () {
        guard let key = key else {return}
        self.text = key.localized(using: table)

        if let extraText = self.extraTextToAppend, let text = self.text {
            self.text = text + extraText
        }


    }

}

@IBDesignable class LocalizableButton: UIButton {

    @IBInspectable var table :String?
    @IBInspectable var key:String?

    override func awakeFromNib() {
        guard let key = key else {return}
        self.setTitle(key.localized(using: table), for: .normal)

        if let attributedText = self.attributedTitle(for: .normal) {
            let mutableAttributedText = NSMutableAttributedString(attributedString: attributedText)
            mutableAttributedText.replaceCharacters(in: NSMakeRange(0, mutableAttributedText.length), with: key.localized(using: table))
            self.setAttributedTitle(mutableAttributedText, for: .normal)
        }

        NotificationCenter.default.addObserver(self, selector: #selector(setText), name: NSNotification.Name(LCLLanguageChangeNotification), object: nil)

    }

    @objc func setText () {
        guard let key = key else {return}
        self.setTitle(key.localized(using: table), for: .normal)

        if let attributedText = self.attributedTitle(for: .normal) {
            let mutableAttributedText = NSMutableAttributedString(attributedString: attributedText)
            mutableAttributedText.replaceCharacters(in: NSMakeRange(0, mutableAttributedText.length), with: key.localized(using: table))
            self.setAttributedTitle(mutableAttributedText, for: .normal)

        }
    }

}



@IBDesignable class LocalizeUINavigationItem: UINavigationItem {

    @IBInspectable var table :String?
    @IBInspectable var key:String?

    override func awakeFromNib() {
        guard let key = key else {return}
        self.title = key.localized(using: table)
        NotificationCenter.default.addObserver(self, selector: #selector(setText), name: NSNotification.Name(LCLLanguageChangeNotification), object: nil)

    }

    @objc func setText () {
        guard let key = key else {return}
        self.title = key.localized(using: table)

    }

}


@IBDesignable class LocalizableUITextField: UITextField {

    @IBInspectable var table_placeholder :String?
    @IBInspectable var key_place_holder:String?

    override func awakeFromNib() {
        guard let key = key_place_holder else {return}
        self.placeholder = key.localized(using: table_placeholder)
        NotificationCenter.default.addObserver(self, selector: #selector(setText), name: NSNotification.Name(LCLLanguageChangeNotification), object: nil)

    }

    @objc func setText () {
        guard let key = key_place_holder else {return}
        self.placeholder = key.localized(using: table_placeholder)

    }

}

2) Goto Storyboard set class to label and provide the key

3) Run and test




回答2:


Follow below steps to localize Storyboard Elements:

  1. Click on your project.
  2. In Localizations section click on + icon and add language that you want to localize.
  3. Once you add language you will see String file of that language.
  4. Go to storyboard and click on UI Element that you want to localize.
  5. Select identity inspector, In Document portion you will see Object ID that we need to use for localize that element.
  6. Now goto localization file that created from step 3.
  7. In that string file you will see Object ID of elements. Change value of that Object ID key it will reflect to that particular language only.




回答3:


Once you have your localisation running, you can add extensions for UI elements, introducing easy localisation for them.

For UIlabel it will looks something like this:

public extension UILabel {

    @IBInspectable public var localizedText: String? {
        get {
            return text
        }
        set {
            text = NSLocalizedString(newValue ?? "", comment: "")
        }
    }

}

The @IBInspectable allows you setting the localisation key either from the storyboard and programatically too.

The storyboard localisation is the Apple provided way, but it bugs me a lot - not the most programmer-friendly for sure.




回答4:


class ViewController: UIViewController {

    @IBOutlet weak var resetOutlet: MyButton! {
        didSet {
            resetOutlet.setTitle("RESET".localized().uppercased(), for: .normal)
        }
    }
}

extension String {

    func localized(tableName: String = "Localizable") -> String {
        if let languageCode = Locale.current.languageCode, let preferredLanguagesFirst = Locale.preferredLanguages.first?.prefix(2)  {
            if languageCode != preferredLanguagesFirst {
                if let path = Bundle.main.path(forResource: "en", ofType: "lproj") {
                    let bundle = Bundle.init(path: path)
                    return NSLocalizedString(self, tableName: tableName, bundle: bundle!, value: self, comment: "")
                }
            }
            }
        return NSLocalizedString(self, tableName: tableName, value: self, comment: "")
    }
}


来源:https://stackoverflow.com/questions/51018376/storyboard-localization-in-swift-4-0

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!