iOS国际化---不跟随系统语言

这篇博客介绍了如何在iOS应用中实现不跟随系统语言切换的功能。通过创建并配置多个语言文件,结合用户选择动态加载相应语言资源,实现应用内语言版本的独立控制,并将用户选择的语言保存至本地以备下次使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

不跟随系统语言

http://blog.youkuaiyun.com/yang8456211/article/details/12031667
—— by ataxy 原创
我重新整理了改编适配iOS 9.2 使用了新的方法,谢谢!

言归正传

前言:上一篇文章的国际化是跟随系统语言变化而变化的笔者整理的很详细了,不清楚的朋友没关系,我会在下面简单的回顾一下上一篇的知识点,
今天要讲的是不跟随系统的切换语言版本方案,即程序内部的切换语言版本方案。

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

二、应用内的国际化
1、新建工程
新建Single View Application工程,取名为MyInternational。
这里写图片描述
2、添加多语言文件
取名为 CustomeLanguage.strings
这里写图片描述
3、配置CustomeLanguage.strings语言文件
点击CustomeLanguage.strings文件,点击圈中的Localization(本地化)。
这里写图片描述
只有English,没关系选English点击确定。
4、添加国际化语言
点击项目—>选择Project—>选择Info—>点击“+”号。
这里写图片描述
点击“+”号后,添加中文,当然也可以添加其他的语言,弹出对话框,可以配置图标之类的多语言环境,不属于本文范围,nib文件看需要配,这里选择不配。
这里写图片描述
5、添加需要的字符串
分别在CustomeLanguage.strings(English)与CustomeLanguage.strings(Chinese)里面添加对应语言的字符串。
字符串的格式为“key”=“value”;键值对(别忘记分号!)
接下来配置项目需要的字符串,一个用于lable的显示,一个用于button的显示。
CustomeLanguage.strings(English)
“titleInfo” = “Boss your need !”;
“buttonInfo” = “change Language”;
CustomeLanguage.strings(Chinese)
“titleInfo” = “老板你的需求 !”;
“buttonInfo” = “切换语言”;
6、上代码(直接copy到主控制器Run)
注意:在Main.storyboard里拖一个Label 和一个 Button,也可代码创建

//
//  ViewController.m
//  MyInternational
//
//  Created by 张宝 on 16/2/19.
//  Copyright © 2016年 zhangbao. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@property (weak, nonatomic) IBOutlet UILabel *testLabel;

@property (weak, nonatomic) IBOutlet UIButton *changeBtn;

@end

@implementation ViewController

// 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)
        NSString *currentLanguage = [[NSLocale preferredLanguages] firstObject];

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

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

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

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

}

// 3)获得当前语言方法
+(NSString *)userLanguage{

    NSUserDefaults *def = [NSUserDefaults standardUserDefaults];

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

    return language;
}

// 4)设置语言方法
+(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];
}

- (void)viewDidLoad {

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

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

//    NSString *inviteMsg = [[ViewController bundle] localizedStringForKey:@"titleInfo" value:nil table:@"CustomLanguage"];
//    
//    NSString *buttonInfo = [[ViewController bundle] localizedStringForKey:@"buttonInfo" value:nil table:@"CustomLanguage"];//table为Customlanguage的文件名

    self.testLabel.text = NSLocalizedStringFromTableInBundle(@"titleInfo", @"CustomLanguage", [ViewController bundle], nil);;

    [self.changeBtn setTitle:NSLocalizedStringFromTableInBundle(@"buttonInfo", @"CustomLanguage", [ViewController bundle], nil) forState:UIControlStateNormal];

    [super viewDidLoad];

}
- (IBAction)changeLangeuage:(UIButton *)sender {


    NSString *language = [ViewController userLanguage];

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

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

    }else{

        [ViewController setUserlanguage:@"en"];
    }

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

-(void)changeLanguage{

    self.testLabel.text =[[ViewController bundle] localizedStringForKey:@"titleInfo" value:nil table:@"CustomLanguage"];

    [self.changeBtn setTitle:[[ViewController bundle] localizedStringForKey:@"buttonInfo" value:nil table:@"CustomLanguage"] forState:UIControlStateNormal];

}

@end

7、效果图
这里写图片描述
这里写图片描述

PS:如果有什么不懂或者文章里不足之处欢迎留言!
it.zhangbao 原创,转载请注明博主与博文链接,3Q
http://blog.youkuaiyun.com/zhangbao_csdn/article/details/50696867
—— by it.zhangbao

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值