2013-11-18 3 views
3

Итак, у меня есть приложение с различными кнопками, надписями и некоторыми текстовыми представлениями в раскадровке, где я ввел текст непосредственно в раскадровку. Я включил базовую локализацию и добавил несколько языков.Локализация для UITextView в раскадровке

Это сгенерированные раскадровки для базового (английского) и других языков со списком объектов objectID. Я перевел все, и ярлыки и кнопки (ВСЕ ИХ) работают и показывают на языке, на котором я устанавливал устройство.

Текстовые поля, однако, продолжают показывать исходный текст на английском языке независимо от того, какой язык я задал ... Есть ли дополнительные шаги для просмотра текста?

+0

Я только что столкнулся с ТОЧНЫМ вопросом. Все работает отлично в симуляторе, кроме UITextViews при использовании строк для локализованных языков. Он работает так, как ожидалось, когда я переключаюсь на файлы раскадровки IB, кстати. Xcode5 и Mavericks. – user1459524

+0

То же самое здесь. Странный вопрос! Будем надеяться, что кто-то знает обходное решение/исправить ... Я тоже xxode 5/maverick ... – rkh

+0

Просто протестирован на устройствах (iPhone5c и iPad), и это та же проблема. Так что это не просто симулятор. – user1459524

ответ

4

Итак, я провел некоторое исследование, и кажется, что для правильной работы текст UITextView должен быть программным.

Источник: Devforums.apple

Цитата:

как я понимаю, строки, такие как текстовое свойство текстового вида/поля должны быть установлены в коде с помощью NSLocalizedString. Первые 1/2 часа видеосеанса WWDC 2013 # 219 Создание вашего приложения World Ready охватывает это, если у вас есть время посмотреть его

Итак, кажется, что обходной путь (если вы не хотите устанавливать текст программно) заключается в том, чтобы преобразовать файл строк в раскадровку перед отправкой приложения. Кажется, что это работает так, как предполагалось, и показывает, что UITextView правильно локализован.

EDIT: обнаружено другое обходное решение, позволяющее хранить файл .strings.

В - (void)viewDidLoad:

for(UIView* v in self.view.subviews) 
{ 
    if([v isKindOfClass:[UITextView class]]) 
    { 
     UITextView* txv = (UITextView*)v; 
     NSString *loctxt = [txv.text stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
     txv.text = NSLocalizedString(loctxt, @""); 
    } 
} 

Это производит Процент ускользает закодированную строку из любой внутри раскадровки, как это:

Hello%20World 

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

"Hello%20World" = "Hallo Welt"; 

Пробег в процентах заботится обо всех escape-символах в базовой строке.

+0

В этом случае я попытаюсь использовать метки ... – rkh

+0

Отредактированный ответ для добавления обходного пути, который позволяет сохранить файл .strings – user1459524

0

Я создал свои собственные категории компонентов.

Например, кнопка:

#import <UIKit/UIKit.h> 
@interface LocalizedButton : UIButton 
@end 

#import "LocalizedButton.h" 

@implementation LocalizedButton 

- (id)initWithCoder:(NSCoder *)aDecoder { 
    NSLog(@"Loading LocalizedButton: initWithCoder"); 
    if ((self = [super initWithCoder:aDecoder])){ 
     [self localizeButton]; 
    } 
    return self; 
} 

- (id)initWithFrame:(CGRect)frame{ 
    NSLog(@"Loading LocalizedButton: initWithFrame"); 
    self = [super initWithFrame:frame]; 
    if (self) { 
     [self localizeButton]; 
    } 
    return self; 
} 

-(void) localizeButton{ 
    self.titleLabel.adjustsFontSizeToFitWidth = YES; 
    NSString* text = NSLocalizedString(self.titleLabel.text, nil); 
    [self setTitle:text forState:UIControlStateNormal]; 
    [self setTitle:text forState:UIControlStateHighlighted]; 
    [self setTitle:text forState:UIControlStateDisabled]; 
    [self setTitle:text forState:UIControlStateSelected]; 
} 

@end 

Вы можете зе полный код на: https://github.com/exmo/equizmo-ios/blob/master/Quiz/LocalizedButton.m

+0

Итак, вы можете использовать на xcode текст из ваших строк. Просто выберите класс LocalizedButton. –

+0

Кнопки? Кто сказал что-нибудь о кнопках? – rkh

1

Если кто-то еще интересно, я решил эту проблему по-другому, это позволит вам все еще используйте файл SAME .Strings, который генерируется Xcode для раскадровки.

Есть две части этого решения:

В.м-файл для вашего зрения добавить этот код:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    for(UIView* view in self.view.subviews) 
    { 
     if([view isKindOfClass:[UITextView class]] && view.restorationIdentifier) 
     { 
      UITextView* textView = (UITextView*)view; 
      NSString *textViewName = [NSString stringWithFormat:@"%@.text",textView.restorationIdentifier]; 
      textView.text = NSLocalizedStringFromTable(textViewName, @"Main", nil); 
      //change this to be the same as the name of your storyboard ^^^ 
     } 
    } 
    // Do any additional setup after loading the view. 
} 

и раскадровки в инспекторе идентичности скопировать «ID объекта» в поле «Восстановление ID».

Это применит новый локализованный текст ко всем вашим UITextViews при загрузке на экране и позволит вам использовать уже созданные файлы строк.

+0

Это очень удобное решение. В Swift цикл 'for' выглядит как' для просмотра в self.view.subviews { , если пусть tv = view as? UITextView, ident = view.restorationIdentifier { let textViewName = String (формат: «% @. Text», ident); tv.text = NSLocalizedString (textViewName, tableName: "Main", comment: "") } } '(Обратите внимание, что в Swift' NSLocalizedString' заменяет несколько макросов Obj-C, один из которых - 'NSLocalizedStringFromTable') – Stefan

+0

К сожалению, в iOS 10 это, похоже, больше не работает. Вместо этого вызов возвращает идентификатор, который был предоставлен в качестве первого параметра (например, «abc-xy-pqr.text»). Есть идеи? – Stefan

1

Поскольку мой комментарий к ответу Дмитрия не может быть отформатирован красиво, я повторяю это как ответ здесь. Swift вариант его решения выглядит следующим образом:

override func viewDidLoad() { 
    super.viewDidLoad() 
    for view in self.view.subviews { 
     if let tv = view as? UITextView, ident = view.restorationIdentifier { 
      tv.text = NSLocalizedString("\(ident).text", tableName: "Main", comment: "") 
     } 
    } 
    // Do any additional setup after loading the view. 
} 

(Обратите внимание, что в Swift, NSLocalizedString заменяет несколько макросов Objective-C, один из которых является NSLocalizedStringFromTable)

PS: К сожалению, в ИО 10 это кажется больше не работать. Вместо этого вызов возвращает идентификатор, который был подан как первый параметр (например, «abc-xy-pqr.text»). Есть идеи?

0

Свифт решение https://stackoverflow.com/users/1950945/stefan работ для меня на прошивке 10.2, когда я заменить «Main» с правильным идентификатором (например, «MainStoryboard»), который ссылается на локализованный файл id.storyboard (например, «MainStoryboard.storyboard»)

Смежные вопросы