UiTextView локализован с файлом строки xib
Я использую базовую интернационализацию в xCode для управления несколькими языками в своем приложении.
В xib файле у меня есть этот объект:
Xrj-9E-2VK it an UITextView
В файле соответствующих строк:
"Xrj-9E-2VK.text" = "text translated in french"
Но мой текст по-прежнему находится на английском языке.
Любое предложение?
Ответы
Ответ 1
Я нашел следующее обходное решение, пока Apple не исправляет эту (серьезную) ошибку, которая все еще существует в iOS 7:
На самом деле вам нужно "смешивать" метод базовой базы данных (= предпочтительный метод для Xcode 5 и iOS 7) с помощью "более старого" метода использования файла "Localizable.strings"
1) создайте файл "Localizable.strings" (Файл → Новый → iOS → ресурс → .strings файл)
2) используйте Xcode для создания локализованных версий этого файла для каждого используемого вами языка (выберите файл "Localizable.strings" , в "Инспекторе файлов" в разделе "Локализация" нажмите кнопку выбора рядом с каждым используемым вами языком).
3) в вашем viewController создайте IBOutlet @property для UITextField:
@property (weak, nonatomic) IBOutlet UITextView *localizedTextView;
4) в разделе 'viewDidLoad' добавьте следующий код:
self.localizedTextView.text = NSLocalizedString(@"textFieldKey", @"comment for the translator");
5) в каждом файле Localizable.strings добавьте:
"textFieldKey" = "переведенный текст, который вы хотите поместить в textField";
Это должно сделать это!
Имейте в виду, что Apple, вероятно, исправит эту ошибку где-то в ближайшем будущем, в этом случае перевод будет взят из "базовой локализованной раскадровки" (той, в которой есть ссылки на объекты, например "a8N-K9-eJb.text" = "некоторый переведенный текст". В этом случае вы можете удалить файл Localization.strings и снова использовать базовую локализацию для UITextField
Ответ 2
Это все еще отображается под Xcode 6 и IOS 8, и предыдущие ответы меня не удовлетворяют.
Вот мой простой и быстрый способ:
- Выберите XIB, а затем в инспекторе файлов
- Ниже "Локализация" найдите язык, который не работает.
- Измените "Localizable Strings" на "Interface Builder Cocoa Touch XIB"
![XCODE XIB inspector file screenshot]()
- Запустите приложение, перевод должен быть в порядке!
Затем вы можете вернуться к "Localizable Strings", если хотите...
В этом случае обратите внимание, что вы должны запускать хотя бы один раз приложение с помощью "Interface Builder Cocoa Touch XIB". выбранная опция.
Ответ 3
Вы можете использовать NSLocalizedStringFromTable для извлечения текстов, сгенерированных с помощью xcode IB, следующим образом: viewDidLoad:
self.intro_text.text = NSLocalizedStringFromTable(@"2Vy-59-WN8.text", @"Main", @"");
Где 2Vy-59-WN8.text - это сгенерированный ключ, который вы можете найти в Main.strings для UITextView.
BTW: это ошибка xcode/IB, а не ошибка iOS.
Ответ 4
Я получил это для работы с Xcode 5.1.1 и iOS7.
Выберите элемент управления ViewController, который вы хотите локализовать, в левой панели файлов.
На правой панели выберите "Инспектор файлов".
Вы увидите кнопку "Локализовать...". Нажмите кнопку. Вам будет представлен выпадающий список языков, которые вы можете выбрать. Выберите "База", а затем нажмите "Локализовать".
На правой панели в разделе "Локализация" теперь будет выбран "Base", а ваши другие языки будут перечислены. Выберите языки, которые вы хотите поддержать. Оставьте "родной" язык вашего приложения непроверенным.
Существуют определенные проблемы кэширования. Я обнаружил, что изменения появляются только после того, как я удалил приложение из симулятора, и когда я удаляю производные данные Xcode.
Ответ 5
Измените ошибку в Apple. Пусть они знают, что это происходит, и причиняет вам (и мне) время и разочарование. Вся эта система локализации не позволяет нам вернуться к NSLocalizedString..
Ответ 6
Это мой ответ Swift 2:
Мы не хотим повторять исправление в каждом UIViewController, поэтому давайте начнем с расширения:
import UIKit
extension UIViewController {
// if the property "Selectable" = NO it will reset the font and fontcolor when setText is used.
// So turn Selectable ON
func localizeUITextViewsFromStoryboard(storyboardName: String) {
for view in self.view.subviews {
if let textView = view as? UITextView,
let restorationIdentifier = textView.restorationIdentifier {
let key = "\(restorationIdentifier).text"
let localizedText = NSLocalizedString(key, tableName: storyboardName, comment: "")
if localizedText != key {
textView.text = localizedText
}
}
}
}
}
В каждом UIViewController, где нам нужно это исправление, пишем
override func viewDidLoad() {
super.viewDidLoad()
self.localizeUITextViewsFromStoryboard("Main")
}
В этом коде используется идентификатор восстановления UITextViews. Это означает, что нам нужно скопировать идентификатор объекта в идентификатор восстановления в раскадровке для каждого UITextView.
Ответ 7
UPDATE
Лучший способ изменить текст - это прямое использование setter из UITextView.
Если ваш текст НЕ отформатирован, просто используйте:
[textView setText:NSLocalizedString(key, comment)];
Если ваш текст IS отформатирован, вы должны использовать:
[textView setAttributedText:[[NSMutableAttributedString alloc] initWithString:NSLocalizedString(key, comment)]];
Вам больше не нужно использовать обходной путь с обновленным методом.
WORKARROUND
Чтобы добиться этого, самое легкое решение, которое я нашел, - просто добавить дополнительный UITextView с переведенным текстом точно в том же месте, что и другой, и скрыть его.
Чтобы отобразить правильный вид, я делаю это в методе viewDidLoad контроллера:
NSString *language = [[NSLocale preferredLanguages] firstObject];
if ([language isEqualToString:FRENCH_LANGUAGE]) { //@"fr"
UITextView.hidden = YES;
UITextViewFR.hidden = NO;
}
Несмотря на то, что это решение, безусловно, не изящно, это, безусловно, хорошее решение, когда вам не нужно много переводов.
Если говорить, что использование строки с раскадровкой не работает. Добавление IBOutlet и установка текстового атрибута с помощью NSLocalizedString тоже не работали. Я искал решение, и, похоже, никто не смог найти четкого ответа на этот вопрос.
Ответ 8
Xcode 7 по-прежнему кажется ошибочным...
Перед тем, как попробовать что-нибудь сложное, попробуйте эти три простых шага:
- Удалить приложение с устройства (не симулятора)
- Продукт → Очистка
- Запуск на устройстве
Удачи.
Ответ 9
Если вы хотите использовать существующий файл MainStoryboard.strings, вы можете программно назначить текст своего текстового поля, используя localizedStringForKey: value: table: like this
[[NSBundle mainBundle] localizedStringForKey:@"abc-12-3ba.text" value:@"" table:@"MainStoryboard"]
Ответ 10
Файлы XIB не имеют собственных файлов ".strings". Вы можете генерировать ".strings" из XIB с помощью ibtool, затем после перевода вы снова используете ibtool, чтобы вставлять переводы в локализованный XIB.
Если у вас все еще есть только один английский XIB, вам нужно создать французский XIB с помощью Xcode, а затем выполнить процесс ibtool.
Взгляните сюда:
https://developer.apple.com/library/ios/documentation/MacOSX/Conceptual/BPInternational/Articles/LocalizingInterfaces.html