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

UiTextView локализован с файлом строки xib

Я использую базовую интернационализацию в xCode для управления несколькими языками в своем приложении.

В xib файле у меня есть этот объект:

Xrj-9E-2VK it an UITextView

В файле соответствующих строк:

"Xrj-9E-2VK.text" = "text translated in french"

Но мой текст по-прежнему находится на английском языке.

Любое предложение?

4b9b3361

Ответ 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

  1. Запустите приложение, перевод должен быть в порядке!

Затем вы можете вернуться к "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