zoukankan      html  css  js  c++  java
  • iOS6和iOS7适应代码(6) —— NSLocalizedString

          我们的应用程序都需要国际化,字符串的重要组成部分。一般来说。我们是通过一个string资源文件来达到这个目的,我们需要支持多国语言,有多少次把这个文档本地化。需要使用的代码NSLocalizedString这个宏。比方。我希望设置一个tableView的title:

    self.navigationItem.title = NSLocalizedString(@"test", nil);
          我们这里加了英文和中文简体两种语言。

          

          假设客户选择了我们没有本地化的语言呢?比方。我们选择了繁体中文,那么这个title会显示什么呢?我们一般都希望显示英语。

    这点在iOS7曾经确实没问题,但在iOS7上就变了,你会发现这个语言会选择前一次使用的语言。

    也就是说,在iOS7上,我先选择。英语,然后换成中文简体,最后换成繁体中文,此时会显示中文简体!


          我在开发的一个应用也遇到了这个问题,经过检查,发现这是iOS7调整了语言的顺序导致的。

          对照setting页的多国语言设定页:

          

          我们能够非常清楚的看出,iOS6上。英语总是位于第二。余下的依照你的设置顺序反向排列;而iOS7不是这种,它全然是依照你设置语言的顺序反向排列。

          在我们调用NSLocalizedString这个宏的时候,系统会依照这个顺序去找本地化的语言文件。这样。当我们选择了繁体中文时,系统发现没有这个语言的本地化。于是依照顺序去逐个检測,iOS6就会使用英语,而iOS7就会使用上一次的语言。


          原因已经确定了,那么我们怎么改动呢?有两种方法,以下我们一一来讲。

    1. 把应用须要的默认语言放到语言表的第二个位置上,这样能够确保当前语言没有本地化时会显示默认语言

          我们知道在UserDefault里面的AppleLanguages里面存储这当前的语言列表,我们能够获得这张列表,然后调整顺序,这样,我们能够确保默认语言放在第二个。代码例如以下:

        NSMutableArray *langArray = [[NSUserDefaults standardUserDefaults] arrayForKey:@"AppleLanguages"];
        NSUInteger def_lang_index = [langArray indexOfObject:@"en"];
        if (def_lang_index != 1 && def_lang_index != 0) {
            NSMutableArray *tempArray = [NSMutableArray arrayWithObjects:langArray[0], @"en", nil];
            [langArray removeObject:langArray[0]];
            [langArray removeObject:@"en"];
            [tempArray addObjectsFromArray:langArray];
            
            [[NSUserDefaults standardUserDefaults] setObject:tempArray forKey:@"AppleLanguages"];
            [[NSUserDefaults standardUserDefaults]synchronize];
        }
          须要注意的是,这份代码必须放在main.m文件中面UIApplicationMain()之前。否则。应用本次是不起作用的,仅仅能在下次起作用。


    2.  指定Bundle里面的resource文件

          第一种方法尽管一劳永逸,但感觉改动的非常粗暴。不够优雅!

    另外一种方法才干突出我们程序猿们的高大上。不多说了,上代码!

    static NSBundle *bundle = nil;
    
    - (NSString*)getCurrentLanguage
    {
        NSArray *langArray = [[NSUserDefaults standardUserDefaults] arrayForKey:@"AppleLanguages"];
        return langArray[0];
    }
    
    - (void)setLanguage:(NSString *)l {
        NSLog(@"preferredLang: %@", l);
        NSString *path = [[ NSBundle mainBundle ] pathForResource:l ofType:@"lproj" ];
        if (!path) {
            path = [[ NSBundle mainBundle ] pathForResource:@"en" ofType:@"lproj" ];
            //[self resetLocalization];
        }
        bundle = [NSBundle bundleWithPath:path];
        
    }
    
    - (NSString *)get:(NSString *)key alter:(NSString *)alternate {
        return [bundle localizedStringForKey:key value:alternate table:nil];
    }
          这几个方法各自是获得当前语言,设置语言——假设没有资源文件就是用默认语言。最后的get:alter:方法就是实际调用的方法,当然,这个没有NSLocalizedString这样方便,所以我们再用宏包装一下:

    #define MYLocalizedString(key, comment) 
    [self get:(key) alter:(comment)]
          使用的时候例如以下:

        [self setLanguage:[self getCurrentLanguage]];
        self.navigationItem.title = MYLocalizedString(@"test", nil);
          OK,结束了,赶紧试一下吧。


          这两种方法都能够使用,个人当然推荐另外一种方法,假设另外一种方法在扩充一下。能够自己写一个类,这样我们能够确保全部的项目的使用了。





    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    HDU 4122 Alice's mooncake shop
    win7 Visual Studio 2008 安装程序时出现“ 加载安装组件时遇到问题。取消安装。”处理方法
    [置顶] 《程序员,你伤不起》–读书笔记-序
    顺序查找的优化方法
    结构体的大小的计算与空间的优化--之基本类型
    poj 1836 Alignment
    HDU 4721 Food and Productivity (二分+树状数组)
    POJ 1724 最短路费用限制
    Java面试题之九
    Eclipse 支持jQuery 自动提示
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4712574.html
Copyright © 2011-2022 走看看