欢迎访问我的博客muhlenXi,该文章出自我的博客。
版权声明:本文为muhlenXi原创文章,转载请注明出处,未经允许不得转载.
导语:
App根据手机系统的语言进行显示。第二种是在App内自行设置语言,也就是应用内切换语言,设置的是什么语言,就显示什么语言。
写个demo玩一下,实践是检验真理的唯一标准。
基础文件配置:
1、首先是添加App的本地化语言支持。
方法:PROJECT
-> Info
-> Localizations
-> 点击+
添加。
2、添加App名称文件
文件的名字一定要是InfoPlist
!
方法:File
-> New
-> File...
-> iOS
-> Resource
-> Strings File
3、设置InfoPlist.strings的Localization
方法:在项目中找到并选中InfoPlist.strings
文件,在靠右边的穿口中,选择支持的语言类型。
本例中选择的是英语、简体中文、繁体中文
选择语言4、设置对应文件的key-value键值对
点击InfoPlist.strings
左边的三角形符号展开该文件,分别在对应的strings文件中设置对应的键值对。
4-1、在InfoPlist.strings(English)文件中输入:
"CFBundleDisplayName" = "EnglishName";
4-2、在InfoPlist.strings(Chinese(Simplified))文件中输入:
"CFBundleDisplayName" = "CFBundleDisplayName" = "中文名字";
保存后编译并运行就可以了。
系统语言切换:
创建Localizable字符串文件
同样的步骤,执行2-3步骤,创建一个名字为Localizable
的strings文件,然后设置 Localizable.strings 的 Localization 。
然后执行步骤4,设置不同语言中项目所需的字符串。
本例中,我们需要设置Alarm clock、Medicine、Setings、Find Band、test words等字符串。
也就是说:
1-在Localizable.strings(English)文件中输入:
"Alarm clock" = "Alarm clock";
"Medicine" = "Medicine";
"Setings" = "Setings";
"Find Band" = "Find Band";
"test words" = "test words";
2-在Localizable.strings(Chinese(Simplified))文件中输入:
"Alarm clock" = "闹钟提醒";
"Medicine" = "吃药提醒";
"Setings" = "设置";
"Find Band" = "寻找手环";
"test words" = "测试语句";
调用 NSLocalizedString(key, comment)
方法
举例:
self.descriptionLabel.text = NSLocalizedString(@"test words", @"描述文字");
到这里第二部分的内容基本就完了。
应用内切换语言:
语言支持文件应用内切换语言的思路是:每当我们添加一种语言的支持后,系统就会在我们的项目中生成对应语言的
.lproj
支持文件。我们将NSUserDefaults
将用户的语言设置保存到本地中,保存的String的值和下图中的文件名一样。然后通过NSBundle
根据.lproj
支持文件生成bundle,最后通过NSLocalizedStringFromTableInBundle
方法获取对应的String的值。
具体的做法如下:
为了方便使用,我们新建一个继承NSObject
的XYJLanguageTool
类,用来管理我们的语言。
XYJLanguageTool.h
中的代码如下:
#import <Foundation/Foundation.h>
#define XYJGetStringWithKey(key) [[XYJLanguageTool sharedInstance] getStringForKey:key]
@interface XYJLanguageTool : NSObject
@property (nonatomic,strong,readonly) NSBundle * bundle;
// 单例初始化方法
+ (id) sharedInstance;
// 根据key获取相应的String
- (NSString *) getStringForKey:(NSString *) key;
// 应用内设置新语言
- (void) setNewLanguage:(NSString *) language;
@end
XYJLanguageTool.m
,中的代码如下:
#import "XYJLanguageTool.h"
#define Language_Key @"languageKey"
#define Chinese_Simple @"zh-Hans"
#define Chinese_Traditional @"zh-Hant"
#define English_US @"en"
@implementation XYJLanguageTool
+ (id)sharedInstance
{
static dispatch_once_t onceToken;
static XYJLanguageTool * languageTool;
dispatch_once(&onceToken, ^{
languageTool = [[XYJLanguageTool alloc] init];
});
return languageTool;
}
// 根据语言名获取bundle
- (NSBundle *)bundle
{
NSString * setLanguage = [[NSUserDefaults standardUserDefaults] objectForKey:Language_Key];
//默认是简体中文
if (setLanguage == nil) {
setLanguage = Chinese_Simple;
}
NSString * bundlePath = [[NSBundle mainBundle] pathForResource:setLanguage ofType:@"lproj"];
return [NSBundle bundleWithPath:bundlePath];
}
// 根据key获取value
- (NSString *)getStringForKey:(NSString *)key
{
NSBundle * bundle = [[XYJLanguageTool sharedInstance] bundle];
if (bundle) {
return NSLocalizedStringFromTableInBundle(key, @"Localizable", bundle, @"HelloWord");
}
return NSLocalizedString(key, @"HelloWord");
}
- (void)setNewLanguage:(NSString *)language
{
NSString * setLanguage = [[NSUserDefaults standardUserDefaults] objectForKey:Language_Key];
if ([language isEqualToString:setLanguage]) {
return;
}
// 简体中文
else if ([language isEqualToString:Chinese_Simple]) {
[[NSUserDefaults standardUserDefaults] setObject:Chinese_Simple forKey:Language_Key];
[[NSUserDefaults standardUserDefaults] synchronize];
}
// 繁体中文
else if ([language isEqualToString:Chinese_Traditional]) {
[[NSUserDefaults standardUserDefaults] setObject:Chinese_Traditional forKey:Language_Key];
[[NSUserDefaults standardUserDefaults] synchronize];
}
// 英文
else if ([language isEqualToString:English_US]) {
[[NSUserDefaults standardUserDefaults] setObject:English_US forKey:Language_Key];
[[NSUserDefaults standardUserDefaults] synchronize];
}
// 发送更新语言的通知,用于重新设置Window的RootViewController
[[NSNotificationCenter defaultCenter] postNotificationName:@"UpDateLanguageUI" object:nil];
}
使用方法如下(记得导入头文件):
通过调用XYJGetStringWithKey
方法来获取相应的字符串。
举例如下:
self.navigationItem.title = XYJGetStringWithKey(@"Alarm clock");
最后的真机运行图如下:
应用内切换为英语
切换为英语应用内切换为简体中文
切换为简体中文应用内切换为繁体中文
切换为繁体中文本例中的demo已经提交到Github上,点击这里下载,欢迎提出批评和指正,最后谢谢大家!
网友评论