iOS: изменить локализованный xib без перезапуска

Я знаю, что есть несколько модулей для изменения файла локализованных строк без перезапуска. моя проблема в том, что мой проект сильно зависит от xib, и он пытается зависеть от локализации сервера, а не от локализации устройства.

Надеюсь, для этого есть способ.


person Mohamed Emad Hegab    schedule 12.08.2015    source источник
comment
Сначала проверьте, обновлен ваш язык или нет. При обновлении и повторном вызове API в каждом контроллере. Поскольку локализация на основе сервера без вызова веб-службы, вы не можете ее обновить.   -  person Alok    schedule 17.08.2015
comment
Невозможно изменить строку загруженного пера. Решение: изменить язык пакета -> выгрузить перья примут измененный язык. Для загруженных перьев: перезапустите их. Вы можете посмотреть это приложение itunes.apple.com/vn/app/intima/id998047638.   -  person tuledev    schedule 19.08.2015


Ответы (2)


Я думаю, вам сначала нужно локализовать все ваши xibs (нажав кнопку «Локализировать...» в файловом инспекторе). Выберите нужный язык и сделайте то же самое для Localizable.strings, если он вам тоже нужен.

Затем импортируйте файлы BundleLocalization в свой проект. Если вам нужно изменить язык, просто используйте:

[[BundleLocalization sharedInstance] setLanguage:@"fr"];

Он будет работать для функции xib, раскадровки и NSLocalizedString. Единственная «проблема» заключается в том, что ваш текущий контроллер представления необходимо перезагрузить при установке языка. Вот подход, который вы можете использовать, если у вас есть UINavigationController (с xib или stroyboard, это не имеет значения):

UINavigationController *navController = self.navigationController;
UIViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"currentViewControllerId"];
NSMutableArray *viewControllersArray = [[NSMutableArray alloc] initWithArray:navController.viewControllers];
[viewControllersArray replaceObjectAtIndex:([navController.viewControllers count] - 1) withObject:vc];
navController.viewControllers = viewControllersArray;
person Y.Bonafons    schedule 23.08.2015
comment
Но он не упорядочивает языки слева направо и справа налево. Например, измените английский на арабский. Без сомнения, текст изменяется, но виды остаются на месте, то есть они не ориентируются, как если бы вы меняли язык в настройках iOS. - person Chanchal Raj; 21.12.2015
comment
только что попробовал. работает, если я вручную сопоставляю первый объект AppleLanguages ​​с именем .proj. Отличная работа! - person Wingzero; 14.03.2016
comment
Это лучший ответ о смене языка в приложении БЕЗ перезапуска приложения. - person JordanChina; 10.05.2016

В настоящее время я делаю это так в своих приложениях.

  1. Создал класс для доступа к нужной строке на нужном вам языке.

    #import <Foundation/Foundation.h>
    
    @interface RDLocalizedString : NSObject
    + (NSString*)localizedStringForKey:(NSString*)key;
    @end
    
    #import "RDLocalizedString.h"
    
    @implementation WMLocalizedString
    + (NSString*)localizedStringForKey:(NSString*)key{
    
        //This method will return the name of the string file. my string files are all (en.strings, fr.strings, es.strings ,etc)
        NSString *tableName = [[LanguageManager sharedManager] getCurrentlanguageKey];
        NSString* str = [[NSBundle mainBundle] localizedStringForKey:key value:@"#NA#" table:tableName];
    
        //if no string is found use the english pne
        if ([str isEqualToString:@"#NA#"]) {
            str = [[NSBundle mainBundle] localizedStringForKey:key value:@"#NA#" table:@"en"];
        }
        return str;
    }
    @end
    
  2. В представлении добавьте всю строку в метод.

    - (void)loadStrings{
        //Load all strings here
        self.titleLabel = [RDLocalizedString localizedStringForKey:@"mainTitle"];
    }
    
  3. Создайте и обозреватель, который будет запускаться при изменении языка.

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loadStrings) name:@"LANGUAGE_HAS_CHANGE" object:nil];
    
person rob180    schedule 17.08.2015
comment
все же это решение находится на стороне контроллера.. это огромный проект, я не могу просто локализовать метку за меткой в ​​коде, пока они уже локализованы в файле строк .xib - person Mohamed Emad Hegab; 18.08.2015