zoukankan      html  css  js  c++  java
  • iOS app 国际化

    1. 创建一个新应用

    在Xcode的Single Application View模版中,Xcode对English做了本地化。

    国际化了两个文件:Main.storyboard和LaunchScreen.storyboard

     

    2. 开始国际化

    选中project,在上图的Localizations选项下,添加简体中文;Xcode会询问你是否国际化以下文件,这个地方并不重要,因为项目中所有的资源文件都可以很方便的国际化和去国际化。

    观察一下有哪些文件是可以国际化的:

    • xib和storyboard资源文件;
    • info.plist文件
    • strings文件等等

    简而言之,除了代码文件和xcassets,都可以国际化。

     

    3. 国际化代码中的文本

    国际化是基于.strings文件的,该文件的内容只是简单的key value对,如下:

    "KEY1" = "CONTENT1"; "KEY2" = "CONTENT2"

    其中Localizable和InfoPlist两个strings文件尤为重要,前者在这一小节介绍,后者在`国际化info.plist`中介绍。

    如果你在.m文件中,使用代码的方式设置按钮的title,可以使用NSLocalizedString宏定义

    #define NSLocalizedString(key, comment) 
    [[NSBundle mainBundle] localizedStringForKey:(key) value:@"" table:nil] 

    该方法会在Localizable.strings中查找key对应的value。

    完整处理过程:

    1. 新建Localizable.strings文件;
    2. 打开右侧file inspector,打开Localization选项,选中Base和中文简体;
    3. 如下,Localizable.strings文件就会从一个文件变成两个文件,编译各种语言对应的文件即可;
    4. 在代码中使用NSLocalizedString(key, nil),key为Localizable.strings中的key。

    注释:NSLocalizedString宏定义中的comment参数并没有实际意义。

     

    4. 国际化storyboard和xib文件

    国际化storyboard和xib文件国际化也是在file inspector的Localization中。

    国际化的结果就是在Xcode中可以看到一个文件变成了对应的两个文件。

    再观察一下目录结构:

    Base.lproj:

    en.lproj:

    这类资源文件,Xcode的处理方式是,原文件放在Base中,在其它语言版本中只有一个对应文件名的strings文件,再看一下LaunchScreen,strings的部分内容:

    /* Class = "UILabel"; text = "Detail view content goes here"; ObjectID = "0XM-y9-sOw"; */
    "0XM-y9-sOw.text" = "Detail view content goes here";
    
    /* Class = "UITableViewController"; title = "Master"; ObjectID = "7bK-jq-Zjz"; */
    "7bK-jq-Zjz.title" = "Master";

    其中的ObjectID是什么?

    用source code的方式,打开LaunchScreen.storyboard,全局搜索一下 0XM-y9-sOw,结果如下:

    <label clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleToFill" text="Detail view content goes here" textAlignment="center" lineBreakMode="tailTruncation" minimumFontSize="10" translatesAutoresizingMaskIntoConstraints="NO" id="0XM-y9-sOw">

    ObjectID是原文件中对应的对象。

    5. 国际化info.plist

    按照上面的思路,国际化一下info.plist,然后编译,碰到了什么问题?

    Xcode找不到info.plist。

    因为通过file inspector的Localization,Xcode会创建两个info.plist分别放在Base.lproj和zh-Hans.lproj文件夹下。

    还记得上面没讲的 InfoPlist.strings 吗? 

    处理过程:

    1. 新建一个 InfoPlist.strings 文件;
    2. Localization该文件;
    3. 编辑对应语言的InfoPlist.strings文件即可。比如,英文版本应用名叫English,中文版本叫中文,如下:

    "CFBundleDisplayName" = "English";
    
    和
    
    "CFBundleDisplayName" = "中文";

    6. 练习:国际化音频文件


    以下是必要步骤的简单描述:

    1. 把音频文件A拷贝到项目中。
    2. 打开音频文件inspector,选择本地化按钮,选择了Base和简体中文作为支持语言。
    3. 重命名第二个音频文件B,和第一个名字A一样,然后将其拷贝到es.lproj文件夹。
    4. 确保你在Finder提示中选择了“Replace File”。

    7. 国际化与多target问题

    问题描述:
    我们应用有4个分身(4个相似的app),同时还做了国际化,此时我就迷茫了!四个应用有a,b,c,d四个info.plist文件名,但是国际化info.plist的文件名都是InfoPlist.strings。。。

    解决办法:

    1. 创建四个文件夹;
    2. 在四个文件夹中分别创建一个InfoPlist.strings;
    3. 4个InfoPlist.strings关联到不同target。OK啦~

  • 相关阅读:
    每日扫盲(四):java之Netty原理和使用
    每日扫盲(三):id_rsa、id_rsa.pub 、authorized_keys
    每日扫盲(二):xxx.dll文件的作用
    每日扫盲(一):java的rmi
    工具列表
    hadoop学习笔记(七):hadoop2.x的高可用HA(high avaliable)和联邦F(Federation)
    window.history对象
    window.location对象
    推送本地文件夹到github
    docker的使用01
  • 原文地址:https://www.cnblogs.com/tangjuanj/p/6015619.html
Copyright © 2011-2022 走看看