iOS 应用程序内部国际化,不跟随系统语言 .
2014-06-27 16:36
447 查看
转载原文地址:/article/7601638.html
前言:网络上关于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、看看流程
【实现思路:】
在初始化首个Controller的时候,进行应用语言的加载。首次加载因为userLanguage(应用内语言)不存在,则使用系统当前的语言,保存到userlanguage,下次直接读。读出来之后,获取到对应文件路径,得到文件的索引,储存到工具类InternationalControl的静态变量bundle中。
其他地方需要用字符串时,用工具类获得bundle即可读取相应文件中的字符串。
7、新建工具类InternationalControl
InternationalControl.h
[cpp]
view plaincopyprint?
#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)。
[cpp]
view plaincopyprint?
static NSBundle *bundle = nil;
+ ( NSBundle * )bundle{
return bundle;
}
2)初始化方法:
userLanguage储存在NSUserDefaults中,首次加载时要检测是否存在,如果不存在的话读AppleLanguages,并赋值给userLanguage。
[cpp]
view plaincopyprint?
+(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
}
</PRE>
3)获得当前语言方法
[cpp]
view plaincopyprint?
+(NSString *)userLanguage{
NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
NSString *language = [def valueForKey:@"userLanguage"];
return language;
}
4)设置语言方法
[cpp]
view plaincopyprint?
+(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];
}
8、拖nib,配置点击事件
一个button,一个label,button用于切换语言,label用于显示信息。
9、配置加载的第一个Controller,这里是YGViewController
YGViewController.h
[cpp]
view plaincopyprint?
#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)加载:
[cpp]
view plaincopyprint?
- (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)点击修改语言方法
[cpp]
view plaincopyprint?
- (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)接收到通知执行方法,刷新界面
[cpp]
view plaincopyprint?
-(void)changeLanguage{ [_btChange setTitle:[[InternationalControl bundle] localizedStringForKey:@"buttonInfo" value:nil table:@"hello"] forState:UIControlStateNormal]; _inviteLabel.text =[[InternationalControl bundle] localizedStringForKey:@"invite" value:nil table:@"hello"]; }
如果有多个界面的话,需要每个界面都配置接收通知,用于修改界面。
10、运行界面
可以看到点击切换语言之后,语言切换成功。
退出程序再次进入,保留了上次选择的语言。
atany原创,转载请注明博主与博文链接,3Q
/article/7601638.html
—— by atany
前言:网络上关于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、看看流程
【实现思路:】
在初始化首个Controller的时候,进行应用语言的加载。首次加载因为userLanguage(应用内语言)不存在,则使用系统当前的语言,保存到userlanguage,下次直接读。读出来之后,获取到对应文件路径,得到文件的索引,储存到工具类InternationalControl的静态变量bundle中。
其他地方需要用字符串时,用工具类获得bundle即可读取相应文件中的字符串。
7、新建工具类InternationalControl
InternationalControl.h
[cpp]
view plaincopyprint?
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface InternationalControl : NSObject
+(NSBundle *)bundle;//获取当前资源文件
+(void)initUserLanguage;//初始化语言文件
+(NSString *)userLanguage;//获取应用当前语言
+(void)setUserlanguage:(NSString *)language;//设置当前语言
@end
#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)。
[cpp]
view plaincopyprint?
static NSBundle *bundle = nil;
+ ( NSBundle * )bundle{
return bundle;
}
static NSBundle *bundle = nil; + ( NSBundle * )bundle{ return bundle; }
2)初始化方法:
userLanguage储存在NSUserDefaults中,首次加载时要检测是否存在,如果不存在的话读AppleLanguages,并赋值给userLanguage。
[cpp]
view plaincopyprint?
+(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
}
</PRE>
+(void)initUserLanguage{ NSUserDefaults *def = [NSUserDefaults standardUserDefaults]; NSString *string = [def valueForKey:@"userLanguage"]; if(string.length == 0){ //获取系统当前语言版本(中文zh-Hans,英文en) NSArray* languages = [def objectForKey:@"AppleLanguages"]; <div class="dp-highlighter bg_cpp"><div class="bar"><div class="tools"><strong>[cpp]</strong> <a target=_blank class="ViewSource" title="view plain" href="#">view plain</a><a target=_blank class="CopyToClipboard" title="copy" href="#">copy</a><a target=_blank class="PrintSource" title="print" href="#">print</a><a target=_blank class="About" title="?" href="#">?</a></div></div><ol class="dp-cpp"><li class="alt"><span><span> NSString *current = [languages objectAtIndex:0]; </span></span></li><li><span> </span></li><li class="alt"><span> string = current; </span></li><li><span> </span></li><li class="alt"><span> [def setValue:current forKey:@</span><span class="string">"userLanguage"</span><span>]; </span></li><li><span> </span></li><li class="alt"><span> [def synchronize];</span><span class="comment">//持久化,不加的话不会保存 </span><span> </span></li><li><span>} </span></li><li class="alt"><span> </span></li><li><span> </span><span class="comment">//获取文件路径 </span><span> </span></li><li class="alt"><span> NSString *path = [[NSBundle mainBundle] pathForResource:string ofType:@</span><span class="string">"lproj"</span><span>]; </span></li><li><span> </span></li><li class="alt"><span> bundle = [NSBundle bundleWithPath:path];</span><span class="comment">//生成bundle </span><span> </span></li><li><span>} </span></li></ol></div><pre style="DISPLAY: none" 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)获得当前语言方法
[cpp]
view plaincopyprint?
+(NSString *)userLanguage{
NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
NSString *language = [def valueForKey:@"userLanguage"];
return language;
}
+(NSString *)userLanguage{ NSUserDefaults *def = [NSUserDefaults standardUserDefaults]; NSString *language = [def valueForKey:@"userLanguage"]; return language; }
4)设置语言方法
[cpp]
view plaincopyprint?
+(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)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]; }
8、拖nib,配置点击事件
一个button,一个label,button用于切换语言,label用于显示信息。
9、配置加载的第一个Controller,这里是YGViewController
YGViewController.h
[cpp]
view plaincopyprint?
#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
#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)加载:
[cpp]
view plaincopyprint?
- (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];
}
- (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)点击修改语言方法
[cpp]
view plaincopyprint?
- (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];
}
- (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)接收到通知执行方法,刷新界面
[cpp]
view plaincopyprint?
-(void)changeLanguage{ [_btChange setTitle:[[InternationalControl bundle] localizedStringForKey:@"buttonInfo" value:nil table:@"hello"] forState:UIControlStateNormal]; _inviteLabel.text =[[InternationalControl bundle] localizedStringForKey:@"invite" value:nil table:@"hello"]; }
-(void)changeLanguage{ [_btChange setTitle:[[InternationalControl bundle] localizedStringForKey:@"buttonInfo" value:nil table:@"hello"] forState:UIControlStateNormal]; _inviteLabel.text =[[InternationalControl bundle] localizedStringForKey:@"invite" value:nil table:@"hello"]; }
如果有多个界面的话,需要每个界面都配置接收通知,用于修改界面。
10、运行界面
可以看到点击切换语言之后,语言切换成功。
退出程序再次进入,保留了上次选择的语言。
atany原创,转载请注明博主与博文链接,3Q
/article/7601638.html
—— by atany
相关文章推荐
- iOS 应用程序内部国际化,不跟随系统语言
- iOS 应用程序内部国际化,不跟随系统语言
- iOS 应用程序内部国际化,不跟随系统语言
- iOS 应用程序内部国际化,不跟随系统语言
- iOS 应用程序内部国际化,不跟随系统语言
- iOS 应用程序内部国际化,不跟随系统语言
- iOS 应用程序内部国际化,不跟随系统语言
- iOS 应用程序内部国际化,不跟随系统语言
- iOS 应用程序内部国际化,不跟随系统语言
- [置顶] iOS 应用程序内部国际化,不跟随系统语言
- iOS 应用程序内部国际化,不跟随系统语言
- iOS 应用程序内部国际化,不跟随系统语言
- iOS 应用程序内部国际化,不跟随系统语言
- iOS 应用程序内部国际化,不跟随系统语言
- iOS -- 国际化,不跟随系统语言--(不能使用storyboard、xib等)可网络上搜索 storyboard国际化
- iOS应用内部切换语言,不跟随系统
- iOS应用内部切换语言,不跟随系统
- iOS应用内部切换语言,不跟随系统
- iOS国际化---不跟随系统语言
- iOS应用内部切换语言,不跟随系统