【第22期】观点:IT 行业加班,到底有没有价值?

iOS开发-多语言本地化和手动切换

原创 2016年06月01日 10:58:43


      App要国际推广,需要支持多语言。可以通过本地化语言和切换来实现。本工程可以不切换系统语言,不重启应用直接切换自定义语言。现在只写中英文,其他语言也是同样处理方法。如果支持语言多,切换时间也不会花长时间,瞬间成功切换。

                                             


1.创建工程项目





2.配置项目本地化支持简体中文和英文


      工程-PROJECT-info->Localizations,点“+”,选择(Chinese(Simplified))添加简体中文,英文Xcode自带有(English),所以不需要再次添加。








3.添加多语言文件


      1>.我们选择使用自己的语言文件,所以要创建一个后缀为.strings文件;
      2>.需要可以手动切换语言,而不是根据系统语言变换,所以命名不能为Localizable.strings;
      3>.文件取名为Language.strings(自己随意命名,后缀为:.strings)(记得Targets要勾选项目)。







4.配置Language.strings本地化,支持简体中文和英文。


      1>.选中Language.strings文件,查看Xcode右侧边栏信息;
      2>.点击Localization中的Localize…按钮;
      3>.选择Base或中文或英文 然后Localize;
      4>.勾选中文和英文,Base项可有可无,都选择UseFile。










这时候Language.strings会多出两个子文件,分别对应英文和简体中文。

在项目工程文件夹中也会看到两个文件夹en.lproj和zh-Hans.lproj。

这两个文件夹不要复制其他项目的,因为这两个文件跟本项目工程文件相关联,直接复制过来会读取不到里面的.strings文件。当然,直接复制里面的内容是可以的。






5.在Language.strings添加并完善所有需要转换的文字


      1.每个字段都以分号间隔,因为不是OC文件所以不需要使用@表示字符串;
      2.“key键”=“value值”,键可以用中文,也可有用英文,性能有没差别看不出。

 




</pre><pre name="code" class="objc">//English

"top" = "top";
"middle" = "middle";
"bottom" = "bottom";
"left" = "left";
"right" = "right";
"enter" = "enter";
"cancel" = "cancel";
"language" = "English";
"back" = "back";

"change" = "change language";


//简体中文

"top" = "上部";
"middle" = "中间";
"bottom" = "底部";
"left" = "左侧";
"right" = "右侧";
"enter" = "确定";
"cancel" = "取消";
"language" = "中文";
"back" = "返回";

"change" = "修改语言";


6.写个PCH宏定义


用来读取语言文件和返回的value值。毕竟在一个项目里会有多个文件会用到,所以用PCH

建立PCH,在Targets -- Build Settings -- Apple LLVM Language -- PrefixHeader  右侧双击 填入工程名/PCH文件名(如:iOS多语言本地化和切换/PrefixHeader.pch)











在pch中输入

/*
 获取当前保存在NSUserDefaults的本地语言
 
 #define currentLanguage  [NSString stringWithFormat:@"%@",[[NSUserDefaults standardUserDefaults]objectForKey:@"appLanguage"]]
 
 根据获取语言文件所在路径
 文件名类型Type为lproj,即.lproj的文件夹.  zh-Hans.lproj和en.loproj
 存在NSUserDefaults的适合,中英文就分别设置zh-Hans和en,不可改变。
 
 #define LanguagePath [[NSBundle mainBundle] pathForResource:currentLanguage ofType:@"lproj"]
 
 根据键值获取返回转换结果
 Language为语言文件名Language.string
 
 #define Localized(key) [[NSBundle bundleWithPath:LanguagePath] localizedStringForKey:(key) value:nil table:@"Language"]
 */


//等同于上面定义的三个宏综合
#define Localized(key)  [[NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%@",[[NSUserDefaults standardUserDefaults] objectForKey:@"appLanguage"]] ofType:@"lproj"]] localizedStringForKey:(key) value:nil table:@"Language"]//<span style="font-family: Arial, Helvetica, sans-serif;">Language一定要和创建的strings文件名相同</span>





注意:



