zoukankan      html  css  js  c++  java
  • iOS 语言切换、本地化,国际化

    什么是本地化处理?

    本地化处理就是我们的应用程序有可能发布到世界的很多国家去,因为每个国家应用的语言是不一样的,所以我们要把我们的应用程序的语言要进行本地化处理一下。

    本地化处理需要处理那些文件?

    (1):本地化应用程序名称(我的的项目名称)

    (2):本地化字符串处理(项目中所涉及的字符串)

    (3):本地化图片

    (4):XIB文件本地化处理

    (5):其他文件

    下面进行本地化处理:

    1 . 设置我们的工程支持多语言

    为什么:因为只有设置成支持多语言了,我们才能在展示项目名称和项目中的字符串等将语言进行切换

    (1): 首先创建一个项目,以“苹果”为项目名做测试

    (2):为工程添加可支持的语言,只有项目具有我们想要用的语言,我们才能讲项目切换成这种语言

    如图所示:


     

    2:设置项目名称本地化处理

    (1):InfoPlist.strings文件是对我们应用程序的名字进行管理的

    (2):设置InfoPlist.strings其实很简单,就是借助我们上一步设置的语言环境,将我们想要支持的语言添加到InfoPlist.strings文件之下就可以了

    (3):如图所示添加过程:


     

     

    (4)接下来我们只需要将CFBundleDisplayName属性和它所对应的值分别写在我们在InfoPlist下创建的文件中

    例如:

    在InfoPlist.strings(English)中我们写入:CFBundleDisplayName = "apple";

    在InfoPlist.strings(Chinese(Simplified))中我们写入:CFBundleDisplayName = "苹果";

    在InfoPlist.strings(English)中我们写入:CFBundleDisplayName = "リンゴ";

    注意:后面的“”前面不加@

    (5):在Info.Plist文件中添加一个属性Application has localized display name然后设置成Boolean类型的Yes就可以了


     

    (6):在模拟器中更改模拟器的语言就会看到以下三种效果:


     

     

     

    3:本地化字符串处理(项目中所涉及的字符串)

    提示:本地化字符串处理和2中讲的项目名本地化处理基本上是一样的,只不过我们需要在创建一个像Info.Plist文件一样的文件来管理我们的本地化字符串

    就是创建一个Localizable.strings文件,然后同样是在这个文件夹下创建多种支持语言

    在Xcode项目中,在你想要的位置新建文件

     然后选中当前文件,属性中 点击 "Localiztion"->"Localize..." ->勾选语言

    (1):创建Localizable.strings文件的方式和上面创建Info.Plist的方式是一样的,只是文件名不一样

    (2):在Localizable.strings文件下添加支持的语言

    如图所示:


     

    (3):然后我们在Localizable.strings下得各个文件添加类似于如下的内容:

    例如:

    Localizable.strings(English)中       “Login”=“Login”;

    Localizable.strings(Chinese(Simplified)) 中   “Login” = “登陆”;

    Localizable.strings(Japanese) 中  “Login” = “登録”;

    然后有人可能问了我们每个等号前的"Login"是怎么确定的? :往下看

    然后我们怎么用呢?

    就是每次我们在用到我们设定的字符串的时候不用NSString了,我们需要用到一个函数代替它:NSLocalizedString(key, comment) 

    例如我们要再一个Button上设定主题:button.title = NSLocalizedString(@“Login”, nil);

    这个里面的@“Login”就会自动检索于设备相同语言的Localizable.strings下得文件夹,然后在里面找到与@“Login”相同的Key值,然后就输出出来

    其实我们在Localizable.strings下得文件夹中设置的内容就像一个字典一样,前面是Key值后面是对应的值,然后就是通过NSLocalizedString(@“Login”, nil);函数进行检索,将key对应的值返回过来。

    有人会文NSLocalizedString(key, comment)中的comment是什么,很明显根据字义判断是注释的意思

    如图所示:


     

    总结:

    其实很简单,就是我们把Localizable.strings下面设置好我们所需要的语言,然后我们在将我们在项目中用到的字符串都用"Three"="3";的形式整理到各个对应的文件里面,然后我们要是用到我们需要的字符串的时候我们就通过NSLocalizedString(key, comment)函数以key值的形式找里面的值,然后将我们自己设置的语言对应的值展现出来,这就是本地化处理



    文/深山老林飞(简书作者)
    原文链接:http://www.jianshu.com/p/b053bbd8c339

    【自己的补充】

      

    如果是自己的应用本地需要做语言切换的话,实现逻辑如下

    1.配置的语言

    #define lang_en @"en"
    #define lang_zh_hans @"zh-Hans"
    #define lang_zh_hant @"zh-Hant"
    

      下面的方法中languageCode: 就是这几个值, 其他语言的不做阐述

    2.通过当前选择的语言调用相应语言字符串

    /**
     *  获取国际化字符串值
     *
     *  @param key <#key description#>
     */
    - (NSString*)localeStringWithKey:(NSString*)key{
        // Get the language code.
        NSString *languageCode = self.language;
        
        // Get the relevant language bundle.
        NSString *bundlePath = [[NSBundle mainBundle] pathForResource:languageCode ofType:@"lproj"];
        NSBundle *languageBundle = [NSBundle bundleWithPath:bundlePath];
        
        // Get the translated string using the language bundle.
        NSString *translatedString = [languageBundle localizedStringForKey:key value:@"" table:nil];
        
        if (translatedString.length < 1) {
            
            // There is no localizable strings file for the selected language.
            translatedString = NSLocalizedStringWithDefaultValue(key, nil, [NSBundle mainBundle], key, key);
        }
        
        return translatedString;
    }
    

      

    Swift:

    //获取国际化
    enum AppLanguage:String{
        case en = "en"
        case zh_Hans = "zh-Hans"
        case zh_Hant = "zh-Hant"
    }
    func localString(key:String) -> String{
        // Get the language code.
        let languageCode = XPApplication.shareInstance.language
        
        // Get the relevant language bundle.
        let bundlePath = NSBundle.mainBundle().pathForResource(languageCode, ofType: "lproj")
        let languageBundle = NSBundle.init(path: bundlePath!)
        
        // Get the translated string using the language bundle.
        var translatedString = languageBundle?.localizedStringForKey(key, value: "", table: nil)
        
        if translatedString?.length < 1 {
            
            // There is no localizable strings file for the selected language.
            translatedString = NSLocalizedString(key, tableName: nil, bundle: NSBundle.mainBundle(), value: key, comment: key)
        }
        
        return translatedString!;
    }
    

      

  • 相关阅读:
    自绘标题栏
    显示驱动相关 -- DrvEscape和ExtEscape
    Delphi 直接打印代码(不需要装打印机驱动)
    在TCanvas上画背景透明的矩形
    写作套路中的立功,立言,立德
    python入门(Python和Pycharm安装)
    delphi CxGrid用法总结(63问)
    如何安装inf类型驱动程序 inno
    PHP-SQL Server
    Exchange Tech Issues 参考网站
  • 原文地址:https://www.cnblogs.com/xiaopin/p/5825177.html
Copyright © 2011-2022 走看看