美文网首页Ios
iOS的Internationalization和localiz

iOS的Internationalization和localiz

作者: r_lin | 来源:发表于2016-05-14 12:04 被阅读2093次

今天介绍如何使iOS应用支持多语言。

多语言支持本质是使用多个键值对列表,App在运行时根据当前机器的语言环境选择与该语言对应的列表。多语言的App都需要创建多个strings文件。

Interface Builder中

在storyboard上或xib文件上完成布局开发,然后在Xcode左侧的project navigator选中顶部项目名,在中间的编辑区中选中project,在Info中添加语言文件。

Info -> PROJECT -> Localization

完成添加后选中storyboard文件或者xib文件,返回Interface Builder。右侧工作栏选中第一项File inspector,点击Localization栏中的“Localize..."按钮后在该栏中会显示语言文件列表,勾选前面的勾,弹出框保持默认并确定。

这时Xcode左侧的project navigator中的storyboard文件名前面会出现一个三角号,点击三角号展开,选中strings文件进行翻译即可。

展开

程序中

在原本使用字符串的地方用下面的方法代替:

let str = NSLocalizedString("翻译key", comment: "注释")

NSString *str = NSLocalizedString(@"翻译key", comment: @"注释")

建议不要省略注释,使用命令行工具genstrings生成strings文件时会自动把注视添加到文件中。

单个类实现文件

类文件实现后,打开终端Terminal,使用cd命令定位到存放该类文件的文件夹。比如AnotherViewController.swift文件中使用了NSLocalizedString,需要对它翻译,它的存放路径为/Users/Roy/Localization/Localization/AnotherViewController.swift。
在Terminal使用下面的命令进行定位

$ cd /Users/Roy/Localization/Localization/

然后使用$ genstrings AnotherViewController.swift会在当前路径生成Localizable.strings文件。

如果Objective-C类实现文件,把 AnotherViewController.swift改为AnotherViewController.m即可。

多个类实现文件

如果有多个类实现文件使用了NSLocalizedString,可以如下操作汇总生成Localizable.strings文件。
使用cd命令定位到项目文件的根目录,如果项目的存放路径为/Users/Roy/Localization/:
cd /Users/Roy/Localization/

然后执行下面的命令:
find ./ -name "*.swift" -print0 | xargs -0 genstrings

如果是Objective-C文件,把"*.swift"变为 "*.m"。

如此操作后会在项目的根目录生成Localizable.strings文件。

使用生成的strings文件

把Localizable.strings文件加入到项目中:在Finder中把该文件拖到Xcode的project navigator中,注意弹出窗口,保证文件正确添加到target中。

添加完,在Xcode的project navigator选中Localizable.strings文件,在右侧的工具栏中选中第一项Info,然后找到Localization栏点击“Localize..."按钮,出现下面对话框,选择Base后点击Localize按钮。

此时project navigator栏中的Localizable.strings前回出现一个三角号,点击展开,选中对应语言版本进行翻译即可。

更新strings文件

无论是Interface Builder还是程序中使用NSLocalizedString,当我们完成strings文件的添加后,如果继续添加需要翻译的内容--比如在storyboard新增一个需要翻译的按钮,在程序中新增了一个NSLocalizedString,新增的条目并不会自动添加到对应语言的strings文件中,需要我们自己更新strings文件。

storyboard或者xib文件

在storyboard或者xib文件中添加新的组件后,使用cd命令定位到文件的存放文件夹,使用下面的命令生成新的strings文件

$ ibtool Main.storyboard --generate-strings-file NewMain.strings

在Finder中找到NewMain.strings并打开,在打开的窗口中找到在storyboard或者xib文件中新增的组件对应的条目,复制到粘贴板。
在project navigator点击storyboard或者xib文件前的三角号展开

展开

点击各语言的strings文件打开,把新增(粘贴板)的内容粘贴到文件中并翻译。各语言的strings文件都完成后,把NewMain.stirngs删除。

NSLocalizedString

如果新增了一个类实现文件,如AnotherViewController.swift,使用了NSLocalizedString,要把新增的条目添加到已有的各语言的strings文件中。假如它的存放路径为/Users/Roy/Localization/Localization/Another/AnotherViewControler.swift,,如下操作:
cd定位到项目的Localization文件夹

cd /Users/Roy/Localization/Localization/

然后执行

find ./ -name "*.lproj" -print0 | xargs -0 -I {} genstrings ./Another/AnotherViewControler.swift -a -o {}

如果是Objective-C文件把AnotherViewControler.swift改为AnotherViewControler.m 即可。

注意

要保证Base.lproj文件完整,就是说该文件夹中的key-value对要保持完整,该文件夹中的资源在iOS设备上的语言你没有提供支持时使用。该文件的完整使App能在所有有不同语言的设备上正常使用。

如果App在翻译前已经在模拟器或者真机上调试过,需要把App从调试设备上删除,项目clean后重新编译,这样才能使翻译生效。要保证clean得彻底,如下操作:点击Xcode顶栏中的Product,弹出菜单后按住option键不放,你会发现“clean”选项变成“clean Build Folder...“,点击clean Build Folder选项。

Demo

相关文章

网友评论

  • eb9f7bec7caf:赞!写的很全面!
  • unhangcorn:好人一生平安
  • e13520cb7329:iOS app localization projects can be managed with the localization service https://poeditor.com and I actually strongly recommend it for team work. This is because it has a very clean and simple interface where translators and project managers can meet to do their work in more productive and automatized manner.
    It's github and bitbucket integrated and it has API too.

本文标题:iOS的Internationalization和localiz

本文链接:https://www.haomeiwen.com/subject/ozemrttx.html