локализация раскадровки в swift 4.0 - PullRequest
0 голосов
/ 25 июня 2018

Я хочу реализовать локализацию раскадровки на быстром языке. (означает, что я хочу локализации для метки исправления и текста кнопки)

У меня уже есть представление о NSLocalizedString, но я не хочу писать код для исправления текста. Метка

например,

NSLocalizedString("Welcome", comment: "")

Я уже добавил файл Localizable.strings, а также файл Main.string для определенного языка. но я не могу добиться успеха в реализации локализации

Ответы [ 4 ]

0 голосов
/ 27 февраля 2019

enter image description here

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: "")
    }
}
0 голосов
/ 25 июня 2018

Выполните следующие шаги, чтобы локализовать элементы раскадровки:

  1. Нажмите на ваш проект.
  2. В разделе Локализации нажмите значок + и добавьте язык, который хотите локализовать.
  3. Как только вы добавите язык, вы увидите файл String этого языка.
  4. Перейдите на раскадровку и нажмите на элемент пользовательского интерфейса, который вы хотите локализовать.
  5. Выберите инспектора идентификации, в части документа вы увидите Идентификатор объекта , который нам нужно использовать для локализации этого элемента.
  6. Теперь перейдите к файлу локализации, созданному на шаге 3.
  7. В этом строковом файле вы увидите Идентификатор объекта элементов. Измените значение ключа Object ID , которое будет отображаться только для данного языка.

enter image description here

enter image description here enter image description here

0 голосов
/ 25 июня 2018

После того, как вы запустили локализацию, вы можете добавить расширения для элементов пользовательского интерфейса, предоставив им простую локализацию.

Для UIlabel это будет выглядеть примерно так:

public extension UILabel {

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

}

@IBInspectable позволяет вам установить ключ локализации либо с раскадровки, либо с точки зрения программ.

Локализация раскадровки - это способ Apple, но он меня сильно беспокоит - наверняка не самый удобный для программиста.

0 голосов
/ 25 июня 2018

Bhumesh

Я использовал эту библиотеку для локализации в приложении. Который очень прост в использовании.

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

Теперь Для поддержки раскадровки я создал расширение, созданное следующим образом: IBDesignable Так что вы можете легко предоставить локализованный текст из самой раскадровки

1) Добавить это в новый файл swift

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 устанавливает класс для метки и предоставляет ключ

enter image description here

3) Запустить и проверить

...