Могу ли я связать uilabel с локализуемой строкой в ​​Интерфейсном Разработчике? - PullRequest
12 голосов
/ 14 сентября 2011

погуглил, но не нашел решения:

По сути, у меня настроен Localizable.strings, который я использую в своем коде.Тем не менее, было бы очень приятно, если бы я как-то мог просто ссылаться на эти значения в моем XIB, чтобы я мог избежать создания одного раздражающего XIB для каждого языка ...

Возможно ли это?

Ответы [ 9 ]

16 голосов
/ 14 сентября 2011

Вы можете реализовать подкласс UILabel и сделать так, чтобы он автоматически извлекал локализованное значение, когда оно инициализируется из пера. В XIB вы тогда просто установите токен (или английский текст, если хотите), и UILabel извлечет локализованный текст из этого значения.

9 голосов
/ 31 августа 2017

Я представляю вам быстрый путь

1. Создать подкласс UILabel

class LozalizedLabel : UILabel {

    @IBInspectable var keyValue: String {
        get {
            return self.text!
        }
        set(value) {
            self.text = NSLocalizedString(value, comment: "")

        }
    }
}

2. Установить класс LocalizedLabel в IB

enter image description here

3. Введите ваш ключ из Localizable.strings непосредственно в IB

enter image description here

Вуаля, теперь трать меньше времени на создание бесполезных IBOutlets только для того, чтобы сделать его локализуемой UILabel.

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

5 голосов
/ 14 сентября 2011

NSLocalizedString имеет преимущество в простоте реализации. Риск в том, что вы можете забыть добавить запись для нового элемента Gui.

Вы можете использовать itool для выгрузки строки из исходного файла XIB, перевода этих выгруженных строк и затем загрузки переведенной строки в файл other-language-xib.

Есть некоторые преимущества в этом способе по сравнению с NSLocalizedString.

  • Все соображения по переводу и длине строки по-прежнему применимы, но вам нужно прикоснуться только к исходному xib, остальные языки могут быть обновлены скриптом.
  • Вы видите уже переведенные элементы и различные возможные состояния для каждого элемента UIE из сохраненного файла.
  • У вас будет больше одностроковых файлов для отправки вашему переводчику, но вам будет легче следить за тем, какая часть нуждается в переводе, какая часть выполнена.
  • GUI Изменения, внесенные в английский xib, применяются к локализованному xib, вы в основном объединяете оригинальный xib с переведенными строками.

Когда вы создаете XIB, вы устанавливаете его как локализованный (как и раньше), затем запускаете itool против этого исходного xib, чтобы извлечь строки. Переведите файл строк на нужный язык, затем загрузите перевод в локализованный xib.

Если вы используете Google для ibtool --generate-strings-file, вы должны найти несколько учебных пособий и примеров.

Синтаксис должен быть похож на:

  #dump original xib to a $xibfile.strings file:
  ibtool --generate-strings-file Resources/English.lproj/$xibfile.strings Resources/English.lproj/$xibfile.xib
  # offline: translate the $xibfile.xib, place it into the correct lproj folder
  # then: merge translated $xibfile.strings with original xib to create localized xib
  ibtool --strings-file Resources/de.lproj/$xibfile.strings --write Resources/de.lproj/$xibfile.xib Resources/English.lproj/$xibfile.xib

$xibfile.strings в каталоге Resources / English.lproj будет содержать исходные (на английском языке) строки. Переведенный $xibfile.strings должен находиться в соответствующем каталоге xx.lproj.

Если вы добавите скрипт сборки в xcode, то загрузка трансляции будет вызываться при каждой сборке.

5 голосов
/ 14 сентября 2011

Невозможно выполнить настройку непосредственно из Localizable.strings с помощью Interface Builder.

Причина, по которой вы, возможно, захотите перевести NIB, заключается в том, что длина слов может варьироваться в зависимости от языка. Таким образом, вы можете изменить расположение пера для каждого языка.

Что вы могли бы установить их в методе viewDidLoad вашего UIViewController.

- (void) viewDidLoad {
   [supper viewDidLoad];

   self.someLabel.text = NSLocalizedString(@"Some Label", @"Some label on some view.");
}
4 голосов
/ 05 января 2015

IB не может использовать строки из Localizable.strings , но есть другая опция, называемая Базовая интернационализация.

Короче говоря : вы можетесоздайте отдельный файл .strings, прикрепленный к xib / storyboard для каждого необходимого языка.В результате вы получите xib с собственными переводами для каждого языка.Таким образом, он может дублировать некоторые значения, которые есть в Localizable.strings, но это более понятный способ, чем установка через код или копирование файлов xib.

Пожалуйста, обратитесь к Документации Apple оБазовая интернационализация.

1 голос
/ 14 сентября 2011

Вы можете сделать это в коде:

    label.text = NSLocalizedString(@"key", @"comment");

Но я не думаю, что есть способ сделать это только с помощью перьев, кроме локализации всего кончика. Я конечно не нашел другого пути в прошлом.

0 голосов
/ 06 ноября 2018

Это моя версия. Надеюсь, это поможет.

extension UILabel {

    /// The IBInspectable helps us to set localizable text in IB
    @IBInspectable var localizableText: String? {
        get { return text }
        set(value) { text = value?.localized() }
    }


    /// The IBInspectable helps us to set localizable text in IB
    @IBInspectable var localizableUppercaseText: String? {
        get { return text }
        set(value) { text = value?.localized().uppercased() }
    }
}

extension String {

    func localized(bundle: Bundle = .main, tableName: String = "Localizable") -> String {
        return NSLocalizedString(self, tableName: tableName, value: "**\(self)**", comment: "")
    }

}
0 голосов
/ 28 февраля 2018

Еще один быстрый способ, но с расширением:

extension UILabel {
    static var localizedKey:UInt8 = 0

    @IBInspectable public var localizationKey: String? {
        set {
            objc_setAssociatedObject(self, &UILabel.localizedKey, newValue, .OBJC_ASSOCIATION_RETAIN)
        }
        get {
            return objc_getAssociatedObject(self, &UILabel.localizedKey) as? String
        }
    }

    open override func awakeFromNib() {
        super.awakeFromNib()
        if let localizationKey = self.localizationKey {
            self.text = NSLocalizedString(localizationKey, comment: "")
        }
    }
}

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

0 голосов
/ 14 мая 2015

Поддерживаемый Apple способ локализации .xib-файла. Это позволяет локализовать текст и макет для каждого языка / страны.

enter image description here

...