Локализация атрибута UITextView из раскадровки - программирование
Подтвердить что ты не робот

Локализация атрибута UITextView из раскадровки

Я использую раскадровку и имею представление, где я подклассифицировал некоторые UITextViews.

Моя проблема в том, что я использую ibtool --generate-strings-file для извлечения строк из раскадровки для локализации, а затем используйте ibtool -write в другом файле раскадровки, чтобы применить переведенные строки.

Когда я использую ibtool, любые UITextViews, которые приписывают текст, игнорируются командой ibtool --generate-strings-file и опущены из результирующего файла строк.

Можно ли извлечь атрибутный текст из раскадровки для локализации?

4b9b3361

Ответ 1

В заключение я пришел к выводу, что это невозможно сделать с помощью ibtool в настоящей версии.

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

Это позволило мне использовать ibtool для извлечения строк и по-прежнему иметь атрибутное текстовое представление.

Ответ 2

на Xcode 6.1, лучший способ - скопировать атрибутный текст текстового представления в RTF-текст "BASE" (с использованием TextEdit, например, или непосредственно из XCode > Новый файл > ressources > RTF).

Просматривая путь TextEdit, вам нужно импортировать текст в свой проект. Очевидно, что если вы сделали это через Xcode, ничего не импортировать.

то вы просто используете панель utilies, чтобы найти кнопку "localize...", которая сделает это для вас.

чтобы импортировать правильную версию, просто выполните (в viewWillAppear для примера),

 NSURL *url = [[NSBundle mainBundle] URLForResource:[fileName stringByDeletingPathExtension] withExtension:[fileName pathExtension]];
NSError *error;
NSAttributedString *attributedString = [[NSAttributedString alloc] initWithFileURL:url
                                                                           options:@{NSDocumentTypeDocumentAttribute:NSRTFTextDocumentType}
                                                                documentAttributes:nil
                                                                             error:&error];

[_originalMessage setAttributedText:attributedString];

Ответ 3

Не было бы смысла локализовать атрибутный текст из раскадровки, поскольку вам нужно было бы знать, где применять атрибуты после перевода. Возможно, порядок слов мог быть изменен и там, где вы бы указали какой-то синий жирный текст, например, больше не имеет смысла.

Конечно, вы все равно можете сделать это с помощью кода, в котором вы можете разделить свою строку на несколько и локализовать их по отдельности. Затем вы можете указать setAttributes: range: так, чтобы вы знали, что нужные атрибуты всегда будут применяться в правом диапазоне строки.

Ответ 4

Вот обходной путь, который я считаю весьма полезным: просто создайте ViewController с переведенным TextView. В деталях (здесь я просто переводил присланный текст на английский язык):

1) Крит новый контроллер с "новым файлом" → "UIViewController with Xib". Назовите его "AttributedTranslated" и заполните его только TextView с переводом присваиваемого текста с помощью Interface Builder.

2) В файле основного контроллера .m напишите следующий метод:

- (BOOL)isEng {
    return [[[NSLocale preferredLanguages] objectAtIndex:0] isEqualToString:@"en"];
}

3) Определите объект "AttributedTranslated" и вид в вашем файле .h

IBOutlet UIView            *attrView;    
AttributedTranslated       *attr;

4) В файле xib (или раскадровке) вашего основного контроллера создайте представление, содержащее только атрибут textView (на языке оригинала) и привяжите его к "attrView".

5) На вашем viewDidLoad сделайте что-то вроде следующего:

if ([self isEng]) {

    desc = [[Description alloc] init];
    [attrView addSubview:attr.view];
}

Возможно, это не лучший способ сделать это, но он позволяет легко переводить атрибутный текст в Interface Builder!