Localization - 国际化

2020-02-28  本文已影响0人  oncezou

国际化的实质是根据不同的语言加载对应的.lproj资源文件。.lproj中包含InfoPlist、Localizable、Main等资源文件。每新增一种语言,就会在工程目录下生成与之对应的.lproj资源文件夹。


国际化的步骤
1.新增语言
add localization.png
添加语言后,会在工程目录下生成xx.lproj文件夹(xx是语言的编码)。
eg: 添加Chinese(Simplified)(zh-Hans) 对应生成 zh-Hans.lproj
2.Main.storyboard国际化(主要针对带文本的控件)
Main.storyboard.png
/*————配置UI控件的文本内容————*/ 
// Main.strings(English) 
"PBP-pq-8OJ.text" = "Localizable";
// Main.strings(English) 
"PBP-pq-8OJ.text" = "国际化";
3.Info.plist国际化

Info.plist主要是App信息和权限的配置。Info.plist国际化的常见使用在:App的名称、权限开启的提示等。
eg: 1. 名称: 国内 抖音小视频 海外 TikTok
2. 权限提示: 相机/相册权限开启的多语言提示等

/*————配置App信息————*/ 
// InfoPlist.strings(English) App在English语言系统下的名称
"CFBundleDisplayName" = "Localizable";
// InfoPlist.strings(Traditional) App在Traditional语言系统下的名称
"CFBundleDisplayName" = "国际化";

配置InfoPlist.strings,那么Info.plist会在不同的语言系统下,展示不同的内容。

4.字符串的国际化
/*——————————定义文字内容——————————*/ 
// Localizable.strings(English) 
"Language" = "English";
// Localizable.strings(Traditional) 
"Language" = "繁体";
// 使用
let language = Bundle.main.localizedString(forKey: "Language", value: nil, table: nil)
5.图片国际化
image.png

将图片添加到对应的语言环境下。

注意:
Assets.xcassets是不能国际化的,和Main、Info.plist、Localizable不同的是:图片不能新建.strings文件,并且图片国际化之后还是保存在Assets.xcassets中,并不会存储在对应语言的.lproj文件夹下。

国际化的调试方法

国际化的实践
1. Main.storyboard自动更新

问题:在实践国际化中如果使用storyboard,会发现Main.strings不会同步storyboard,这是很糟糕的问题。

解决方案:

Deployment Postprocessing最好是在需要的时候开启,不需要时关闭。

AutoGenStrings的命名和路径并不是固定的,可以自定义。但是存放的路径和Run Script配置的必须是一致的,否则找到不到脚本。

注明:AutoGenStrings是其他作者的作品,因为没有找到真正的出处,所有没有标注。

2. 应用内切换语言环境

App内切换语言,这是很常见的需求。
前面说过: 国际化的实质是根据不同的语言设置加载对应的.lproj资源文件夹。所以切换语言就是切换.lproj

大致的步骤:

@objc private func setLanguage() {
        
    let languages = Localize.availableLanguages()
    let index = Int.random(in: 1..<3)
    Localize.setCurrentLanguage(languages[index])
        
    let story = UIStoryboard(name: "Main", bundle: BundleEx.main)
    let viewCtrl = story.instantiateViewController(withIdentifier: "RootVC")
    DispatchQueue.main.async {
        if #available(iOS 13.0, *) {
            let windows = UIApplication.shared.windows.filter { $0.isKeyWindow }.first
            guard windows != nil else {
                return
            }
            windows?.rootViewController = viewCtrl    
        } else {
            UIApplication.shared.keyWindow?.rootViewController = viewCtrl
        }
    }
}

具体的实践可以查看Localizable示例

问题:
App内切换语言,按照上面 图片国际化 的操作,是无法切换图片的,因为国际化的图片不存储在.lproj中。所以要想同时切换图片,只能将 图片名称国际化 ,使用字符串国际化的方式。

其他:
因为示例中设置语言放在一级页面,所以直接重置rootViewController,如果放在层级比较深的页面,常见的做法是:用一个蒙层遮住整个屏幕,然后屏幕下重置rootViewController,并且按之前的push栈中的层级,一层层的push到设置语言的页面。可参考iPhone的设置语言或者微信的设置语言。

3. Excel导出Localizable.strings

如果App设置的语言版本,以及内容太多,手动去编写Localizable.strings无疑是很耗时的。
TCZLocalizableTool是一个国际化工具,能帮助将Excel表转化为多版本的Localizable.strings,并且还提供多个关于国际化检测的功能。

相关资源

TCZLocalizableTool

上一篇下一篇

猜你喜欢

热点阅读