![ffa3951b1fcd6a84c50db7969166f192.png](https://i-blog.csdnimg.cn/blog_migrate/fe6b713ead3dce2dc232d524b4d3d2ad.jpeg)
开发了一款好用的 macOS app 后,为了让更多人的尝到自己 “真香” 的作品,app 的国际化和本地化是有必要的,app 的本地化分三部曲讲解,本文是第三部:代码字符串本地化。
第一部传送门:
十里:macOS 开发之 APP 名称本地化zhuanlan.zhihu.com![4e7a8267a1dd6757527545cec35315e5.png](https://i-blog.csdnimg.cn/blog_migrate/701723b3674dc36edd0f314b6f33a0e1.jpeg)
第二部传送门:
十里:macOS 开发之 storyboard 或 xib 本地化zhuanlan.zhihu.com![405ff3f82566b074d5d6666564be4d73.png](https://i-blog.csdnimg.cn/blog_migrate/f05f85f8521d49a7448fb2d33da1e2b3.jpeg)
实现平台
- macOS 10.14.3
- swift 4.2.1
- xcode 10.1
1. 准备工程
本文直接使用上一篇文章macOS 开发之 storyboard 或 xib 本地化的工程,点我下载!
为了展示本文要讲的内容,这里利用已有的 label,另外添加两个按钮来切换 label 的内容。
1.1 添加按钮
打开上面下载的工程,打开 Main.storyboard
可以看到 View controller 中已经有一个 label ,本小节添加两个按钮,并添加相应的点击 action。
- 按下快件键
Shift
+Command
+l
键,打开控件选择器,搜索框输入button
就会筛选出所有的按钮控件,将其中的Gradient Button
拖入 View Controller,调整其大小为 50 * 232,靠左放置到合适位置,打开 Attributes Inspector(选中按钮,按组合键Option
+Command
+ 4),其中勾选Transparent
,Image 选择NSGoForwardTemplate
,然后勾选Refuse First Responder
- 同样的方法添加第二个按钮(或者直接复制第一个按钮),不过是靠右放置,Attributes Inspector 中更改 Image 为
NSGoBackTemplate
,其它设置与第一个按钮一致 - 按下快捷键
Option
+Command
+ 回车键会显示Main.storyboard
中 view controller 对应的 Assitant Editor 并打开对应的 swift 文件 - 选中第一个按钮,按住
Ctrl
键,鼠标左键按住拖动至 Assitant Editor 中松手添加一个 Action ,名称为previousLabel
- 选中第二个按钮,按住
Ctrl
键,鼠标左键按住拖动至 Assitant Editor 中松手添加一个 Action ,名称为nextLabel
上述五步操作,可参考如下视频进行:
![dd18152d49a60c33858db6e774560cff.png](https://i-blog.csdnimg.cn/blog_migrate/1ba92fbee7e7baf7b148f42f35ab4869.jpeg)
1.2 添加 Label 的 outlet
打开 Main.storyboard ,选中 view controller 中的 label,按下快捷键 Option
+ Command
+ 回车键会显示 Main.storyboard
中 view controller 对应的 Assitant Editor 并打开对应的 swift 文件,按住 Ctrl
键,在 label 上按住鼠标左键拖动到 Assitant Editor 中松手添加一个 outlet ,名称为 movieLabel
。
1.3 添加标签内容
在 ViewController.swift 的 ViewController 类中添加以下定义:
let movies = ["天空之城", "幽灵公主", "风之谷"]
var movieIndex = 0
在 ViewDidLoad 方法的 super.viewDidLoad()
后面添加:
movieLable.stringValue = movies[movieIndex]
1.4 完善按钮的 action
补充 previousLabel
和 nextLabel
的实现:
@IBAction func previousLabel(_ sender: Any) {
movieIndex -= 1
if movieIndex < 0 {
movieIndex = movies.count - 1
}
movieLable.stringValue = movies[movieIndex]
}
@IBAction func nextLabel(_ sender: Any) {
movieIndex += 1
if movieIndex >= movies.count {
movieIndex = 0
}
movieLable.stringValue = movies[movieIndex]
}
2. 代码本地化
代码中字符串的本地化需要新建一个名为 Localizable.strings
的文件,新建过程类似于十里:macOS 开发之 APP 名称本地化 中 InfoPlist.strings
的过程,代码中的字符串如果需要本地化必须在这个文件中定义。
2.1 添加本地化文件
- 按下快捷键
Command
+n
打开新建文件的导航窗口,选中 macOS - Resources - Strings file,next, 更改名称为Localizable.strings
- 此时会打开文件,按下快捷键
Option
+Command
+1
就会打开其 file Inspector,可以看到分组Localization
中的Localize...
按钮,点击这个按钮就会跳出弹窗:
![eaeae4b819692c5dac3d7a8f2bc562e6.png](https://i-blog.csdnimg.cn/blog_migrate/6e2a9e4793b56a9f48a761fa29d92013.jpeg)
- 选择
English
选项,点击Localize
就会发现InfoPlist.strings
Inspector 中的Localizations
分组变成了三个勾选框,其中English
是勾选的,这里也把 Chinese 和 Japanese 勾选上,此时你会发现 Xcode 左侧工程导航栏InfoPlist.strings
左侧出现了一个小三角,点开就会发现其变成了与三种语言对应的三个 Strings 文件:
![edd03bbd8f50c6914691aa555575b311.png](https://i-blog.csdnimg.cn/blog_migrate/8d58db1b88b8341fc4101a14c5eb6f85.jpeg)
2.2 代码字符串的本地化
代码中字符串的本地化需要两步,一是在刚新建的 String 文件中添加字符串定义,二是调用方法 NSLocalizedString(forKey:, comment:)
根据字符串定义的键获取字符串。
2.2.1 添加本地化字符串定义
因为代码中只在 movies
初始化中使用了字符串,所以对应要定义一下它们,分别在三个 Strings 文件中定义。
- Localizable.strings (English):
"movie-label-1.title" = "Laputa Castle in the Sky";
"movie-label-2.title" = "Princess Mononoke";
"movie-label-3.title" = "Nausicaa Of The Valley Of The Wind ";
- Localizable.strings (Chinese(Simplified)):
"movie-label-1.title" = "天空之城";
"movie-label-2.title" = "幽灵公主";
"movie-label-3.title" = "风之谷";
- Localizable.strings (Japanese):
"movie-label-1.title" = "天空の城ラピュタ";
"movie-label-2.title" = "もののけ姫";
"movie-label-3.title" = "風の谷のナウシカ";
2.2.2 更新代码
修改添加本地化字符串对应的地方,也就是 movies
初始化的地方,修改为:
let movies = [NSLocalizedString("movie-label-1.title", comment: ""),
NSLocalizedString("movie-label-2.title", comment: ""),
NSLocalizedString("movie-label-3.title", comment: "")]
2.2.3 效果展示
更改系统语言查看各语言的效果。
- English
![afda256b12e8b47b34ebeb560261cda0.png](https://i-blog.csdnimg.cn/blog_migrate/eebf027ce5d0f9510428c20e6a643870.png)
- Chinese(Simplified)
![02b00e92e3f3983528aa2515bac51857.png](https://i-blog.csdnimg.cn/blog_migrate/20c210271cae4c200071460b7ce0370d.png)
- Japanese
![f5422ec3b80144ef799bd7d3a3d0e166.png](https://i-blog.csdnimg.cn/blog_migrate/17802caea09b84f79aef22d9cc4d93e4.png)
2.3 添加新的本地化字符串
在 macOS 开发之 storyboard 或 xib 本地化 中提到了一个工具 BartyCrouch,它的子命令 code
可以帮助我们自动扫描代码中调用 NSLocalizedString(forKey:, comment:)
的地方,如果 Localizable.strings
中没有的字符串键会自动追加,非常方便!
⚠️:
bartycrouch 已经发布了 4.0.0,使用方法有所变化,这里展示的方法只适用于 bartycrouch v3.x.x 版本,后续十里会出一篇关于 bartycrouch v4.0.0 的使用教程,请持续关注十里的博客
SMSLITwww.smslit.top和 知乎专栏
macOS 开发zhuanlan.zhihu.com![39ba180c59303c41702ad51bd4badab6.png](https://i-blog.csdnimg.cn/blog_migrate/1f4d7a6fbd5b69c6f5db2052c63e3d30.jpeg)
所以我们在之后若要将要使用的字符串本地化,直接使用 NSLocalizedString(forKey:, comment:)
方法,同时定义一个新的 key 先用上,之后去命令行使用 bartycrouch code
就可以添加新的字符串定义,只需要再修改 Strings 文件中新加键的值就可以了。
2.3.1 举例说明
- 比如再在
movies
初始化中新加一个元素,代码可写为:
let movies = [NSLocalizedString("movie-label-1.title", comment: ""),
NSLocalizedString("movie-label-2.title", comment: ""),
NSLocalizedString("movie-label-3.title", comment: ""),
NSLocalizedString("movie-label-4.title", comment: "")]
- 命令行下切换至工程文根目录,执行命令:
# -p 指定包含工程代码文件的目录 ,-l 指定可以搜到 Localizable.strings 文件的代码目录
$ bartycrouch code -p InternationalDemo -l InternationalDemo
ℹ️ BartyCrouch: Successfully updated strings file(s) of Code files.
- 打开三个
Localizable.strings
文件会发现新添加了一项,并且为每一个添加了预置注释:
/* No comment provided by engineer. */
"movie-label-4.title" = "";
- 分别为三个 Strings 文件修改对应新加项的值:
"movie-label-4.title" = "Howl's Moving Castle";
"movie-label-4.title" = "哈尔的移动城堡";
"movie-label-4.title" = "ハウルの動く城";
运行程序,可以看到不同语言下,第四个电影就出现了!
2.3.2 编译时更新
macOS 开发之 storyboard 或 xib 本地化 中在工程中创建了 build phase 运行脚本,脚本中添加代码字符串本地化要执行的命令即可:
# Type a script or drag a script file from your workspace to insert its path.
if which bartycrouch > /dev/null; then
bartycrouch interfaces -p .
bartycrouch code -p . -l .
bartycrouch lint -e -d -p .
else
echo "warning: BartyCrouch not installed, download it from https://github.com/Flinesoft/BartyCrouch"
fi
每次编译运行工程的时候就会自动更新 Localizable.strings 文件了。
至此,您应该学会如何对代码中字符串本地化了吧!
此部分完成后的工程下载:
InternationalDemo3pichome-1254392422.cos.ap-chengdu.myqcloud.com