恕我直言,Xcode 拥有最糟糕的本地化功能之一......
我真的不喜欢为 Android 开发,但我必须承认 Android Studio 有更好的本地化系统。
也就是说,因为我真的无法忍受在每个 mod 之后重新创建 Storyboard.strings(你知道,Xcode 不会为你更新它们......),我就是这样做的:
我对循环子视图(和子视图的子视图)有几个扩展,我通过本地化它们的主要属性(文本、占位符...)来处理每个主要对象(标签、文本字段、按钮...)通过一个简单的助手(AltoUtil.ls),它是 NSLocalizedString 的“短”版本。
然后我在我的故事板/xibs 中插入带有下划线的文本和占位符(例如“_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()
}
}