详解IOS多语言开发——文本国际化

在最近的项目中,要求应用支持多语言。简体中文和维吾尔语。整理记忆,记下此文,希望能帮助到其他人。

将文本国际化常用的3个方面一一讲解

  • 根据系统语言设置,应用名称的多语言切换
  • 根据系统语言设置,应用内容的多语言切换
  • 在应用内,手动切换多语言
  • 优化

初体验多语言--APP应用图标的多语言

效果:

![Uploading 屏幕快照 2016-11-17 上午9.10.00_240252.png . . .]](http://upload-images.jianshu.io/upload_images/3250032-eea456087c7c37a4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

在设置——通用——语言 中选择日语

详解IOS多语言开发——文本国际化_第1张图片
屏幕快照 2016-11-17 上午9.10.00.png

实现:

1 为项目添加支持的语言
在project——info——Localizations 添加简体中文和日语

屏幕快照 2016-11-17 上午9.30.49.png

如果项目中的sb和xib没用到多语言,不用勾选。默认勾选,不影响。

屏幕快照 2016-11-17 上午9.27.54.png

2 生成存放语言的strings文件

2.1 在Resource——Strings File 生成一个名字为 InfoPlist 的strings文件

详解IOS多语言开发——文本国际化_第2张图片
屏幕快照 2016-11-17 上午9.33.45.png

2.2 点击 Localize 为InfoPlist.strings 生成支持的语言.strings

详解IOS多语言开发——文本国际化_第3张图片
屏幕快照 2016-11-17 上午9.39.06.png

2.3 添加简体中文和日语


详解IOS多语言开发——文本国际化_第4张图片
屏幕快照 2016-11-17 上午9.44.12.png

勾选支持的简体中文和日语

详解IOS多语言开发——文本国际化_第5张图片

2.4 勾选完成后,在InfoPlist.strings文件下自动生成对应语言的.strings文件

屏幕快照 2016-11-17 上午9.49.11.png

3 在strings添加内容

3.1 在InfoPlist.strings(Simplified) 中输入 CFBundleDisplayName = "指尖弹灰";

在InfoPlist.strings(Japanese) 中输入 CFBundleDisplayName = "指先デフレクタ";

4 实现功能
4.1 在info.plst 中添加字段 Application has localized display name 并设置成Boolean类型的Yes

详解IOS多语言开发——文本国际化_第6张图片
屏幕快照 2016-11-17 上午9.58.15.png

4.2 该功能已经实现了。按照效果图中的操作即可。很简单吧,如果改变系统语言,希望应用内的语言也改变,该怎么办呢?往下看!

注意:

1 Terminating since there is no system app.

  • 系统切换语言后,应用发生闪退,要重启应用。

2 APP应用图标的多语言设置 ,strings文件只能叫 InfoPlist.strings

更近一步多语言--APP应用内容的多语言

根据系统语言,APP内语言的自动切换

效果:

当系统语言设为简体中文时,运行程序

详解IOS多语言开发——文本国际化_第7张图片
屏幕快照 2016-11-17 上午10.42.30.png

当系统语言设为日语时,运行程序

详解IOS多语言开发——文本国际化_第8张图片
屏幕快照 2016-11-17 上午10.46.32.png

实现:

1 为项目添加支持的语言

添加日语和简体中文

2 生成存放语言的strings文件

生成一个名字为Localizable的strings文件

屏幕快照 2016-11-17 上午10.24.41.png

3 在strings文件中添加多语言

3.1在InfoPlist.strings(Simplified) 中输入 "labelText" = "指尖弹灰";

在InfoPlist.strings(Japanese) 中输入 "labelText = "指先デフレクタ";

4 实现功能

为View添加一个label

 UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(140, 200, 200, 30)];
 label.text = NSLocalizedString(@"labelText", nil);
 [self.view addSubview:label];

该功能已经实现了。按照效果图中的操作即可。

关键方法:

1 “labelText”是key , "指尖弹灰" “指先デフレクタ” 是不同语言strings中的value
2 NSLocalizedString(key, comment)

  • 首先获取系统语言——日语
  • 然后在Localizable.strings 文件下找到Localizable.strings(Japanese)文件中key对应的value值,将其返回.

理论:

#define NSLocalizedString(key, comment) \
        [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil]
#define NSLocalizedStringFromTable(key, tbl, comment) \
        [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:(tbl)]
  • key: 查找的key值
  • comment: 备注,从上面的预定义中可以看出它不参与代码的运行,只是为了我们好去知道这个字段是什么。如
label.text = NSLocalizedString(@"labelText", @"程序中lable的名字");
  • tbl: 对应的Strings文件的名称(如:InfoPlist ,Localizable)。预定义NSLocalizedString(key,comment)是第二个定义的简化版,它将tbl设为nil.如果tbl为nil则默认tbl是Localizable. 现在大家明白了为什么我们的Strings要命名为Localizable.Strings了吧。
