Могу ли я связать uilabel с локализуемой строкой в Интерфейсном Разработчике?
Погуглил, но не нашел решения:
По сути, у меня настроен Localizable.strings, который я использую в своем коде. Тем не менее, было бы очень приятно, если бы я как-то мог просто ссылаться на эти значения и в моем XIB, чтобы я мог избежать создания одного раздражающего XIB для каждого языка...
Это возможно?
9 ответов
Вы могли бы реализовать подкласс UILabel и сделать так, чтобы он автоматически извлекал локализованное значение, когда оно инициализируется из пера. В XIB вы тогда просто установите токен (или английский текст, если хотите), и UILabel извлечет локализованный текст из этого значения.
Я представляю вам быстрый путь
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
Вуаля, теперь трать меньше времени на создание бесполезных IBOutlets только для того, чтобы сделать его локализуемым UILabel.
ПРИМЕЧАНИЕ. Это не приводит к тому, что локализованная строка отображается в конструкторе интерфейса, а просто "ключ". Поэтому при создании вашего TextView не забывайте устанавливать ограничения соответствующим образом
NSLocalizedString
имеет преимущество в простоте реализации. Риск в том, что вы можете забыть добавить запись для нового элемента Gui.
Ты можешь использовать itool
чтобы выгрузить строку из исходного файла xib, переведите эти выведенные строки и затем загрузите переведенную строку в файл other-language-xib.
Есть некоторые преимущества в этом отношении по сравнению с NSLocalizedString
,
- Все соображения по переводу и длине строки по-прежнему применимы, но вам нужно коснуться только оригинального xib, остальные языки могут быть обновлены скриптом.
- Вы видите уже переведенные элементы и различные возможные состояния для каждого 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, загрузка трансляции будет вызываться при каждой сборке.
Там нет никакого способа установить тогда из Localizable.strings
непосредственно с Интерфейсным Разработчиком.
Причина, по которой вы можете захотеть перевести NIB, заключается в том, что длина слов может различаться в зависимости от языка. Таким образом, вы можете изменить расположение перьев для каждого языка.
Что вы могли бы установить их в viewDidLoad
метод вашего UIViewController
,
- (void) viewDidLoad {
[supper viewDidLoad];
self.someLabel.text = NSLocalizedString(@"Some Label", @"Some label on some view.");
}
IB не может использовать строки из Localizable.strings, но есть другая опция, называемая Base Internationalization.
Вкратце: вы можете создать отдельный файл.strings, прикрепленный к xib / storyboard для каждого необходимого языка. В результате вы получите xib с собственными переводами для каждого языка. Таким образом, он может дублировать некоторые значения, которые есть в Localizable.strings, но это более понятный способ, чем установка через код или копирование файлов xib.
Пожалуйста, обратитесь к документации Apple о базовой интернационализации.
Еще один быстрый способ, но с расширением:
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, и он будет локализован во время выполнения.
Вы можете сделать это в коде:
label.text = NSLocalizedString(@"key", @"comment");
Но я не думаю, что есть способ сделать это только с помощью перьев, кроме локализации всего кончика. Я конечно не нашел другого пути в прошлом.
Это моя версия. Надеюсь, поможет.
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: "")
}
}
Поддерживаемый Apple способ локализации.xib файла. Это позволит вам локализовать текст и макет для каждого языка / страны.