示例代码在github上localizationsDemo

1 项目中需要配置的语言

这就是项目中其他不同形式本地化可以添加的语种设置。

  • 如下图为项目添加不同语种

  • 弹框中显示要为两个Storyboard文件添加语种信息

  • 添加完多语种后,相关需要本地化的文件会产生一组文件

实际在目录结构中是根据不同语言生成不同的*.lproj目录,再在*.lproj目录中生成了不同的.strings文件。

2 应用名称本地化

App的名称在不同语种下显示不同。

  • 新建一个.strings文件,名为InfoPlist.strings

  • 选中InfoPlist.strings,在右侧的文件检查器中点击Localize,在弹框中可以选择语种,对应项目中需要配置的语言中配置的语种。

可选中需要本地化的应用名称的语种:

  • InfoPlist.strings的不同语种文件中添加字段CFBundleDisplayName,表示应用的名称。 CFBundleDisplayName = "简体中文名称";

在模拟器中,可通过Edit Scheme...编辑语种:

3 代码中的字符串的本地化

类似应用名称本地化代码中的字符串的本地也是利用.strings文件存储翻译信息。然后再在代码中利用NSLocalizedString(翻译信息默认在Localizable.strings文件)或NSLocalizedString(_:tableName:bundle:value:comment:)(翻译信息在tableName 对应的.strings文件)文件标注。

NSLocalizedString(_:tableName:bundle:value:comment:)这种方式可根据需要把翻译信息保存在自定义的文件中,在多人开发时可以很好的防止冲突。

  • 新建一个名为Localizable.strings.strings文件。
  • 类似InfoPlist.strings文件的配置方式,配置不同语种。

  • 在代码中需要本地化的字符串修改为类似NSLocalizedString("labelName", comment: "Label")NSLocalizedString("labelName", tableName: "andy", bundle: Bundle.main, value: "", comment: "Label")

4 图片的本地化

这边所说的图片的本地化就是指,同一个名称图片,在不同语种下显示不同图片。

  • 随意添加一张图片到项目,比如Swift_Logo.png
  • 选中上面的图片,在右侧的文件检查器中点击Localize,类似之前的做法,添加所需的不同语种。

  • Finder中的不同语种的*.lproj目录中添加,相同名字但不同的图片

  • 在代码中添加类似的代码: self.imageView.image = UIImage(named: NSLocalizedString("Swift_Logo", comment: ""))

最后的英文中的状态结果为:

5 优化本地化代码书写方式

本地化时,NSLocalizedString("labelName", comment: "Label")NSLocalizedString("labelName", tableName: "andy", bundle: Bundle.main, value: "", comment: "Label")这两种方法代码写法有点繁琐,参考stackoverflow中一个问题What’s NSLocalizedString equivalent in Swift? Ask的一个答案,扩展一下String

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
extension String {
    var localized: String {
        return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: "")
    }
    
    func localized(withComment:String) -> String {
        return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: withComment)
    }
    
    func localized(tableName: String) -> String{
        return NSLocalizedString(self, tableName: tableName, bundle: Bundle.main, value: "", comment: "")
    }
}

然后,原本下面的写法:

1
2
3
        self.label.text = NSLocalizedString("labelName", comment: "Label")
        self.label2.text = NSLocalizedString("labelName", tableName: "andy", bundle: Bundle.main, value: "", comment: "Label")
        self.imageView.image = UIImage(named: NSLocalizedString("Swift_Logo", comment: ""))

就可以写成:

1
2
3
        self.label.text = "labelName".localized
        self.label2.text = "labelName".localized(tableName: "andy")
        self.imageView.image = UIImage(named: "Swift_Logo".localized)

参考: 【iOS】浅谈多语言本地化(国际化) 3分钟实现iOS语言本地化/国际化(图文详解) What’s NSLocalizedString equivalent in Swift? Ask