Можно ли использовать файл .String, например Localizable.String, но изменить язык с помощью кнопки?

Можно ли использовать файл .String как Localizable.String, но язык меняется с помощью кнопки в приложении вместо языка в настройках? Если нет, есть ли способ указать, как использовать язык EN в языке FR, например:

На языке FR или EN я использую => FXFormFieldTitle:NSLocalizedString(@"SMSInfo", @"")

И соответственно у меня эта строка в FR localizable.String

/* 
  File.strings
  Formbox

  Created by OlostA on 04/11/2016.
  Copyright © 2016 NewTelApps. All rights reserved.
*/
"SMSInfo" = "Souhaitez-vous recevoir par sms les informations de la marque ?";

И эта строка в EN localizable.String

/* 
  File.strings
  Formbox

  Created by OlostA on 04/11/2016.
  Copyright © 2016 NewTelApps. All rights reserved.
*/
"SMSInfo" = "Do you want to receive the brand informations by sms?";

Итак, вопрос. Если я использую язык FR, есть ли способ использовать SMSInfo в localizable.strings EN?


person ΩlostA    schedule 04.11.2016    source источник
comment
Вы можете получить доступ к файлу .strings как к словарю и получить значение. См. stackoverflow.com/questions/3153600/   -  person Teja Nandamuri    schedule 04.11.2016
comment
Вот решение, на которое уже дан ответ, взгляните: stackoverflow.com/questions/22061402/   -  person Tushar    schedule 04.11.2016


Ответы (1)


Да, это возможно изменить язык из приложения.

[LanguageManager saveLanguageByIndex:indexPath.row andCode:model.strLanguageCode];

LanguageManager.h

#import <Foundation/Foundation.h>

typedef NS_ENUM(NSInteger, ELanguage)
{
    ELanguageEnglish,
    ELanguageSpanish,
    ELanguageFrench,
    ELanguageGerman,
    ELanguageItalian,
    ELanguageArabic,
    ELanguageChinese,


    ELanguageCount
};

@interface LanguageManager : NSObject

+ (void)setupCurrentLanguage;
+ (NSArray *)languageStrings;
+ (NSString *)currentLanguageString;
+ (NSString *)currentLanguageCode;
+ (NSInteger)currentLanguageIndex;
+ (void)saveLanguageByIndex:(NSInteger)index andCode:(NSString *)strCode;
+ (BOOL)isCurrentLanguageRTL;

@end

LanguageManager.m

#import "LanguageManager.h"
#import "NSBundle+Language.h"


static NSString * const LanguageCodes[] = { @"en", @"es", @"fr", @"de",@"it",@"ar" ,@"zh-Hans"};
static NSString * const LanguageStrings[] = { @"English", @"Spanish", @"French", @"German",@"Italian",@"Arabic",@"Chinese"};
static NSString * const LanguageSaveKey = @"currentLanguageKey";

@implementation LanguageManager

+ (void)setupCurrentLanguage
{
    NSString *currentLanguage = [[NSUserDefaults standardUserDefaults] objectForKey:LanguageSaveKey];
    if (!currentLanguage) {
        NSArray *languages = [[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"];
        if (languages.count > 0) {
            currentLanguage = languages[0];
            [[NSUserDefaults standardUserDefaults] setObject:currentLanguage forKey:LanguageSaveKey];
            [[NSUserDefaults standardUserDefaults] synchronize];
        }
    }   
#ifndef USE_ON_FLY_LOCALIZATION
    [[NSUserDefaults standardUserDefaults] setObject:@[currentLanguage] forKey:@"AppleLanguages"];
    [[NSUserDefaults standardUserDefaults] synchronize];
#else
    [NSBundle setLanguage:currentLanguage];
#endif
}

+ (NSArray *)languageStrings
{
    NSMutableArray *array = [NSMutableArray array];
    for (NSInteger i = 0; i < ELanguageCount; ++i) {
        [array addObject:NSLocalizedString(LanguageStrings[i], @"")];
    }
    return [array copy];
}

+ (NSString *)currentLanguageString
{
    NSString *string = @"";
    NSString *currentCode = [[NSUserDefaults standardUserDefaults] objectForKey:LanguageSaveKey];
    for (NSInteger i = 0; i < ELanguageCount; ++i) {
        if ([currentCode isEqualToString:LanguageCodes[i]]) {
            string = NSLocalizedString(LanguageStrings[i], @"");
            break;
        }
    }
    return string;
}

+ (NSString *)currentLanguageCode
{
    return [[NSUserDefaults standardUserDefaults] objectForKey:LanguageSaveKey];
}

+ (NSInteger)currentLanguageIndex
{
    NSInteger index = 0;
    NSString *currentCode = [[NSUserDefaults standardUserDefaults] objectForKey:LanguageSaveKey];
    for (NSInteger i = 0; i < ELanguageCount; ++i) {
        if ([currentCode isEqualToString:LanguageCodes[i]]) {
            index = i;
            break;
        }
    }
    return index;
}

+ (void)saveLanguageByIndex:(NSInteger)index andCode:(NSString *)strCode
{
    if (index >= 0 && index < ELanguageCount) {
        [[NSUserDefaults standardUserDefaults] setObject:strCode forKey:LanguageSaveKey];
        [[NSUserDefaults standardUserDefaults] synchronize];
        [[NSUserDefaults standardUserDefaults] setObject:@[strCode] forKey:@"AppleLanguages"];
        [[NSUserDefaults standardUserDefaults] synchronize];
        [NSBundle setLanguage:strCode];
    }
}

+ (BOOL)isCurrentLanguageRTL
{
    NSInteger currentLanguageIndex = [self currentLanguageIndex];
    return ([NSLocale characterDirectionForLanguage:LanguageCodes[currentLanguageIndex]] == NSLocaleLanguageDirectionRightToLeft);
}
person aafat    schedule 04.11.2016