iOS多语言,支持app内部设置


上周做了多语言,发现网上方法很多都是关于跟随系统语言设置的,而系统内部设置的确比较少。

而且,iOS8百度地图的各种问题也有,所以今天闲来没事,写一写这两周的总结,供大家参考。

当然做的时候,也会百度搜索,所以项目中可能会看到网上一些比较熟悉的东西。


大家做这一步,相信项目工程是有的了吧(因为本人做独立开发,所以一般新功能几乎都是在项目中做的,很少有写demo,就不考虑demo的情况了)

在项目文件的Supporting Files中的InfoPlist.strings中,右键(或command + N)-->新建一个string文件。

(如果没有这个文件,在xcode6中创建,好像没有看到,可以自己创建一个文件,名字可以随便取,后面会给一个方法,获取这个文件的。)

iOS多语言,支持app内部设置_第1张图片

创建完文件之后,点击项目—>选择Project—>选择Info—>点击“+”号。(画线隐藏)

iOS多语言,支持app内部设置_第2张图片

在右下方有个Language的选项,默认进来是只有English的,点击+号之后可以看到各种语言选项

iOS多语言,支持app内部设置_第3张图片在这里选择Chinese(Simplified)。下面会出现一个选项,选择InfoPlist.string文件,那个是语言设置的。(如果是自定义的文件,就选择自定义的那个)

//-----------------------------------------------------------

到这里,基本配置就完成了。然后后面就是设置需要的字符,以及调用方法了

iOS多语言,支持app内部设置_第4张图片iOS多语言,支持app内部设置_第5张图片

在相应的string文件中,写入需要的字符。前面相当于key。后面是value。

CFBundleDisplayName是app的名字,技术不够,暂时不知道如何手动切换语言,改变桌面的名字,这一步,只是根据系统语言来的。

如果默认根据系统语言更改语言,那么调用的时候只需要NSLocalizedString(<#key#>, <#comment#>)用这一句就可以了。其他的不需要做处理。

如果是想自定义的话,那么需要写一个类:

//.h头文件:

#import

@interface InternationalController : NSObject

+ (NSBundle *)bundle;   //获取当前资源文件
+ (void)initUserLanguage;   //初始化语言文件
+ (NSString *)userLanguage; //获取应用当前语言
+ (void)setUserLanguage:(NSString *)language;   //设置当前语言

@end

//.m类体文件


//
//  InternationalController.m
//  mworkingHaier
//
//  Created by LaoTao on 14-10-20.
//  Copyright (c) 2014年 CaiGaoBaDou. All rights reserved.
//

#import "InternationalController.h"
#import

@implementation InternationalController

//创建静态变量bundle,以及获取方法bundle(此处不要使用getBundle).
static NSBundle *bundle = nil;

+ (NSBundle *)bundle {
    return bundle;
}

//初始化方法:
+ (void)initUserLanguage {
    NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
    NSString *string = [def valueForKey:kLanguage];
    
    if (string.length == 0) {
        //获取系统当前语言版本(中文zh-Hans,英文en)
        NSArray *languages = [def objectForKey:@"AppleLanguages"];
        NSString *current =[languages objectAtIndex:0];
        string = current;
        [def setValue:current forKey:kLanguage];
        [def synchronize];  //持久化,不加的话不会保存
    }
    
    //获取文件路径
    NSString *path = [[NSBundle mainBundle] pathForResource:string ofType:@"lproj"];
//    NSLog(@"%@",path);
    bundle = [NSBundle bundleWithPath:path];    //生成bundle
}

//获得当前语言的方法
+ (NSString *)userLanguage {
    NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
    NSString *language = [def valueForKey:kLanguage];
    return language;
}

//设置语言
+ (void)setUserLanguage:(NSString *)language {
    NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
    
    //1.第一步改变bundle的值
    NSString *path = [[NSBundle mainBundle] pathForResource:language ofType:@"lproj"];
    bundle = [NSBundle bundleWithPath:path];
    
    //2.持久化
    [def setValue:language forKey:kLanguage];
    [def synchronize];
}

@end


把"InternationalController.h"这个在.pch文件中引用,这样全局就都可以调用了

在AppDelegate.m的didFinishLaunchingWithOptions方法中,加一句:

[InternationalController initUserLanguage]; //初始化应用语言

然后设置个全局的宏变量,系统的是NSLocalizedString.这里就设置了LTlocalizedString(LT是老陶的首字母,beyond521t这个t同理,嘿嘿)

self.title = LTLocalizedString(@"TitleName", nil);

如此就可以使用了。切换语言,请看头文件,直接方法名 + 方法,以及语言就OK了。

注:英文在iOS中为"en",简体中文"zh-Hans".


切换语言后:处理方法是,再次跳转到根视图即可。(更多处理方式,请看本人另一篇日志,根视图处理)

你可能感兴趣的:(iOS开发)