7.保存当前使用语言到NSUserDefaults (添加刷新页面方法)
   

1>.在 AppDelegate.h声明一个刷新页面的方法,内部实现如图

2>.在AppDelegate.m文件didFinishLaunchingWithOptions获取当前手机语言,并存储到NSUserDefaults。

#import "AppDelegate.h"
#import "ViewController.h"
@interface AppDelegate ()

@end

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    
    //添加nav
    [self mainVC];
    
    //获取当前手机语言,存储到NSUserDefaults。
    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;
}
//在.h里声明一下
- (void)mainVC
{
    UINavigationController  *nav = [[UINavigationController alloc]initWithRootViewController:[ViewController new]];
    self.window.rootViewController = nav;
    
}






8.创建并初始化UI控件 


      1>.在ViewController.m创建并初始化UILabel用于显示多语言文字,UIButton切换语言按钮及响应事件。
      读取根据语言文件键值获取返回值,使用方法:Localized(key)。                                                                                   2>.跳转页面实现改变语言

#import "ViewController.h"
#import "SecondViewController.h"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    UILabel *lable = [[UILabel alloc]initWithFrame:CGRectMake(0, 64, self.view.frame.size.width, 200)];
    lable.backgroundColor = [UIColor groupTableViewBackgroundColor];
    lable.text = [NSString stringWithFormat:@"%@ ------ %@",Localized(@"top"),Localized(@"bottom")];
    lable.textColor = [UIColor blackColor];
    lable.textAlignment = NSTextAlignmentCenter;
    [self.view addSubview:lable];
    
    
    UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    btn.frame = CGRectMake(0, CGRectGetMaxY(lable.frame)+100, self.view.frame.size.width, 200);
    btn.backgroundColor = [UIColor lightGrayColor];
    [btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    [btn setTitle:[NSString stringWithFormat:@"%@",Localized(@"change")] forState:UIControlStateNormal];
    [btn addTarget:self action:@selector(btnClick) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:btn];
    
    
}
-(void)btnClick
{
    [self.navigationController pushViewController:[SecondViewController new] animated:YES];
}




9.添加通知中心(在第二个页面)

       1.因为是要刷新所有试图,所以之前的所有试图都要重新初始化,需要重新设置window.rootViewController

2. 为了不再重复代码,就直接调用AppDelegate的toMain方法,来设rootViewController      

        接收到通知的时候响应事件,也可用不用通知做,直接在按钮点击事件添加语言切换操作。


#import "SecondViewController.h"
#import "AppDelegate.h"

#define LanguageChanged   @"LANGUAGE_CHANGE_NOTIFICATION"

@interface SecondViewController ()

@end

@implementation SecondViewController

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    //添加通知中心,监听语言改变
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(languageChanged) name:LanguageChanged object:nil];
    
}
- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    //移除通知中心
    [[NSNotificationCenter defaultCenter] removeObserver:self name:LanguageChanged object:nil];
}

//KVO跳转
- (void)languageChanged
{
    AppDelegate *appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
    [appDelegate mainVC];
}







10.添加切换语言事件
      UIButton切换语言按钮及响应事件。
      //修改本地获取的语言文件-交替
- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.title = Localized(@"middle");
    UIBarButtonItem *left = [[UIBarButtonItem alloc]initWithTitle:Localized(@"back") style:UIBarButtonItemStylePlain target:self action:@selector(back)];
    self.navigationItem.leftBarButtonItem = left;
    
    
    UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    btn.frame = CGRectMake(0, 100, 375, 200);
    btn.backgroundColor = [UIColor lightGrayColor];
    [btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    [btn setTitle:[NSString stringWithFormat:@"%@",Localized(@"language")] forState:UIControlStateNormal];
    [btn addTarget:self action:@selector(btnClick) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:btn];
    
    
}
- (void)back
{
    [self.navigationController popToRootViewControllerAnimated:YES];
}
- (void)btnClick
{
    UIAlertController *alert =[UIAlertController alertControllerWithTitle:Localized(@"chenge") message:nil preferredStyle:UIAlertControllerStyleAlert];
    UIAlertAction *left = [UIAlertAction actionWithTitle:Localized(@"cancel") style:UIAlertActionStyleCancel handler:nil];
    UIAlertAction *right = [UIAlertAction actionWithTitle:Localized(@"enter") style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        
        [self enterClick];
        
    }];
    [alert addAction:left];
    [alert addAction:right];
    [self presentViewController:alert animated:YES completion:nil];
}
- (void)enterClick
{
    
    
    //修改本地获取的语言文件--交替
    NSString *language = [[NSUserDefaults standardUserDefaults]objectForKey:@"appLanguage"];
    if ([language isEqualToString: @"en"]) {
        [[NSUserDefaults standardUserDefaults] setObject:@"zh-Hans" forKey:@"appLanguage"];
    }else        {
        [[NSUserDefaults standardUserDefaults] setObject:@"en" forKey:@"appLanguage"];
    }
    [[NSUserDefaults standardUserDefaults] synchronize];
    [[NSNotificationCenter defaultCenter] postNotificationName:LanguageChanged object:nil];
    
}





本文Demo : http://download.csdn.net/detail/jackjia2015/9411833


版权声明:本博客为学习博客,写技术,写生活,有原创,有转载,有改编......希望你我共同进步 交流QQ群:52795427 举报

相关文章推荐

mac电脑(os x系统)多网段设置

需要经常访问不同网段网络的朋友在window系统下,很容易通过在ip设置的“高级设置”选项中添加网段,就可以轻松访问不同网段的网络(如果没有设置过可以问下度娘),但转到使用Mac(os x系统)电脑时...

[iOS]应用内切换语言,本地化,国际化

一、需求说明一般应用国际化都是跟随系统,有时候希望在应用内进行切换,所以这篇文章就是介绍如何实现在应用内的语言切换,或者叫国际化。二、解决方案这是我很早实现的功能了,因为有网友求Demo,所以我就写了...

iOS多语言(国际化)开发(跟随系统 + APP内手动设置)

iOS多语言(国际化)开发(跟随系统 + APP内手动设置) && 修改系统默认开发语言

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

前言:网络上关于iOS国际化的文章很多,但基本上都是基于跟随系统语言的国际化,笔者就不赘述了-0 – 今天要讲的是不跟随系统的切换语言版本方案,即程序内部的切换语言版本方案。 ...
  • x32sky
  • x32sky
  • 2014-09-03 18:30
  • 12809

iOS 手动设置本地化语言

在iOS的开发中,我们需要做本地化的动作,对一些资源(主要是字符串),在不同的语言下显示各自的内容。比如edit,在英语下显示“Edit”,中文下就是“编辑”。 最近做的项目客户要求支持两种...

iOS本地化国际化(续):不更随系统,手动选择APP语言 本地化和国际化的实现

版权声明:本文为博主原创文章,未经博主转载通通打死~ 目录(?) [-] 环境iOS国际化原理分析开始国际化文本的国际化图片的国际化 方案二原生支持 StoryboardXIB的国际化 应用...

Mac App名字支持多语言显示

先进工具就是生产力。 最近发现又被XE4坑了一把,工程名称必须为英文,如果是中文,输出对应的app也是中文,在10.10一下的版本中都能正常运行,但是到了10.10就无法启动了。【XE7出来的就都可以...

Mac文件夹多语言显示设置

当我们使用Mac中文语言的时候,使用终端Terminal看到的文件夹列表和直接在Finder里面看到的不一样。经常我们使用一个中文的文件夹在终端cd选择的时候切换输入法会感觉比较恶心。但是系统默认的几...

iOS-生成国际化包-配置App多语言支持

如果你的App需要支持多国语言。那么,就应该为你的App应用添加“国际化”支持。 国际化其实都大同小异,其核心思想就是为每种语言单独定义一份资源。1.创建国际化语言文件:文件名为:Localizab...

1.3iOS支持多语言(含demo)

如果app将来面向国际化,比如说中国需要使用,美国也需要使用,此时就需要考虑app支持多国语言
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)