iOS应用内部切换语言,不跟随系统

基本思路:

  1. 新建String文件,并配置
    ②选中新建的String文件,右边栏localization选择make localized,初始只有english选项选择确定
    ③项目多语言配置:Project->info->localizations下的加号,添加所需的支持的语言。
    ④在对应语言文件中以”key”=”value”形式输入所需的字符串,并以分号结束。

    2.所生成的多语言文件,其实对应了不同的文件,可以根据语言加载到的Bundle中,如下图
    这里写图片描述
    这里写图片描述
    这里写图片描述

    NSString *paht = [[NSBundle mainBundle]pathForResource:language ofType:@"lproj"];
    bundle = [NSBundle bundleWithPath:paht];
  1. 调用NSBundle的-- (NSString *)localizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName方法获取字符串:
test = [bundle localizedStringForKey:@"test" value:nil table:@"Test"];

切换不同的路径加载不同语言到bundle中,即可获得对应语言的字符串,如果是跟随系统语言切换,则可以调用系统提供的宏来获取字符串-NSLocalizedString(@"key", nil)

可以从NSUserDefault中获取系统语言

 // 获取系统当前语言
        NSArray *languages = [[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"];
        NSString *current = languages.firstObject;

以下参考内容:
转自CSDN博客:博客地址
前言:网络上关于iOS国际化的文章很多,但基本上都是基于跟随系统语言的国际化,笔者就不赘述了-0 –
今天要讲的是不跟随系统的切换语言版本方案,即程序内部的切换语言版本方案。

一、总则:
应用内部语言不跟随系统语言,由应用自己进行控制,通过配置多个语言文件,根据用户的选择动态获取不同文件夹下的语言文件,显示在界面上。
最后把用户选择的语言持久化到本地,下次运行时读取。

二、应用内的国际化
1、新建工程
新建Single View Application工程,取名为MyInternational。
这里写图片描述
2、添加多语言文件
我们选择使用自己的语言文件,而不是系统的localizable.string,因为在项目开发使用svn时,多人操作同一文件可能会造成冲突。
在Resource中添加新的Strings File:
这里写图片描述
取名为hello(记得Targets要勾选项目)
这里写图片描述
新建完成之后会生成hello.string文件,把它拖进Supporting Files里。
3、配置hello.string国际化
首先配置刚才的hello.string文件。
点击hello.strings文件,点击圈中的Make localized(本地化)。
这里写图片描述
只有English,没关系点击确定。
这里写图片描述
4、配置项目国际化
网络上很多配置方法不靠谱,因为新版的Xcode位置“+”号的位置换了,这里教大家正确的方法,点击项目—>选择Project—>选择Info—>点击“+”号。
这里写图片描述
点击“+”号后,添加中文,当然也可以添加其他的语言,弹出对话框,infoPlist是配置系统的国际化文件,可以配置图标之类的多语言环境,不属于本文范围,nib文件看需要配,这里选择不配。
这里写图片描述
配置完成之后,再看hello.string便分成了两个文件。
这里写图片描述
完成上面的四步便完成了项目内的多语言环境配置,下面来看看代码怎么写。

5、添加需要的字符串
分别在hello.strings(English)与hello.strings(Chinese)里面添加对应语言的字符串。
字符串的格式为“key”=“value”;键值对(别忘记分号!)
接下来配置项目需要的字符串,一个用于lable的显示,一个用于button的显示。

    hello.strings(English)
    "invite" ="hello atany,come to join in us!";
   "buttonInfo" ="change Language";
    hello.strings(Chinese)
    "invite" ="你好 atany,快来加入我们吧!";
    "buttonInfo" ="切换语言";

6、看看流程
这里写图片描述

InternationalControl.h:

    #import <Foundation/Foundation.h>  

    #import <UIKit/UIKit.h>  

    @interface InternationalControl : NSObject  

    +(NSBundle *)bundle;//获取当前资源文件  

    +(void)initUserLanguage;//初始化语言文件  

    +(NSString *)userLanguage;//获取应用当前语言  

    +(void)setUserlanguage:(NSString *)language;//设置当前语言  

    @end  

InternationalControl.m
1)创建静态变量bundle,以及获取方法bundle(注:此处不要使用getBundle)。

    static NSBundle *bundle = nil;  

    + ( NSBundle * )bundle{  

        return bundle;  

    }  

2)初始化方法:
userLanguage储存在NSUserDefaults中,首次加载时要检测是否存在,如果不存在的话读AppleLanguages,并赋值给userLanguage。

 +(void)initUserLanguage{  

    NSUserDefaults *def = [NSUserDefaults standardUserDefaults];  

    NSString *string = [def valueForKey:@"userLanguage"];  

    if(string.length == 0){  

        //获取系统当前语言版本(中文zh-Hans,英文en)  

        NSArray* languages = [def objectForKey:@"AppleLanguages"];  

<pre class="cpp" name="code">        NSString *current = [languages objectAtIndex:0];  

        string = current;  

        [def setValue:current forKey:@"userLanguage"];  

        [def synchronize];//持久化,不加的话不会保存  
}  

    //获取文件路径  
    NSString *path = [[NSBundle mainBundle] pathForResource:string ofType:@"lproj"];  

    bundle = [NSBundle bundleWithPath:path];//生成bundle  
}  

3)获得当前语言方法

    +(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:@"userLanguage"];  

        [def synchronize];  
    }  

9、配置加载的第一个Controller,这里是YGViewController
YGViewController.h

    #import <UIKit/UIKit.h>  

    @interface YGViewController : UIViewController  

    @property (retain, nonatomic) IBOutlet UILabel *inviteLabel;//label  

    - (IBAction)changeLanguage:(id)sender;//点击事件  

    @property (retain, nonatomic) IBOutlet UIButton *btChange;//button  

    @end  

YGViewController.m
1)加载:

    - (void)viewDidLoad  
    {  
        //注册通知,用于接收改变语言的通知  
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeLanguage) name:@"changeLanguage" object:nil];  

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

        NSBundle *bundle = [InternationalControl bundle];  

        NSString *inviteMsg = [bundle localizedStringForKey:@"invite" value:nil table:@"hello"];  

        NSString *buttonInfo = [bundle localizedStringForKey:@"buttonInfo" value:nil table:@"hello"];//table为hello.string的文件名  

        [_btChange setTitle:buttonInfo forState:UIControlStateNormal];  

        _inviteLabel.text = inviteMsg;  

        [super viewDidLoad];  
    }  

2)点击修改语言方法

    - (IBAction)changeLanguage:(id)sender {  

        NSString *lan = [InternationalControl userLanguage];  

        if([lan isEqualToString:@"en"]){//判断当前的语言,进行改变  

            [InternationalControl setUserlanguage:@"zh-Hans"];  

        }else{  

            [InternationalControl setUserlanguage:@"en"];  
    }  

        //改变完成之后发送通知,告诉其他页面修改完成,提示刷新界面  
        [[NSNotificationCenter defaultCenter] postNotificationName:@"changeLanguage" object:nil];  
    }  

3)接收到通知执行方法,刷新界面

    -(void)changeLanguage{  

        [_btChange setTitle:[[InternationalControl bundle] localizedStringForKey:@"buttonInfo" value:nil table:@"hello"] forState:UIControlStateNormal];  

        _inviteLabel.text =[[InternationalControl bundle] localizedStringForKey:@"invite" value:nil table:@"hello"];  
    }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值