IMHO Xcode имеет одну из худших функций локализации, доступных ...
Мне действительно не нравится разрабатывать для Android, но я должен признать, что Android Studio имеет лучшую систему локализации.
Тем не менее, потому что я действительно не могу больше воссоздавать Storyboard.strings после каждого мода (вы знаете, Xcode не будет обновлять их для вас ...), вот как я делаю:
У меня есть парарасширений для циклов подпредставлений (и подпредставлений подпредставлений), и я имею дело с каждым из основных объектов (надписи, текстовое поле, кнопки ...), локализуя их основные свойства (текст, заполнить ...) с помощью простого помощника (AltoUtil.ls), которая является «короткой» версией для NSLocalizedString.
Затем я вставляю тексты и заполнители с подчеркиванием (например, «_first_name», «_email_address») в свою раскадровку / xibs и добавляю эти строки в каждый Localizable.strings file.
Теперь мне просто нужно вызвать функцию localize () в viewDidLoad (или где мне это нужно), такчто я могу иметь весь контроллер представления локализованным.Для ячеек я просто вызываю localize () внутри метода awakeFromNib (), например.
Я уверен, что это не самый быстрый метод (из-за цикла subviews), но я не получаю никакого замедления по сравнению сдругие методы, которые я использовал, и это довольно продуктивно.
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()
}
}