Подтвердить что ты не робот

Могу ли я связать uilabel с локализуемой строкой в ​​Interface Builder?

googled вокруг, но не нашли решения:

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

class LozalizedLabel : UILabel {

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

        }
    }
}

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

введите описание изображения здесь

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

введите описание изображения здесь

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

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

Ответ 3

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

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

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

- (void) viewDidLoad {
   [supper viewDidLoad];

   self.someLabel.text = NSLocalizedString(@"Some Label", @"Some label on some view.");
}

Ответ 4

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

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

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

  • Все соображения для перевода и длины строки по-прежнему применяются, но вам нужно коснуться только исходного xib, другие языки могут быть обновлены с помощью script.
  • Вы видите уже переведенные элементы и различные возможные состояния для каждого UIElement из сбрасываемого файла.
  • У вас будет больше файлов с одиночными строками для отправки вашему переводчику, но легче просмотреть обзор того, какая часть нуждается в переводе, какая часть выполнена.
  • 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.

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

Ответ 5

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

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

Обратитесь к Документация Apple о интернационализации базы данных.

Ответ 6

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

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

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

Ответ 7

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

enter image description here