在我看来,Xcode 的本地化功能是最糟糕的之一...
我真的不喜欢为 Android 开发,但我必须承认 Android Studio 有一个更好的本地化系统。
话虽如此,因为我真的无法忍受每次修改后都要重新创建 Storyboard.strings(你知道,Xcode 不会自动更新它们...),这就是我的做法:
我有几个扩展来循环子视图(和子视图的子视图),并通过一个简单的帮助程序(AltoUtil.ls)处理每个主对象(标签、文本框、按钮...)的本地化主要属性(文本、占位符...),它是 NSLocalizedString 的“简短”版本。
然后,我在我的 storyboard/xib 中插入带下划线的文本和占位符(例如“_first_name”、“_email_address”),并将这些字符串添加到每个 Localizable.strings 文件中。
现在,我只需要在 viewDidLoad 中调用 localize() 函数(或者我需要它的任何地方),这样我就可以将整个视图控制器本地化。对于单元格,例如,在 awakeFromNib() 方法中调用 localize()。
我相信这不是最快的方法(由于子视图循环),但与我以前使用的其他方法相比,我没有任何减速,并且非常高效。
import UIKit
extension UIView {
func localize()
{
for view in self.allSubviews()
{
if let label = view as? UILabel
{
label.text = AltoUtil.ls(label.text)
}
else if let textField = view as? UITextField
{
textField.text = AltoUtil.ls(textField.text)
textField.placeholder = AltoUtil.ls(textField.placeholder)
}
else if let button = view as? UIButton
{
button.setTitle(AltoUtil.ls(button.title(for: UIControl.State.normal)), for: UIControl.State.normal)
}
else if let searchBar = view as? UISearchBar
{
searchBar.placeholder = AltoUtil.ls(searchBar.placeholder)
}
}
}
func allSubviews() -> [UIView]
{
return subviews + subviews.flatMap { $0.allSubviews() }
}
}
第二个扩展是为了本地化视图控制器的标题和选项卡栏中的项目。您可以添加任何需要本地化的项目。
import UIKit
extension UIViewController {
func localize()
{
self.title = AltoUtil.ls(self.navigationItem.title)
self.tabBarItem?.title = AltoUtil.ls(self.tabBarItem?.title)
self.view.localize()
}
}