//也可以这样写
label.text = NSLocalizedStringFromTable(@"labelText", nil, nil);
  • 更多的情况是我们想让用户可以在应用内去设置语言。这时我们的该怎么做呢?往下看

在APP内部,手动实现多语言切换

效果:

详解IOS多语言开发——文本国际化_第9张图片
屏幕快照 2016-11-17 下午2.36.27.png
详解IOS多语言开发——文本国际化_第10张图片
屏幕快照 2016-11-17 下午2.36.11.png

实现:

  1. 为项目添加支持的语言

    为项目添加中文简体和维吾尔语 uyghur(ug)

  2. 生成存放语言的strings文件

    生成一个名字为demo的strings文件

屏幕快照 2016-11-20 下午5.53.38.png
  1. 在strings文件中添加多语言

在demo.strings(Simplified) 中添加

"labelName" ="订单签收";
"buttonName" ="切换语言";

在demo.strings(Uyghur) 中添加

labelName" ="زاكاس تالونغا ئىمزا قويۇپ ئېلىش";
"buttonName" ="ئالماستۇرۇش";

  1. 实现功能

4.1 获取当前保存在NSUerDefaults中的语言

#define  currentLanguage [NSString stringWithFormat:@"%@",[NSUserDefaults standarUserDefaults] objectForKey:@"appLanguage"]]

4.2 获取当前语言文件所在的路径

#define LanguagePath [[NSBundle mainBundle] pathForResource:currentLanguage ofType:@"lproj"]`

4.3 返回当前语言文件key所对应的value

define THLocalized(key) [[NSBundel bundleWithPath:LanguagePath] localizedStringForKey:(key) value:nil table:@"demo"]

4.4 为了简便,将上述3个预定义合在一起得到

#define THLocalized(key)  [[NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%@",[[NSUserDefaults standardUserDefaults] objectForKey:@"appLanguage"]] ofType:@"lproj"]] localizedStringForKey:(key) value:nil table:@"demo"]

THLocalized(key) 和NSLocalizedString(key, comment)是不是很像呢?

4.5 如果第一次进入应用,NSUserDefaults中没有保存的语言怎么办?

在AppDelegate.m文件中,实现判断。如果NSUserDefaults中没有保存语言,则将系统设置的语言保存到NSUserDefaults中

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
   
   if (![[NSUserDefaults standardUserDefaults]objectForKey:@"appLanguage"]) {
       NSArray *languages = [NSLocale preferredLanguages];
       NSString *language = [languages objectAtIndex:0];
       if ([language hasPrefix:@"zh-Hans"]) {//开头是否匹配
           [[NSUserDefaults standardUserDefaults] setObject:@"zh-Hans" forKey:@"appLanguage"];
       }else{
           [[NSUserDefaults standardUserDefaults] setObject:@"en" forKey:@"appLanguage"];
       }
   }
   
   return YES;
}

4.6 View中添加一个label和一个button

- (void)viewDidLoad {

        [super viewDidLoad];
        self.view.backgroundColor = [UIColor whiteColor];
        UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(100, 300, 200, 50)];
        label.text = THLocalized(@"labelName");
        [self.view addSubview:label];
   
        UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        button.frame = CGRectMake(100, 400, 200, 50);
        [button setTitle:THLocalized(@"buttonName") forState:UIControlStateNormal];
        [button addTarget:self action:@selector(click) forControlEvents:UIControlEventTouchUpInside];
        [self.view addSubview:button];
}

4.7 点击button时,将当前语言保存到NSUserDefaults中,并刷新应用

- (void)click {

        NSString *language = [[NSUserDefaults standardUserDefaults]objectForKey:@"appLanguage"];
        if ([language isEqualToString: @"ug"]) {
            [[NSUserDefaults standardUserDefaults] setObject:@"zh-Hans" forKey:@"appLanguage"];
        }else {
            [[NSUserDefaults standardUserDefaults] setObject:@"ug" forKey:@"appLanguage"];
        }
        [[NSUserDefaults standardUserDefaults] synchronize];
        
        // 可以将rootViewController设成刷新后停留的页面的controller
        AppDelegate *delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
        ViewController * vc = [[ViewController alloc]init];
        delegate.window.rootViewController = vc;
}

补充说明: zh-Hans是中文简体的缩写,ug是维吾尔语的缩写.下图括号里面是缩写

详解IOS多语言开发——文本国际化_第11张图片
屏幕快照 2016-11-17 下午2.33.20.png

优化

  • 切换成其他语言后,view大小应该可以随内容去调整,使得text可以显示完全。

  • 这讲是针对文本的国际化,实际上图片,storyboard,xib也都可以进行国际化

你可能感兴趣的:(详解IOS多语言开发——文本国际化)