iOS本地化(swift)

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

示例代码在github上localizationsDemo

1 项目中需要配置的语言

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

  • 如下图为项目添加不同语种
iOS本地化(swift)_第1张图片
  • 弹框中显示要为两个Storyboard文件添加语种信息
iOS本地化(swift)_第2张图片
  • 添加完多语种后,相关需要本地化的文件会产生一组文件
iOS本地化(swift)_第3张图片

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

iOS本地化(swift)_第4张图片

2 应用名称本地化

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

  • 新建一个.strings文件,名为InfoPlist.strings
iOS本地化(swift)_第5张图片
  • 选中InfoPlist.strings,在右侧的文件检查器中点击Localize,在弹框中可以选择语种,对应项目中需要配置的语言中配置的语种。
iOS本地化(swift)_第6张图片

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

iOS本地化(swift)_第7张图片
  • InfoPlist.strings的不同语种文件中添加字段CFBundleDisplayName,表示应用的名称。
    CFBundleDisplayName = "简体中文名称";
iOS本地化(swift)_第8张图片
iOS本地化(swift)_第9张图片

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

iOS本地化(swift)_第10张图片

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

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

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

  • 新建一个名为Localizable.strings.strings文件。
  • 类似InfoPlist.strings文件的配置方式,配置不同语种。
iOS本地化(swift)_第11张图片
  • 在代码中需要本地化的字符串修改为类似NSLocalizedString("labelName", comment: "Label")NSLocalizedString("labelName", tableName: "andy", bundle: Bundle.main, value: "", comment: "Label")
iOS本地化(swift)_第12张图片

4 图片的本地化

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

  • 随意添加一张图片到项目,比如Swift_Logo.png
  • 选中上面的图片,在右侧的文件检查器中点击Localize,类似之前的做法,添加所需的不同语种。
iOS本地化(swift)_第13张图片
  • Finder中的不同语种的*.lproj目录中添加,相同名字但不同的图片
iOS本地化(swift)_第14张图片
  • 在代码中添加类似的代码: self.imageView.image = UIImage(named: NSLocalizedString("Swift_Logo", comment: ""))

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

iOS本地化(swift)_第15张图片

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

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

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: "")
    }
}

然后,原本下面的写法:

        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: ""))

就可以写成:

        self.label.text = "labelName".localized
        self.label2.text = "labelName".localized(tableName: "andy")
        self.imageView.image = UIImage(named: "Swift_Logo".localized)
iOS本地化(swift)_第16张图片
欢迎您访问我的的微信公众号:欣欣向戎(微信号: andy_ron1587 )!

你可能感兴趣的:(iOS本地化(swift))